函數(shù)定義與調(diào)用
$(function arguments)
這是Makefile內(nèi)建函數(shù)的調(diào)用方式缓醋。function為函數(shù)名如失,arguments為參數(shù)绊诲,如果有多個(gè)參數(shù)送粱,以逗號(hào)","分隔。Makefile自定義函數(shù)
define funname
command1
command2
....
endef
它其實(shí)不叫函數(shù)掂之,稱為命令包抗俄,調(diào)用方式為 $(call funname,arg1,arg2,...argn);在命令包內(nèi)部世舰,通過$(1),$(2),...$(n)來代表對(duì)應(yīng)的參數(shù)arg1,arg2,...argn
define funtest
$(1)-yes :=$(2)
endef
$(info $(call funtest,config,true))
最終config的值為config-yes的值為true动雹。
Makefile其實(shí)沒有自定義函數(shù)的概念,上面define關(guān)鍵字只是將多個(gè)命令組合在一起執(zhí)行罷了跟压,稱為命令包胰蝠,它的返回值是命令包內(nèi)的所有語句組成的makefile代碼字符串。比如對(duì)于上面(call funtest,config,true))震蒋,$(call funtest,config,true)的返回值就是 config-yes=true這一條代碼字符串
define RESET
$(1) :=
$(1)-yes :=
endef
$(call RESET,config)
這個(gè)函數(shù)的功能就是將config和config-yes這兩個(gè)變量賦值為空
常用函數(shù)
1茸塞、$(call expression,parm1,parm2,...,parmn)
執(zhí)行表達(dá)式expression(由$(1),$(2),...$(n)組成,方式順序不自由組合)查剖,該表達(dá)式的中的$(1),$(2),...$(n)則對(duì)應(yīng)到parm1,parm2,...,parmn的值
reverse = $(2) $(1)
foo := $(call reverse,a,b)
最終foo的值為 b a
2钾虐、$(foreach var,list,text)
依次從list變量中取出每個(gè)字串(空格分開)賦值給var,然后執(zhí)行text表達(dá)式,直到循環(huán)完畢將每次text表達(dá)式的值添加到一起作為foreach的返回值
names := a b c d
files := $(foreach n,$(names),$(n).o)
最終files的值為 a.o b.o c.o d.o
3笋庄、$(eval text)
將text 的內(nèi)容作為makefile的一部分而被make解析和執(zhí)行效扫。
pointer := pointed_value
define foo
var := 123
arg := $1
$$($1) := ooooo
endef
$(info $(call foo,pointer))
$(eval $(call foo,pointer))
target:
@echo -----------------------------
@echo var: $(var), arg: $(arg)
@echo pointer: $(pointer), pointed_value: $(pointed_value)
@echo done.
@echo -----------------------------
最終執(zhí)行結(jié)果為:
var := 123
arg := pointer
$(pointer) := ooooo
-----------------------------
var: 123, arg: pointer
pointer: pointed_value, pointed_value: ooooo
done.
eval 常常和call函數(shù),自定義命令包一起使用倔监,用來動(dòng)態(tài)的執(zhí)行命令包所定義的代碼,如上例子菌仁。