makefile
Правила шаблона GNU
Поиск…
Основное правило шаблона
Правило шаблона указывается единственным символом %
в целевом объекте. %
Соответствует непустой строке, называемой стебелькой . Затем ствол заменяется на каждый %
который появляется в списке предварительных условий.
Например, это правило:
%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
Будет соответствовать любой цели, заканчивающейся на .o
. Если целью был foo.o
, то стебель был бы foo
и он скомпилировал foo.c
в foo.o
Цели и предварительные условия могут быть доступны с использованием автоматических переменных.
Цели, соответствующие нескольким правилам шаблонов
Если цель соответствует нескольким правилам шаблона, make будет использовать тот, чьи предпосылки существуют или могут быть созданы. Например:
%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
%.o: %.s
$(AS) $(ASFLAGS) $< -o $@
Будет компилировать foo.c
в foo.o
или собрать foo.s
в foo.o
, в зависимости от того, какой из foo.c
или foo.s
существует.
Если у нескольких правил есть предпосылки, которые существуют или могут быть созданы, make будет использовать правило, соответствующее кратчайшему. Например:
f%r:
@echo Stem is: $*
fo%r:
@echo Stem is: $*
Будет использовать второе правило для создания целевого foo.bar
, эхом Stem is: o.ba
Если несколько правил соответствуют кратчайшему, make будет использовать первый в Makefile.
Каталоги в шаблонных правилах
Если целевой шаблон не содержит косой черты, make будет удалять часть каталога из цели, которую она пытается создать перед сопоставлением. Затем каталог будет помещен перед стеблем. Когда шток используется для создания целевого имени и предпосылок, часть каталога удаляется от него, стебля подставляются вместо %
и , наконец , каталога помещается в передней части строки. Например:
foo%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
Будет соответствовать lib/foobar.o
, с:
- Стебель (
$*
):lib/bar
- Целевое имя (
$@
):lib/foobar.o
- Предпосылки (
$<
,$^
):lib/foobar.c
В этом примере правило lib/foo%.o
будет иметь приоритет над правилом foo%.o
поскольку оно соответствует более короткому стеблю.
Правила шаблонов с несколькими целями
Правила шаблонов могут иметь несколько целей, но, в отличие от обычных правил, рецепт отвечает за создание всех целей. Например:
debug/%.o release/%.o: %.c
$(CC) $(CFLAGS_DEBUG) -c $< -o debug/$*.o
$(CC) $(CFLAGS_RELEASE) -c $< -o release/$*.o
Является допустимым правилом, которое будет создавать как объекты отладки, так и выпуска, когда один из них должен быть построен. Если бы мы писали что-то вроде:
debug/%.o release/%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
Он будет работать, когда будет создан только один из debug/*.o
или release/*.o
, но он будет только строить первую цель (и учитывать, что вторая является актуальной), когда оба должны быть построены.