Makefile变量扩展/评估

Hel*_*z42 5 makefile

目前我正面临一个由make变量评估引起的Makefile问题.我已经降低了复杂性,只留下产生问题的基本要素.

  • 读取Makefile时,$(LIST)被评估为文件列表.
  • 步骤 1中,删除其中一个文件.
  • 当使用可变第二步则不会再次,因此评价没有有效其复制命令过程中导致的错误的任何更多.
  • 如果在使用变量时对它进行评估会很好,这里是在步骤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
Run Code Online (Sandbox Code Playgroud)

执行记录:

$ 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
Run Code Online (Sandbox Code Playgroud)

Jon*_*ler 7

不要使用通配符函数.

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
Run Code Online (Sandbox Code Playgroud)

  • 因为变量在调用配方时被扩展(它使用"="表示延迟扩展而不是":="表示立即或简单扩展),你可以期望原始的makefile能够工作.这就是问题所在:为了提高效率,GNU会根据目录缓存目录的内容.因此,如果以make无法识别的方式对目录结构进行更改,则可以进入这些情况,其中make了解存在哪些文件与现实不匹配. (3认同)
  • 这样做的原因是字符串"src/*.txt"被逐字地放入`echo`和`cp`命令,其中shell为每个命令再次扩展它(而不是`make`,它做了扩展`$(通配符)`). (2认同)