gpt4 book ai didi

makefile - "How make file is read"的示例

转载 作者:行者123 更新时间:2023-12-04 01:00:49 26 4
gpt4 key购买 nike

在 GNU-Make 手册中 make 如何读取 Makefile https://www.gnu.org/software/make/manual/make.html#Reading-Makefiles部分说

GNU make 的工作分为两个不同的阶段。在第一阶段,它读取所有生成文件、包含的生成文件等,并将所有变量及其值、隐式和显式规则内化,并构建所有目标及其先决条件的依赖关系图。在第二阶段,make 使用这些内部结构来确定需要重建哪些目标并调用这样做所需的规则。

我无法清楚地理解两个阶段的黑白差异。可能看一个例子会有助于理解。是否有任何链接或教程可以说明第一阶段和第二阶段究竟发生了什么。

最佳答案

拿这个简单的makefile:

var := some_other_file

some_file: $(var)
some_command $^ $@

第一阶段后,文件将如下所示
var := some_other_file

some_file: some_other_file
some_command $^ $@

注意如何 $^$@尚未扩展,配方仅作为阶段 2 的一部分进行扩展和调用。

在第 2 阶段,make 将使用第 1 阶段产生的规则并确定哪些目标需要重新制作,您可以通过使用 -d 运行 make 来了解 make 如何“思考”。标志(警告:大量输出)。

在上述案例的第 2 阶段,在检查了所有 some_other_file 之后的依赖项并在必要时重新制作,然后考虑是否 some_other_file较新 some_file .

如果是这种情况,则(并且仅在那时)扩展配方的变量,并将每一行的内容传递给 shell 程序,此处为 some_command some_other_file some_file .

因此,您不能使用 $@等任何地方,除了作为配方的一部分,因为自动变量仅在第 2 阶段设置。
foo: $@bar
some_command $^

这将在第一阶段扩展为:
foo: bar
some_command $^

在第 2 阶段将导致:
foo: bar
some_command bar

可能不是你想要的。

有些制造商有解决此限制的方法。例如 GNU make 有 .SECONDEXPANSION ,以下将按预期工作:
.SECONDEXPANSION:
foo: $$@bar
some_command $^
.SECONDEXPANSION 之后的任何内容将在第一阶段扩展:
.SECONDEXPANSION:
foo: $@bar
some_command $^

和第 2 阶段:
.SECONDEXPANSION:
foo: foobar
some_command foobar

关于makefile - "How make file is read"的示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28293048/

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