Makefile-autoconfig工具(六)

函數(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)部,通過(guò)$(1),$(2),...$(n)來(lái)代表對(duì)應(yīng)的參數(shù)arg1,arg2,...argn

define funtest
$(1)-yes :=$(2)
endef
$(info $(call funtest,config,true))

最終config的值為config-yes的值為true。

Makefile其實(shí)沒(méi)有自定義函數(shù)的概念,上面define關(guān)鍵字只是將多個(gè)命令組合在一起執(zhí)行罷了,稱為命令包,它的返回值是命令包內(nèi)的所有語(yǔ)句組成的makefile代碼字符串。比如對(duì)于上面(info(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è)字串(空格分開(kāi))賦值給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ù),自定義命令包一起使用,用來(lái)動(dòng)態(tài)的執(zhí)行命令包所定義的代碼,如上例子。

參考文章

跟我一起寫Makefile 1.0

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容