"make"는 크게 Target, Depend, Command, Macro 로 구성되어 있습니다. 우선 기본적으로 Target, Depend, Command 의 구성을 살펴보겠습니다.
<Target>: <Depend> ?... [[;] <Command>]
<탭문자><Command>
여기서 "Target"은 생성하고자 하는 목적물을 지칭하며 Depend 는 Target을 만들기 위해서 필요한 요소를 기술하게 됩니다. 그리고 Command 는 일반 Shell 명령이 옵니다. 이때 Command는 Depend 의 파일생성시간(또는 변경된 시간)을 Target과 비교하여 Target 보다 Depend의 파일이 시간이 보다 최근인 경우로 판단될때에만 실행됩니다. 물론 이것에 대한 예외적인 규칙이 있습니다만 일단 무시하고 받아들이세요. 이제 간단히 다음과 같이 "Makefile" 이라는 파일명으로 다음과 같이 작성하여 "make"의 행동을 기술합니다. 단, 주의할것은 Command 는 반드시 앞에 <TAB>문자가 와야 합니다. 물론 예외상황이 있기는 하지만 나중에 그에 대한 내용을 다루기로 하고 일단 ld, cc 명령 앞에 반드시 <TAB>문자로 입력하세요.
test: test.o
ld -lc -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 -o test /usr/lib/crt1.o /usr/lib/crti.o /usr/lib/crtn.o test.o
test.o: test.c
cc -O2 -Wall -Werror -fomit-frame-pointer -c -o test.o test.c
이제 명령프롬프트상에서 "make test" 라고만 입력하면 다음과 같이 실행됩니다.
bash# make test
cc -O2 -Wall -Werror -fomit-frame-pointer -c -o test.o test.c
ld -lc -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 -o test /usr/lib/crt1.o /usr/lib/crti.o /usr/lib/crtn.o test.o
bash# _
엇? 그런데 다시 실행해보시면 놀랍게도 이런 메세지가 나올겁니다. 이것이 바로 "make" 의 중요한 기능중에 한가지 입니다. 바로 똑같은 작업은 다시 해봤자 어차피 결과가 같을것이라는 예상때문에 더이상 같은 작업을 하지 않는 것이지요.
bash# make test
make: `test'는 이미 갱신되었습니다.
bash# _
그러면 간단히 다음과 같이 "test.c" 의 변경날짜를 바꿔봅시다. 그리고 다시 한번 "make test"명령을 수행해봅시다. 어떻습니까? 이번에는 다시 명령을 수행하는것을 보실수 있을겁니다.
bash# touch test.c
bash# make test
cc -O2 -Wall -Werror -fomit-frame-pointer -c -o test.o test.c
ld -lc -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 -o test /usr/lib/crt1.o /usr/lib/crti.o /usr/lib/crtn.o test.o
bash# _
이제 천천히 분석해보자면 Target 보다 Depend의 변경시간이 최근이라면 Command 를 수행한다고 하였습니다. 그래서 "test" 라는 Target이 "test.o" 에 의존관계를 갖고 있는데 "test.o"는 다시 Target으로 기술되어 있고 여기에 "test.c"가 의존관계로 기술되어 있습니다. 때문에 "test.c"가 최근에 변경되어 "test.o"보다 변경된 날짜가 최근이 되면 "test.o"를 새로 생성하게 됩니다. 또한 "test.o"는 "test"보다 최근에 변경된것으로 보이므로 "test"는 "test.o"에 의해서 새로 생성되는 결과를 가져옵니다. 결국 소스가 변경되지 않으면 "make"는 아무것도 안하지만 소스가 변경되면(변경된 날짜가 갱신되면) "test"는 새롭게 빌드되는 것입니다. 이제 대충 의존관계 성립을 어떻게 기술하는지 보았습니다. 하지만 이렇게 작성하면 오히려 더 불편하다고 불만을 토하는 분들이 속출할것입니다. 그렇습니다. 실제로는 저렇게 작성하는 경우는 별로 쓰이지 않습니다. 조금더 세련되게 작성하도록 Macro 의 사용이 준비되어 있으니 불만은 이제 그만 하세요.