Подстановочный знак Makefile (статическое правило?) с фальшивым

#makefile #target

#makefile #цель

Вопрос:

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

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

lt;

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» и т. Д. Не Имеют значения).

Может кто-нибудь объяснить, почему ФАЛЬШИВЫЕ правила тестирования не выполняются?

Ответ №1:

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

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

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

Комментарии:

1. Ах, это последняя фраза «все шаблонные правила являются неявными правилами», которая для меня нова. Является ли канонический способ заставить make делать то, что я хочу в данном случае?

2. Создавать test1 и test2 не подделывать, например, путем добавления @touch $@ .

3. @reinierpost: наличие файлов actual и ничего не изменит test1 test2 . Они определены в Makefile как фальшивые, поэтому они являются фальшивыми, независимо от существующих файлов. Чтобы сделать их не фальшивыми, единственный способ — убрать их из .PHONY правила.

4. @Didier Trosset: Спасибо за исправление. Я хотел сказать, что если они не фальшивые, то неплохо бы их действительно создать.

5. @reinierpost: Нет! Все наоборот: файлы никогда не должны существовать. — Как только цели не являются фальшивыми, если они существуют, их временная метка будет сравниваться с временными метками зависимых. И если цели более поздние, сборка не будет выполнена. Это не то, что ожидается для фальшивой (но не объявленной как таковой) цели!