2014-10-09 93 views
1

我有一個簡單的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

作爲手冊說,The argument to the eval function is expanded, then the results of that expansion are parsed as makefile syntax.

這意味着eval得到由在宏$(1)some_value擴大到這樣的:

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文件的語法,所以變量被定義,那麼空的警告得到打印。