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