#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: Нет! Все наоборот: файлы никогда не должны существовать. — Как только цели не являются фальшивыми, если они существуют, их временная метка будет сравниваться с временными метками зависимых. И если цели более поздние, сборка не будет выполнена. Это не то, что ожидается для фальшивой (но не объявленной как таковой) цели!