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
로 치환된다.