gpt4 book ai didi

makefile - Makefile 中的执行顺序

转载 作者:行者123 更新时间:2023-12-01 09:53:32 30 4
gpt4 key购买 nike

我有一个文件 A 并想从中创建一个文件 B,在生成过程中替换相同的变量。变量名称存储在 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

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

我错过了什么?

附言:

$ make --version
GNU Make 4.0
Built for x86_64-pc-linux-gnu

最佳答案

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

$(foreach) 也在那个时候发生。

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

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

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

关于makefile - Makefile 中的执行顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33262326/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com