
make 내부적으로 미리 정의되어 있는 매크로가 존재한다.
make -p명령으로 확인 할 수 있다.
-p stands for print database몇가지 알아둬야 할 내부 매크로가 있는데, 다음과 같다.
| 매크로 | 설명 | default 값 |
|---|---|---|
| AS | 어셈블러 | as |
| CC | C 컴파일러 | cc |
| CFLAGS | C 컴파일러 플래그 |
내부적으로 정의되어 있지만, make -p명령어로 확인 할 수 없는 매크로가 존재한다.
이를 자동 매크로라고 한다.
자동 매크로를 사용하면, Makefile을 더 쉽고 간결하게 작성할 수 있어서 반드시 알아둘 필요가 있다.
다음은 자동 매크로 리스트다.
| 매크로 | 설명 |
|---|---|
| $? | (확장자 규칙에서 사용 불가) 현재 타겟보다 최근에 변경된 종속 항목 리스트 |
| $^ | (확장자 규칙에서 사용 불가) 현재 타겟의 종속 항목 리스트 |
| $@ | 현재 타겟명 |
| $% | 현재의 타깃이 라이브러리 일때, 오브젝트 파일에 대응되는 이름 |
| $< | (확장자 규칙에서만 사용 가능) 현재 타겟보다 최근에 변경된 종속 항목 리스트 |
| $* | (확장자 규칙에서만 사용 가능) 현재 타겟보다 최근에 변경된 현재 종속 항목의 이름 |
$<와 $*는 확장자 규칙용으로 나중에 설명한다.
$^와 $@$^와 $@는 꽤 중요하다.calc : add.o sub.o main.o
gcc -W -Wall -o calc add.o sub.o main.o
calc : add.o sub.o main.o
gcc -W -Wall -o $@ $^
@는 과녁같이 생겼기 때문에, 타겟으로 외우면 편하다.$(@F), $(@D), $(<F), $(<D)/temp/target.o : /usr/local/test.c
$(@F)를 사용하면, target.o로 치환된다.$(@D)를 사용하면, /temp로 치환된다.$(<F)를 사용하면, test.c로 치환된다.$(<D)를 사용하면, /usr/local로 치환된다.