Makefile变量扩展/求值

Makefile变量扩展/求值,makefile,Makefile,目前,由于对make变量的求值,我的Makefile面临一个问题。我降低了复杂性,只剩下产生问题的基本要素 $(列表)在读取Makefile时作为文件列表进行计算 在步骤1中,其中一个文件被删除 在步骤2中使用变量时,不会再次计算该变量,因此不再有效,从而导致copy命令期间出错 如果在使用变量时对其进行了评估,那就太好了,在步骤2中 如何解决或解决这个问题 Makefile: LIST=$(wildcard src/*.txt) all: step1 step2 step1:

目前,由于对make变量的求值,我的Makefile面临一个问题。我降低了复杂性,只剩下产生问题的基本要素

  • $(列表)在读取Makefile时作为文件列表进行计算
  • 在步骤1中,其中一个文件被删除
  • 在步骤2中使用变量时,不会再次计算该变量,因此不再有效,从而导致copy命令期间出错
  • 如果在使用变量时对其进行了评估,那就太好了,在步骤2中
如何解决或解决这个问题


Makefile:

LIST=$(wildcard src/*.txt)

all: step1 step2

step1:
    @echo "---------- step1 ----------"
    @echo $(LIST)
    rm src/q1.txt
    ls src

step2:
    @echo "---------- step2 ----------"
    @echo $(LIST)
    cp $(LIST) ./dst
$ make
---------- step1 ----------
src/q1.txt src/q2.txt
rm src/q1.txt
ls src
q2.txt
---------- step2 ----------
src/q1.txt src/q2.txt
cp src/q1.txt src/q2.txt ./dst
cp: cannot stat `src/q1.txt': No such file or directory
make: *** [step2] Error 1

执行日志记录:

LIST=$(wildcard src/*.txt)

all: step1 step2

step1:
    @echo "---------- step1 ----------"
    @echo $(LIST)
    rm src/q1.txt
    ls src

step2:
    @echo "---------- step2 ----------"
    @echo $(LIST)
    cp $(LIST) ./dst
$ make
---------- step1 ----------
src/q1.txt src/q2.txt
rm src/q1.txt
ls src
q2.txt
---------- step2 ----------
src/q1.txt src/q2.txt
cp src/q1.txt src/q2.txt ./dst
cp: cannot stat `src/q1.txt': No such file or directory
make: *** [step2] Error 1

不要使用通配符函数

LIST = src/*.txt

all: step1 step2

step1:
    @echo "---------- step1 ----------"
    @echo $(LIST)
    rm src/q1.txt
    ls src

step2:
    @echo "---------- step2 ----------"
    @echo $(LIST)
    cp $(LIST) ./dst

其工作原理是字符串“src/*.txt”被逐字放入
echo
cp
命令中,shell为每个命令再次展开它(而不是
make
,后者进行了
$(通配符)
)的展开)。因为变量在调用配方时展开(使用“=”对于延迟扩展,而不是“:=”对于立即扩展或简单扩展),您希望原始makefile能够工作。问题是:为了提高效率,GNU在运行时缓存目录的内容。因此,如果您以make无法识别的方式更改目录结构,您可能会遇到make对存在哪些文件的想法与实际情况不符的情况。