Makefile

时间:2015-10-21 14:40:32

标签: makefile

我有一个文件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

1 个答案:

答案 0 :(得分:7)

$(shell)是一个 make 函数。它在 make 时执行(在这种情况下,在配方扩展时)。在执行配方之前会发生这种情况。

$(foreach)当时也发生了。

你根本不想要$(shell)。您希望$(foreach)输出一个可以正常执行的单个(长)shell配方行。 (确保使用;终止输出命令以使其合法化。)

default:
    cp A B
    $(foreach var,$(vars),sed -i 's/$(var)/"$(value $(var))"/g' B;)

我也切换到单引号以避免需要转义,因为该字符串中没有shell需要扩展的内容。 make在这里完成所有变量扩展。