2. make
컴파일트리를 파일로 만들어 저장하고 이 파일에 대해 "make" 명령을 내리면 이 파일의 최종 타겟 (예: myprog)을 최소한의 파일들만 재컴파일하여 만들어준다. myprog에 대한 컴파일 트리를 make 언어로 표현하면
myprog : x.o y.o
<tab> cc x.o y.o -o myprog x.o : x.c x.h
<tab> cc -c x.c y.o : y.c x.h
<tab> cc -c y.c
위 make 파일에서 <tab> 은 키보드의 <tab>키를 의미한다. rule을 입력할 때 명령문 앞에 탭을 입력해야 한다는 것을 보여주고 있다.
3. rule
make 파일은 rule 의 나열이며 각 rule은
target : components ; 의존리스트
<tab> 명령문 ; 명령리스트
의 형태를 갖는다. 의미는 "target"은 "components"에 표시된 파일들로부터 만들어지며 실제 만들때는 "명령문“을 수행하면 된다는 뜻이다.
myprog : x.o y.o
<tab> cc x.o y.o -o myprog
예를 들어 위 규칙은 myprog를 만들기 위해서는 x.o, y.o 두 파일이 필요하며 만드는 방법 은 "cc x.o y.o -o myprog"를 실행하면 된다는 것이다. 앞에 나온 컴파일트리를 그대로 말 로 표현했다는 것을 알 수 있다.
4. 작동
$make 혹은 $make myprog 했을 때 실제로 벌어지는 일은 아래의 4 스텝이다.
1) 현 디렉토리에서 “Makefile"이라는 이름의 파일을 찾든가 없으면 "makefile"이라는 파일을 찾는다.
2) 타겟이 지정이 안된 경우는 ($make 한 경우) 그 파일의 첫번째 타겟을 최종타겟으로 한 다. 지정되어 있으면 ($make myprog 한 경우) 그 타겟이 최종타겟이다. 위 예에서는 두 경 우 모두 최종타겟이 myprog가 된다.
3) 최종타겟의 components에 나와있는 모든 타겟에 대해 recursive 하게 update 한다.
update한다는 것은 위 경우 x.o, y.o 에 대해 관련파일들이 변경되었는지를 살펴보고 변경되 었으면 지정된 명령어를 실행하여 새로운 x.o, y.o를 만드는 것을 의미한다.
4) components중 하나라도 update가 되었으면 최종타겟을 지정된 명령어를 사용하여 다시 만든다. 즉 최종타겟을 update한다.
myprog make 파일에 대해 make 명령을 내렸을 때 일어나는 사건을 정리해보면 아래와 같 다:
make |
update myprog |
update x.o |
x.c 나 x.h가 변경되었는지 확인.
변경되었으면 cc -c x.c 실행 |
update y.o |
y.c나 y.h가 변경되었는지 확인 변경되었으면 cc -c y.c 실행 |
x.o나 y.o 가 변경되었으면 cc x.o y.o -o myprog 실행
x.c 가 변경되었다면 cc -c x.c 와 cc x.o y.o -o myprog 두 명령어만 실행되어 myprog 를 재컴파일한다는 것을 확인할 수 있다.
5. 매크로, 특수기호(@, $@, $<, $?, $*)
make 파일의 작성을 돕기 위해 매크로와 특수기호들이 사용된다.
1) 매크로
make 파일에 매크로를 정의하여 사용할 수 있다. 예를 들어 아래에서 OBJS가 x.o 와 y.o를 의미하는 매크로로 정의되었다. 매크로의 값은 ${..} 혹은 $(...)와 같이 접근할 수 있다.
OBJS = x.o y.o myprog : ${OBJS}
위는
myprog : x.o y.o 와 동일하다.
2) 특수기호
@ : 명령어앞에 붙여서 이 명령어의 에코 방지
$@ : 타겟이름을 의미한다.
myprog : x.o y.o
cc x.o y.o -o $@
는
myprog : x.o y.o
cc x.o y.o -o myprog 와 동일하다.
$< : components 에 있는 이름들을 의미한다.
$? : 변경된 components 들을 의미한다.
$* : 타겟과 component의 공통 base name. 예를 들어 타겟이 xyz.o 이고 componene가 xyz.c 이면 $* 는 xyz.