#makefile #gnu-make
#makefile #gnu-make
Вопрос:
Я пытаюсь создать переменную makefile для содержимого каталога после того, как этот каталог был обновлен с помощью рецепта.
Почему это не работает:
A_FILE = $(wildcard subdir/*)
all: a
@echo $(A_FILE)
a:
@mkdir ./subdir
@touch subdir/b
@touch a
$ rm -rf ./subdir amp;amp; make
$
… в то время как это делает:
A_FILE = $(wildcard subdir/*)
all: a
@echo $(A_FILE)
a: subdir/b
@touch a
subdir/b:
@mkdir ./subdir
@touch subdir/b
$ rm -rf ./subdir amp;amp; make
subdir/b
$
?
Я думал, что ленивая оценка означает, что переменная не вычислялась до фактического использования. В обеих версиях $(A_FILE)
используется в одном и том же рецепте и после оценки предварительного запроса. На самом деле, я бы с трудом сформулировал значимую разницу между двумя правилами, кроме поверхностного: первое — это цепочка из двух правил / предварительных условий, а второе — цепочка из трех.
Ответ №1:
Вам также необходимо удалить a
:
$ rm -rf ./subdir a amp;amp; make
Поскольку вы удалили subdir
, но не a
удалили, a:
правило не запускается. Выполняется только это правило:
all: a @echo $(A_FILE)
И поскольку subdir
оно не было создано, $(wildcard subdir/*)
расширение пустое.