$* <- 확장자가 없는 현재의 목표 파일(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는 $<의 작용에 의해 새롭게 컴파일이 된다.
$<와 $?의 차이는 파일들을 다 얘기하느냐 아니냐이다
sdltest_speed: sdltest_speed.o md.o
g++ $(LDFLAGS) -o $@ $<
일 때는
g++ `sdl-config --libs` -lSDL_image -o sdltest_speed sdltest_speed.o
가 실행되지만
sdltest_speed: sdltest_speed.o md.o
g++ $(LDFLAGS) -o $@ $?
일 때는
g++ `sdl-config --libs` -lSDL_image -o sdltest_speed sdltest_speed.o md.o
가 실행된다.
참고 http://kldp.org/KoreanDoc/html/GNU-Make/GNU-Make-3.html#ss3.2