gnu的奇怪行为

时间:2014-10-09 10:58:02

标签: macros makefile

我有一个简单的Makefile(仅用于测试)

define my_macro
var_$(1) := $(1)
$(warning $(var_$(1)))      
$(warning $(var_some_value))
endef

$(eval $(call my_macro,some_value))
$(warning $(var_some_value))

Gnu make(v 3.80)产生:

Makefile:8:
Makefile:8:
Makefile:10: some_value

为什么第一次甚至第二次警告都不打印?

1 个答案:

答案 0 :(得分:1)

正如手册所说,The argument to the eval function is expanded, then the results of that expansion are parsed as makefile syntax.

这意味着eval通过在宏中用some_value代替$(1)来扩展到此范围:

var_some_value := some_value
$(warning $(var_some_value))
$(warning $(var_some_value))

然后变量$(var_some_value)被扩展,但此时宏扩展的结果尚未被评估为makefile语法,因此尚未设置变量。这意味着它扩展到:

var_some_value := some_value
$(warning )
$(warning )

最后,扩展文本被处理为makefile语法,因此变量被定义,然后打印空警告。