我有一个文件A,想要从中创建一个文件B,在make过程中替换相同的变量.变量名存储在vars.
最小的Makefile如下所示:
vars = var1 var2 var3
var1 = AAA
var2 = BBB
var3 = CCC
default:
    cp A B
    $(foreach var,$(vars),$(shell sed -i "s/$(var)/\"$(value $(var))\"/g" B))
文件A看起来像这样:
blabla var1 blabla
blabla var2 blabla
blabla var3 blabla
当我执行时make,我得到输出
sed: can't read B: No such file or directory
sed: can't read B: No such file or directory
sed: can't read B: No such file or directory
cp A B
复制语句执行后的foreach!我可以通过设置一个单独的目标来纠正这个问题,比如说copy,只将复制命令放在那里然后default依赖copy.
但为什么???为什么规则内的执行顺序不严格?
我错过了什么?
PS:
$ make --version
GNU Make 4.0
Built for x86_64-pc-linux-gnu
$(shell)是一个make函数.它在make时执行(在这种情况下是在配方扩展时).这在配方执行之前发生.
在$(foreach)那个时候还发生了.
你根本就不想要$(shell)这里.您希望$(foreach)输出一个可以正常执行的单个(长)shell配方行.(确保使用a终止输出命令;以使其合法化.)
default:
    cp A B
    $(foreach var,$(vars),sed -i 's/$(var)/"$(value $(var))"/g' B;)
我也切换到单引号以避免需要转义,因为shell中没有任何东西需要扩展.make在这里完成所有变量扩展.