我有一个简单的 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 Manual在 3.7 How make Reads a Makefile 中对此进行了讨论。具体来说,对于这种情况,您需要最后一个子部分规则定义
。
关于gnu-make - GNU 做出奇怪的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28168843/