2017年9月14日 星期四

[Makefile][fun] eval

eval就是一個make的解譯器,常與define一起用,由於define只是做展開的動作,
執行時可能會有錯,如下舉一個簡單的例子來說明eval如何parse 巨集。

Makefile:
pointer := pointed_value

define foo #定義foo 巨集 (自訂義函式)
var := 123
arg := $1
$$($1) := ooooo # $1: pointer, $pointer : pointer_value, $pointer_value = ooooo
endef


target:
$(info $(call foo,pointer))
#$(eval $(call foo,pointer))
@echo -----------------------------        
@echo var: $(var), arg: $(arg)
@echo pointer: $(pointer), pointed_value: $(pointed_value)
@echo done.
@echo -----------------------------

$(info $(call foo,pointer)) 結果:
$ make
var := 123
arg := pointer
$(pointer) := ooooo # pointer: pointer, ointer : pointer_value, ointer_value = o
oooo
-----------------------------
var: , arg:
pointer: pointed_value, pointed_value:
done.
-----------------------------

=>
1.  info就是如實的把後面接的(foo 巨集內容)全部都當字串顯示(分隔線之前),並沒有做執行的動作(如assign)
2.  由於沒有做執行的動作,所以echo變數值時,內容為空。

$(eval $(call foo,pointer)) 結果:
$ make
-----------------------------
var: 123, arg: pointer
pointer: pointed_value, pointed_value: ooooo
done.
-----------------------------
=>
evalfoo的內容當作makefile來做解譯並執行,所以echo時有值。



參考:link

沒有留言:

張貼留言