Вы врете сделать . Не делайте этого.
Как только вы запустите рецепт правила, make проверяет, действительно ли файл был обновлен по рецепту. Если он не изменился, вам не нужно заново создавать цель, в которой файл указан как зависимость.
Здесь вы не указали рецепт для multioutput1.txt
, только строка зависимости:
multioutput1.txt: multioutput.stamp
Make знает, что нет способа обновить multioutput1.txt
.
Дешевое исправление
Force make для проверки зависимостипредоставив явный рецепт для multioutput1.txt
. Подойдет даже пустой:
${FILES}: multioutput.stamp ;
Да, вот что означает ;
- первая строка рецепта следует за той же строкой.
Лучшее исправление
Единственный способ сказать, что «этот рецепт создает два файла» - это использовать шаблонное правило. Тогда нет необходимости в multioutput.stamp
.
.PHONY: all
all: data.txt
%1.txt %2.txt:
touch $*1.txt
touch $*2.txt
data.txt: multioutput1.txt multioutput2.txt
touch data.txt
Здесь $*
в рецепте расширяется до того, что %
соответствует строке зависимости.
Почему я сделалdata.txt
зависит от обоих файлов multioutput ? Здесь я придерживался мнения, что если отсутствует либо multioutput1
, либо multioutput2
, нам, вероятно, следует запустить рецепт для создания обоих. YMMV.
Best Fix
YMMV, но мне не нравятся правила шаблонов. Они слишком произвольны для моих вкусов.
Мы видим, что один из multioutput1.txt
и multioutput2.txt
всегда будет моложе другого. Они никогда не будут иметь одинаковую временную метку, если принять во внимание современную файловую систему.
.PHONY: all
all: data.txt
multioutput2.txt: start.stamp
touch $@
touch multioutput2.txt
multioutput1.txt: multioutput2.txt ;
data.txt: multioutput1.txt
touch data.txt