Makefile 生成文件中的执行顺序

Makefile 生成文件中的执行顺序,makefile,Makefile,我有一个文件a,想从中创建一个文件B,在生成过程中替换相同的变量。 变量名存储在vars中 最小生成文件如下所示: 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)) blabla var1 blabla blabla var2 blabl

我有一个文件
a
,想从中创建一个文件
B
,在生成过程中替换相同的变量。 变量名存储在
vars

最小生成文件如下所示:

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))
blabla var1 blabla
blabla var2 blabla
blabla var3 blabla
文件A如下所示:

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))
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
copy语句在foreach之后执行!我可以通过设置一个单独的目标来纠正这一点,比如说
copy
,只将copy命令放在其中,并使
默认值取决于
copy

但是为什么???为什么规则中的执行顺序不严格

我错过了什么

附言:

$(shell)
是一个make函数。它在生成时执行(在本例中为配方扩展时)。这发生在执行配方之前

$(foreach)
也发生在那时

您根本不想在这里使用
$(shell)
。您希望
$(foreach)
输出单个(长)shell配方行,make可以正常执行。(确保使用
终止输出命令以使其合法。)


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

目前还不能真正解释它,但是使用函数的传统方法,如
$(foreach…
是设置变量,而不是像您那样在recipees中设置变量。不确定这是否得到了任何支持。正在尝试查找相关文档。抱歉,找不到有关此内容的章节。但是make文档中的所有示例都只在变量定义中使用函数,而不在recipees中使用函数。@DevSolar:是的,我拍了一张照片,它成功了。。。也许,
$(foreach…
习惯用法创建了不同的进程/线程,并且没有等待?事实上,我有过等待,但没有最后的
。不是那样工作的,是现在工作的!是的,没有
您的shell会看到一个巨大的命令,它通常不是您想要的(但如果您将参数列表放在一起,则可能是)。