我有一个文件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
答案 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在这里完成所有变量扩展。