
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 $@ $<명령을 수행한다.$<는 확장자 규칙에서만 사용되는 자동 매크로다.$^는 일반적인 타겟 생성 룰에서만 사용되는 자동 매크로다.$<를 사용하지 않으면, 종속 항목을 지정할 방법이 없다!