5
目前,我正面临着一个由我的Makefile引起的问题,它是由一个make变量的评估引起的。我减少了复杂性,只剩下产生问题的基本要素。在读取Makefile文件时Makefile可变扩展/评估
- $(LIST)作为文件列表进行评估。
- 在步骤1其中一个文件被删除。
- 当使用步骤2中的变量时,它不再被评估,因此不再有效,从而导致复制命令期间发生错误。
- 如果变量在使用时被评估,这里会很好,这里是第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
这工作的原因是字符串“SRC/*。TXT”被逐字放入'echo'和'cp'命令,其中所述壳再次展开为每个命令(而不是'make' ,它扩展了$(通配符)')。 – 2012-01-27 20:06:53
因为变量在调用配方时被扩展(它使用“=”作为延迟扩展而不是“:=”用于立即或简单的扩展),你会期望原始的makefile起作用。问题在于:为了提高效率,GNU将缓存作为目录的内容。因此,如果您以某种无法识别的方式对目录结构进行更改,则可能会遇到这样的情况,即让make了解存在的文件与现实不符。 – MadScientist 2012-01-28 16:42:01