You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
make - GNU make utility to maintain groups of programs
The purpose of the make utility is to determine automatically which pieces of a large program need to be recompiled, and issue the commands to recompile them.
GNU make는 보통 GNUmakefile, Makefile, makefile 중에서 하나가 있으면 그 파일을 읽게 된다. 하지만 일반적으로 Makefile을 추천하게 되는데, 그 이유는 우선 GNUmakefile은 기존의 make에서 인식을 못한다는 단점이 있고, makefile은 보통 소스 파일에 묻혀서 잘 안보이게 되기 때문이다.
Makefile 구조
Makefile은 기본적으로 아래와 같이 목표(target), 의존 관계(dependency), 명령(command)의 세개로 이루어진 기분적인 규칙(rule)들이 계속적으로 나열되어 있다고 봐도 무방하다. make가 지능적으로 파일을 갱신하는 것도 모두 이 간단한 규칙에 의하기 때문이다.
target ... : dependency ...
command
...
...
여기서 목표(target) 부분은 명령(command)이 수행이 되어서 나온 결과 파일을 지정한다. 당연히 목적 파일(object file)이나 실행 파일이 될 것이다. 명령(command)부분에 정의된 명령들은 의존 관계(depenency)부분에 정의된 파일의 내용이 바뀌었거나, 목표 부분에 해당하는 파일이 없을 때 이곳에 정의된 것들이 차례대로 실행이 된다. 일반적으로 쉘에서 쓸 수 있는 모든 명령어들을 사용할 수가 있으며 bash에 기반한 쉘 스크립트도 지원한다.
참고로 목표 부분에는 결과 파일만 올 수 있는 것이 아니고, 보통 make clean 에서와 같이 간단한 레이블(label) 기능을 제공하기도 한다.
명령 부분은 꼭 TAB 글자로 시작해야 한다. 그냥 빈칸 등을 사용하면 make 실행 중에 에러가 난다. make가 명령어인지 아닌지를 TAB 가지고 구별하기 때문이다.
Makefile 예제
예제 프로그램이 main.c read.c write.c로 구성되어 있고 모두 io.h라는 헤더 파일을 사용한다고 가정
Makefile 파일을 작성해 놓고, make 명령을 입력하게 되면 make는 Makefile의 내용을 살펴보다가 첫 번째 목표 파일에 해당되는 것을 실행함
따라서 위의 예제에서는 make test를 입력해도 make를 입력했을 때와 동일한 결과를 반환하며, 만약 clean에 해당하는 부분을 윗부분에 두게 되면 make는 항상 make clean을 수행함
내부 매크로
$* <- 확장자가 없는 현재의 목표 파일(Target)
$@ <- 현재의 목표 파일(Target)
$< <- 현재의 목표 파일(Target)보다 더 최근에 갱신된 파일 이름
$? <- 현재의 목표 파일(Target)보다 더 최근에 갱신된 파일이름
$<와 $?는 거의 같다고 봐도 무방함
main.o : main.c io.h
gcc -c $*.c
$*는 확장자가 없는 현재의 목표 파일이므로 $*는 결국 main에 해당함
test : $(OBJS)
gcc -o $@ $*.c
$@는 현재의 목표 파일, 즉 test에 해당함
.c.o :
gcc -c $< (또는 gcc -c $*.c)
$<는 현재의 목표 파일보다 더 최근에 갱신된 파일 이름이라고 설명하였는데, .o 파일보다 더 최근에 갱신된 .c 파일은 자동적으로 컴파일이 수행됨(예를 들어, main.o를 만들고 난 다음에 main.c를 갱신하게 되면, main.c는 $<의 작용에 의해 새롭게 컴파일 수행됨)
http://doc.kldp.org/KoreanDoc/html/GNU-Make/GNU-Make-4.html