Search
🌍

bb2.1. title: Makefile 은 그냥 타겟(Target), 의존성(Dependencies), 레시피(Recipe)로 빌드 규칙을 정의하여 증분 빌드(‣)가 가능하도록 하는 도구이다.

생성
🚀 prev note
🚀 next note
♻️ next note
bb2.1_1. title: Makefile의 타겟(Target) 자리에 install 같은 것을 넣어서 멋진 척 가오를 잡을 수 있다.
bb2.1__1. title: Makefile 을 사용하면 gcc 에서 자주 사용되는 c, o, W, I, D 와 같은 플래그들을 변수로 묶어 관리할 수 있다.
bb2.1___1. title: VSCode is just a kind of visualizer. When you want to debug C program with vscode, you should make a debuggable execution file with your own build system yourself, and let vscode know the execution file.
14 more properties
Makefile 에는 타겟(Target), 의존성(Dependencies), 레시피(Recipe)로 빌드 규칙을 정의한다. 진짜다. 이게 거의 90% 이다. 나머지는 보통 빌드 전후 처리를 어떻게 할 것인지를 나타내는 규칙이며 본질이 아니다(참고4).
<타겟>: <의존성> <레시피>
Makefile
복사
타겟은 보통 생성하고자 하는 파일의 이름이다. 의존성은 생성하고자 하는 파일을 만드는 데 필요한 파일이다. 이 파일이 타겟으로 정의되어 있다면 Makefile 이 이 부분을 인지하고 그래프를 만들거나 하지 않을까.
그림(참고1): 실제로 Makefile 이 그래프를 만드는지 아닌지는 모르겠지만, 의존관계를 정의한다는 것은 아래 그림처럼 상상해볼 수 있을 것이다.
레시피는 타겟이 의존하는 파일들과 관련된 명령을 모두 실행한 이후 실행할 명령이다. 의존성을 정의했고 특정 파일을 만드는 명령어를 다 적어 두었으니, 어떤 파일이 약간 변했을 때(미적분의 dxdx 가 생각난다. 이를 소스코드의 ‘증분’ 이라고 표현하는 듯하다) 이 파일과 관련된 파일들만 모조리 빌드해줄 수 있게 된다. 이를 증분 빌드(Incremental build)라고 한다. Makefile 이 가지는 강력한 기능이다(참고2).
app.out: foo.o bar.o gcc -o app.out foo.o bar.o bar.o: foo.c bar.c bar.h # 참고로, bar.h 는 bar.c 등에 의해 자동으로 호출되지만 # makefile 은 이를 자동으로 추적하지 못한다. # 그래서 거추장스럽지만 bar.h 를 이렇게 작성해 주어야 한다. gcc -c foo.c gcc -c bar.c ... 이하 생략
Makefile
복사
위와 같은 Makefile 을 실행하는 커맨드는 아래와 같다. 그냥 생성하고자 하는 파일의 이름을 적어 주는 것이다. 정말 자명하지 않은가!
make app.out
Bash
복사
또는 변경사항과 관련된 모든 파일들을 다시 생성하도록 다음 명령을 사용할수도 있겠다. 아래 명령이 동작하는 이유는, make 을 실행했을 때 첫 번째 타겟을 만들기를 시도하는데(참고3) 맨 위에 최종 결과물인 app.out 이 타겟이기 때문이다.
make
Bash
복사
parse me : 언젠가 이 글에 쓰이면 좋을 것 같은 재료들.
1.
None
from : 과거의 어떤 생각이 이 생각을 만들었는가?
1.
앞의 글에서는 Makefile을 시작으로 빌드 도구가 발전해 나가는 과정이 서술되어 있고, 이 글에는 Makefile 그 자체에 대해서 서술했다.
supplementary : 어떤 새로운 생각이 이 문서에 작성된 생각을 뒷받침하는가?
1.
None
opposite : 어떤 새로운 생각이 이 문서에 작성된 생각과 대조되는가?
1.
None
to : 이 문서에 작성된 생각이 어떤 생각으로 발전되고 이어지는가?
참고 : 레퍼런스