gcc는 .c
확장자의 파일을 보고나서, 그 파일이 C소스 파일인 것을 인식한다.
.abc
같은 확장자를 갖는 파일을 gcc가 C소스 파일로 인식하여 번역해주길 바라는 것은 무리다.또한 각각의 언어는 소스 파일에 암묵적으로 정해진 확장자를 갖고 있다.
.cpp
파일은 C++ 컴파일러를 호출하고, .java
파일은 java 컴파일러를 호출한다.이러한 확장자가 가지는 규칙에 기초하여, make는 사용자가 내리는 명령을 알아서 해석하여 컴파일 과정을 자동화 시킬 수 있다.
즉, 확장자 규칙이란 파일의 확장자를 보고, 자동으로 그에 걸맞는 명령을 수행하도록 미리 정의해 놓은 규칙이다.
make -p
명령으로 내부적으로 미리 정의되어 있는 확장자 규칙을 볼 수 있다.
OBJECTS = add.o sub.o main.o
all : calc
calc : $(OBJECTS)
$(CC) -o $@ $^
$@
와 $^
는 자동 매크로로, 각각 현재 타겟명과 종속 항목 리스트를 뜻한다.make
를 수행하면 다음과 같은 과정을 갖는다..o
인 내부 확장자 규칙을 이용해, 다음과 같은 기준으로 현재 디렉터리에서 add.o를 생성할 파일을 찾는다..c
, .cpp
, .S
, etc..SUFFIXES
를 사용한다..SUFFIXES
의 종속 항목은 확장자 규칙을 검사하는 데 사용되는 중요한 확장자들의 리스트다..SUFFIXES
의 종속 항목에 지정해야 한다..SUFFIXES: .확장자1 .확장자2
%.확장자1 : %.확장자2
명령어1
명령어2
.SUFFIXES: .o .c
%.o : %.c
$(CC) -DDEBUG -c -o $@ $<
.o
에 대응하는 .c
를 발견하면 $(CC) -DDEBUG -c -o $@ $<
명령을 수행한다.$<
는 확장자 규칙에서만 사용되는 자동 매크로다.$^
는 일반적인 타겟 생성 룰에서만 사용되는 자동 매크로다.$<
를 사용하지 않으면, 종속 항목을 지정할 방법이 없다!