【发布时间】:2018-01-30 18:36:46
【问题描述】:
我阅读了 GNU make 文档的 Using Variables 部分,但无法理解 make 变量在多次定义时如何在 make 规则中展开。
例如,请参阅以下简短的 makefile:
.PHONY: run
run: a b
TARGET := a
$(TARGET):
echo $(TARGET)
touch $@
TARGET := b
$(TARGET):
echo $(TARGET)
touch $@
在运行make 时会产生以下输出:
echo b
b
touch a
echo b
b
touch b
看来a有目标,自动变量$@确实是a。但是回显TARGET 变量,这也是目标名称,打印b...这是怎么回事?
我会很感激任何帮助,最好是链接到文档,以澄清这种行为。
其他可能相关的问题:
- 在调用
make时,makefile 是否只读取一次? - 目标names 是否在读取makefile 时或之后扩展?
- 目标 rules 是否在读取 makefile 时或之后扩展?
注意:使用递归扩展变量(即将:= 更改为=)不会更改上例中的输出。
【问题讨论】:
-
我没有文档参考来支持这一点,但我认为 1) 是的,2) 名称在 Make 读取文件时扩展,因此第一条规则的名称是 @987654333 @ 并且第二个的名称是
b,3) 配方(规则中的命令)仅在执行规则时才会扩展,此时TARGET是b。 -
@Beta 完全正确,我想您应该将其作为答案。
标签: linux unix makefile gnu-make