Вы хотите сделать некоторые файлы и закрепить их. Так или иначе, у вас есть , чтобы сообщить make
, что они собой представляют, или как выработать то, что они есть.
Правило шаблона не может этого сделать. Правило является правилом шаблона тогда и только тогда, когда имеет ровно один %
в своей целевой точке . См. 10.5 Defining and Redefining Pattern Rules. Так
%.o: %.c
$(CC) -c -o [email protected] $<
это шаблонное правило, и так
%.xyz: foobar
cp -f $< [email protected]
Они говорят, что если какая-то цель соответствует левой стороне% -wise с части сопоставления %
, то эта цель имеет предварительные условия, возникающие в результате замены %
на часть по всей правой стороне, , и рецепт для этой цели является рецептом в правиле шаблона.
Они не вам сказать, что все является цель, и так или иначе:
all: %.gz
не шаблонное правило, по определению. Без %
слева, это просто обычное правило , в котором говорится, что цель all
имеет необходимое условие: %.gz
.
В широком смысле у вас есть два способа позволяют make
знать некоторые список имен файлов, которые вы хотите его сделку с:
Назови их, например:
files = foo1 foo2 bar1 bar2 ...
Или сказать make
каким-то образом вычислить их, например
files = $(wildcard ...) # `make` globbing
files = $(shell ....) # shell filter
См 8.2 Functions for String Substitution and Analysis и 8.3 Functions for File Names для документирования make
сек встроенных ресурсов для вычисления списков имен файлов (или списков строк, в более общем случае).
После того, как вы выбрали путь make
определить вы хотите, созданных файлов и застегнул, затем вы можете сэкономить код шаблонного правила, например:
Makefile
zips := foo1.gz foo2.gz bar1.gz bar2.gz
.PHONY: all clean
all: $(zips)
@echo Done.
%.gz:
touch $(basename [email protected]) && gzip $(basename [email protected])
clean:
rm -f $(zips)