gnu-make - GNU 做出奇怪的行为

标签 gnu-make

我有一个简单的 Makefile:

VAR := aaa
include a.inc
VAR += bbb

和a.inc

some_target: $(VAR)
        @echo "refer to automatic var $^"
        @echo "refer to VAR $(VAR)"

aaa:
bbb:

当我运行 make 时,我看到一个奇怪的打印:

refer to automatic var aaa
refer to VAR aaa bbb

似乎 GNU make 在包含时刻替换了先决条件中的 $(VAR),但在稍后的某个时刻替换了调试打印中的 $(VAR)。这是正确的行为吗?为什么 GNU 以如此不直观的方式做出行为?

最佳答案

这是正确的,而且并不不直观(尽管可能不是立即显而易见的)。

它的工作方式与其他语言中的变量相同。

尝试这个 shell 示例。

$ var=aaa
$ echo "${var}"
aaa
$ ev() { echo "${var}"; }
$ ev
aaa
$ var+=bbb
$ ev
aaabbb

您将获得变量在使用时存在的值。

make 中 tgt: prereq@recipe line 之间的区别在于计算行的时间。

GNU Make Manual3.7 How make Reads a Makefile 中对此进行了讨论。具体来说,对于这种情况,您需要最后一个子部分规则定义

关于gnu-make - GNU 做出奇怪的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28168843/

相关文章:

makefile - GNU make 只显示错误

makefile:隐式规则:相同目标不同先决条件

Makefile 文件将不同子文件夹中的源匹配到单个构建文件夹中

ubuntu - cd .. 在 Makefile 中没有 ONESHELL 的情况下工作

makefile - GNU Make 目标在 "up to date"之前构建了两次;为什么不在第一遍之后呢?

makefile 目标依赖项取决于目标名称

typescript - Makefile 编译所有 tsc 而不管更改

makefile - 检查 makefile 中路径是绝对路径还是相对路径的可移植方法

c - 在制作 ESP8266 项目时获取 C 函数的 undefined reference

makefile - GNU Make 中的仅限订单目标 - 对于 Microsoft NMAKE?