作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在 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 的一部分进行扩展和调用。
-d
运行 make 来了解 make 如何“思考”。标志(警告:大量输出)。
some_other_file
之后的依赖项并在必要时重新制作,然后考虑是否
some_other_file
较新
some_file
.
some_command some_other_file some_file
.
$@
等任何地方,除了作为配方的一部分,因为自动变量仅在第 2 阶段设置。
foo: $@bar
some_command $^
foo: bar
some_command $^
foo: bar
some_command bar
.SECONDEXPANSION
,以下将按预期工作:
.SECONDEXPANSION:
foo: $$@bar
some_command $^
.SECONDEXPANSION
之后的任何内容将在第一阶段扩展:
.SECONDEXPANSION:
foo: $@bar
some_command $^
.SECONDEXPANSION:
foo: foobar
some_command foobar
关于makefile - "How make file is read"的示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28293048/
我是一名优秀的程序员,十分优秀!