Подстановочный знак Makefile (статическое правило?) С фальшивкой - PullRequest
4 голосов
/ 25 октября 2011

Я только начинаю по-настоящему впадать во внутреннюю работу make.Тем не менее, я не понимаю, почему следующее не работает:

test%: test%.foo
     @echo $@
     @echo $<

all: test1 test2

.PHONY: all test1 test2

Ожидаемое поведение:

$ make
test1
test1.foo
test2
test2.foo
# 1,2 Order not important

Однако я получаю:

$ make
make: Nothing to be done for `all'.

("make all "," make test1 "и т. д. без разницы).

Может кто-нибудь объяснить, почему не выполняются правила теста PHONY?

1 Ответ

7 голосов
/ 25 октября 2011

Выдержка из руководства по GNU make.

Так как он знает, что фальшивые цели не называют реальные файлы, которые быть переделанным из других файлов, make пропускает поиск неявного правила фальшивые цели (see section Использование неявных правил). Вот почему объявление целевого фальшива хорошо для производительности, даже если вы не беспокоюсь о фактическом существующем файле.

Это означает, что поскольку ваши цели test1 и test2 являются фальшивыми, make не ищет для них неявных правил. Даже если то, что вы используете, более точно названо шаблонными правилами , все шаблонные правила являются неявными правилами.

...