Какое правило отложенной оценки makefile управляет этим поведением?

#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/*) расширение пустое.