내장 규칙들은 파일 이름의 접미어(suffix)와 확장자를 기초로 적용된다.
특정한 접미어가 붙은 파일을 지정하면 make는 그에 해당하는 다른 접미어를 가진 파일을 생성한다.
대표적인 예는 .c와 .o 이다.
make는 이름에 .c가 붙은 파일을 컴파일해서 .o 파일을 만들어 낸다
이러한 접미어 기반 규칙을 사용자가 새로 만드는 것도 가능하다
이러한 경우 .cpp 파일로부터 목적 파일을 생성하는 새로운 접미어 규칙을 make에게 알려주는 것이다.
프로젝트에 소스 파일들이 많다고 할 때 이러한 접미어 규칙을 이용하면 Makefile이 훨씬 간결해지며, 또한 프로젝트에서 새 소스 파일을 추가하는 작업도 훨씬 쉬워진다.
Makefile에서 새 접미어 규칙을 추가할 때에는 두 가지 일을 해주어야 한다.
.SUFFIXES 명령으로 새 접미어를 등록하고
다음과 같은 형태의 대상에 실제 규칙을 지정해 주는 것이다.
.<기존 접미어> .<새 접미어> :
이러면 make는 접미어가 <기존 접미어>인 파일에 해당 규칙을 적용해서 이름이 같고 접미어가 <새 접미어>인 파일을 생성한다.
다음은 .cpp파일을 .o 파일로 컴파일하는 접미어 규칙이다
.SUFFIXES: .cpp
.cpp.o:
$(CC) -xc++ $(CFLAGS) -I$(INCLUDE) -c $<
여기서 .cpp.o: 라는 의존성 정의는 접미어가 .cpp인 파일을
그 아래의 규칙을 이용해서 .o 파일로 변환하라고
make에게 알려주는 역할을 한다
이런 형태의 의존성에 대한 규칙에서는 파일 이름을 명시적으로 지정할 수 없으므로 특별한 매크로들이 필요하다. 위의 규칙에서 $<을 볼 수 있을텐데,
이는 원본 파일(기존 접미어를 가진 파일)의 이름으로 확장된다.
참고로 -xc++ 플래그는 gcc에게 이것이 C++ 소스 파일임을 알려주는 역할을 한다.
한 가지 주목할 것은 C++ 소스 파일들에 대해 단지 .cpp에서 .o 파일로의 규칙만 정의하면 된다는 점이다.
.o 파일들을 이진 실행 파일로 만드는 방법은 make가 이미 알고 있다.
이제 make를 실행하면 make는 위의 새 규칙을 이용해서 bar.cpp를 bar.o를 만들어내고, 그런 다음 자신의 내장 규칙들을 이용해서 .o로부터 실행 파일을 만들어 낸다.
요즘의 make는 .cpp 확장자를 가진 C++ 소스 파일을 다루는 방법을 알고 있지만, 이런 접미어 규칙을 이용하면 한 종류의 파일을 다른 종류의 파일로 변환할 때 일이 아주 편해진다.
좀 더 최근 버전의 make는 이러한 접미어 기반 변환이나 기타 여러가지 작업을 가능하게 하는 좀 더 유연한 구문을 지원한다. 예를 들어 특수 문자 %를 이용하면 파일 확장자에만 의존하는 것이 아니라 좀 더 일반적인 파일 이름 패턴 부합 기능에 의존해서 변환을 수행하는 의존성 정의를 만드는 것이 가능하다.
다음은 앞에 나온 .cpp 접미어 규칙을 패턴 규칙을 이용해서 표현한 것이다.
%.cpp: %o
$(CC) -xc++ $(CFLAGS) -I$(INCLUDE) -c $<