Традиционные реализации make поддерживают так называемую ``суффиксную'' форму
записи шаблонных правил:
.<расширение_файлов_зависимостей>.<расширение_файлов_целей>:
<команда_1>
<команда_2>
...
<команда_n>
Например, следующее правило гласит, что все файлы с расширением "o"
зависят от соответствующих файлов с расширением "cpp":
.cpp.o:
gcc -c $^
Обратите внимание на использование автоматической переменной $^
для
передачи компилятору имени файла-зависимости. Поскольку шаблонное правило может
применяться к разным файлам, использование автоматических переменных -
единственный способ узнать, для каких файлов сейчас задействуется правило.
Шаблонные правила позволяют упростить make-файл и сделать его более универсальным.
В самом первом примере все правила компиляции для получения файлов типа .o
имеют одинаковую форму. Очень неудобно повторять их снова и снова; это может
привести к ошибке при написании make-файла. Поэтому gmake
можно указать -
для известных стандартных случаев - действия и имена файлов по умолчанию для
создания различных типов файлов. Для наших целей наиболее важным является то,
что gmake
известно, как создать файл F.o
из исходного файла F.cc
.
В данном случае gmake
автоматически
использует правило
F.o : F.cc
которое вызывается, чтобы создать
$(CXX) -c -Wall $(CXXFLAGS) F.cc,
F.o
, если существует файл C++ с именем
F.cc
, но не определяет точные действия для создания F.o
. Использование
префикса ``CXX''
является следствием соглашения об именах для переменных,
связанных с C++. Также создается команда
F : F.o
чтобы сообщить, как создать исполняемый файл
$(CC) $(LDFLAGS) F.o $(LOADLIBES) -o F,
F
из F.o
.
В результате предыдущий пример можно переписать следующим образом:
SRCS = edit.cc kbd.cc commands.cc display.cc
OBJS = $(SRCS:.cc=.o)
edit : $(OBJS)
Makefile for simple editor
insert.cc search.cc files.cc utils.cc
CC = gcc
CXX = gcc
CXXFLAGS = -g
LOADLIBES = -lg++
edit.o : defs.h
kbd.o : defs.h command.h
commands.o : defs.h command.h
display.o : defs.h buffer.h
insert.o : defs.h buffer.h
search.o : defs.h buffer.h
files.o : defs.h buffer.h command.h
utils.o : defs.h