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会看到一个巨大的命令,它通常不是您想要的(但如果您将参数列表放在一起,则可能是)。