$ make [-f makeFileName]
보통 default로 makefile이라는 이름을 쓴다.
make
make는 서로 의존 관계가 있는 여러 파일로 이루어진 프로그램에서 효과를 볼 수 있음으로 다음과 같은 파일을 작성한다.
main_test.c는 fcun1.c와 func2.c.의 함수를 사용하고 모든 .c파일은 io.h를 include하는 프로그램이 있다고 하자.
① 소스파일 작성
io.h <파일 1> |
1: #ifndef __IO_H__ 2: #define __IO_H__ 3: #include <stdio.h> 4: #endif |
main_test.c <파일 2> |
1: #include "io.h" 2: 3: int main(void) 4: { 5: printf("main start..\n"); 6: func1(); 7: func2(); 8: printf("main end..\n");9: } |
func1.c <파일 3> |
1: #include "io.h" 2: 3: void func1(void) 4: { 5: printf("func1 start..\n"); 6: printf("func1 end..\n");7: } |
func2.c <파일 4> |
1: #include "io.h" 2: 3: void func2(void) 4: { 5: printf("func2 start..\n"); 6: printf("func2 end..\n");7: } |
② makefile 작성
makefile <makefile 작성> |
1: test : main_test.o func1.o func2.o 2: cc -o test main_test.o func1.o func2.o 3: main_test.o : io.h main_test.c 4: cc -c main_test.c 5: func1.o : io.h func1.c 6: cc -c func1.c 7: func2.o: io.h func2.c 8: cc -c func2.c |
컴파일을 할 명령의 시작 부분을 TAB으로 시작함을 주의한다.
③ make 실행
$ make
cc -c main_test.c
cc -c func1.c
cc -c func2.c
cc -o test main_test.o func1.o func2.o
make의 실행과정을 보면 makefile의 순서대로 컴파일하지 않음을 알 수 있다. 즉 make가 makefile에서 가장 먼저 실행하는 명령은 의존 관계 트리에서 가장 하위 대상에 속한 명령이 된다.
③의 가장 하위에 있는 main_test.c, func1.c, func2.c io.h는 의존되는 파일일 뿐 대상이 아니며, 가장 하위 대상인 ②의 main_test.o, func1.o, func2.o 이므로 여기에 속한 명령이 가장 먼저 실행된다. 또한 main_test.o, func1.o, func2.o는 test가 의존하는 파일이기도 하다.
생성된 test파일을 실행해 보자.
$ ./test
main start..
func1 start..
func1 end..
func2 start..
func2 end..
main end..
④ 특정 파일 수정
만약 어느 특정 파일이 수정되었다면 그 파일과 의존적인 관계가 있는 파일은 다시 컴파일 될 것이다.
$ touch func1.c
$ make
cc -c func1.c
cc -o test main_test.o func1.o func2.o
func1만 수정되었으므로 func1.o를 새로 생성하게 되면 test는 func1.o에 의존하므로 test도 새롭게 생성될 것이다.
만약 수정된 파일이 없는 상태에서 make를 실행하면 다음과 같이 make는 실행되지 않는다.
$ make
`test'은(는) 최신 것입니다.
⑤ 레이블 대상
make 파일의 대상에는 실행파일과 오브젝트 파일뿐만 아니라 사용자가 임의로 정한 레이블 이름이 올 수 있다. 레이블 이름은 실제 파일에 대응하지 않기 때문에 가짜 대상이라도 부르며, 이런 레이블 대상은 사용자가 원할 때 make 가 특정 명령을 실행하도록 하기 위함이다. 그리고 레이블 대상은 의존성을 갖지 않으므로 레이블을 만날 때마다 대상이 항상 최신으로 업데이트된 상태로 간주한다.
makefile <makefile 작성> |
1: test : main_test.o func1.o func2.o 2: cc -o test main_test.o func1.o func2.o 3: main_test.o : io.h main_test.c 4: cc -c main_test.c 5: func1.o : io.h func1.c 6: cc -c func1.c 7: func2.o: io.h func2.c 8: cc -c func2.c 9: clean : ------------------> 레이블 대상 10: rm main_test.o func1.o func2.o |
$ make clean -> 가짜 대상을 실행한다.(특정 대상만 실행한다)
rm main_test.o func1.o func2.o