在makefile中能夠使用函數來處理變量,從而使用戶的命令和規則更靈活,函數調用後,函數的返回值能夠當作變量來使用。shell
makefile文件中的函數調用以$標示,其語法以下:express
$(<function> <argumnets>) 或者 ${<function> <argumnets>}
<function>表示函數名,<arguments>表示函數的參數列表。參數間以「,」分隔,而函數名之間以空格分隔。函數
表達式:性能
$(subst<from>,<to>,<text>)
函數功能:把字串<text>中的<from>字符串替換成<to>。spa
返回值:函數返回被替換後的字符串。該函數調用示例以下:操作系統
result = $(subst a,A, how are you, China?) all : echo -n "the result is : " echo $(result) .PHONY : all
執行結果爲:code
表達式:排序
$(patsubst<pattern>,<replacement>,<text>)
函數功能:查找<text>中的單詞進程
返回值:函數返回被替換後的字符串。ip
該函數調用示例以下,其中,makefile將文件列表中的.mk文件替換爲.o文件。
result = $(patsubst %.mk, %.o, makefile.mk.mk a.mk) all : echo -n "the result is : " echo $(result) .PHONY : all
執行結果:
表達式:
$(strip<string>)
函數功能:去掉<string>字串中開頭和結尾的空字符
返回值:返回被去掉空格的字符串值
該函數的示例以下:
result = $(strip hello world ) all : echo -n "the result is : " echo $(result) .PHONY : all
執行結果以下:
表達式:
$(findstring <find>,<in>)
函數功能:在字符串<in>中查找<find>字串
返回值:若是找到指定的字符串,則返回<find>,不然返回空字符串
示例以下:
result = $(findstring h,hello) all : echo -n "the result is : " echo $(result) .PHONY : all
執行結果:
表達式:
$(filter <pattern>,<text>)
函數功能:以<pattern>模式過濾<text>字符串中的單詞,保留符合模式<pattern>的單詞,能夠有多個模式。
返回值:返回符合模式<pattern>的字符串。
該函數示例以下,將文件列表中是.c和.h的文件過濾掉:
sources := a.c b.c c.c d.h e f result = $(filter %.c %.h,$(sources)) all : echo -n "the result is : " echo $(result) .PHONY : all
執行結果:
表達式:
$(filter-out <pattern>,<text>)
函數功能:以<pattern>模式過濾<text>字符串中的單詞,去除符合模式<pattern>的單詞,能夠有多個模式。
返回值:返回不符合模式<pattern>的字符串。
示例以下:
sources := a.c b.c c.c d.h e f result = $(filter-out %.c %.h,$(sources)) all : echo -n "the result is : " echo $(result) .PHONY : all
執行結果:
表達式:
$(sort <list>)
函數功能:給字符串<list>中的單詞排序(升序)
返回值:返回排序後的字符串。
示例以下,將hello world china字符串排序:
result = $(sort hello world china) all : echo -n "the result is : " echo $(result) .PHONY : all
執行結果:
注:sort函數回去掉<list>中相同的單詞。
表達式:
$(word <n>,<text>)
函數功能:取字符串<text>中第<n>個單詞
返回值:返回字符串<text>中第<n>個單詞。
示例以下:
result1 = $(word 2, hello world china) #取單詞world result2 = $(word 4, hello world china) #取一個不存在的單詞 all : echo -n "the result1 is : " echo $(result1) echo -n "the result2 is : " echo $(result2) .PHONY : all
執行結果:
表達式:
$(wordlist <s>,<e>,<text>)
函數功能:從字符串<text>中取<s>開始到<e>的單詞串。<s>和<e>是一個數字。
返回值:返回字符串<text>中從<s>到<e>的單詞字串。
該函數示例以下:
result1 = $(wordlist 1,2, hello world china) #取單詞串 result2 = $(wordlist 3,2, hello world china) #取單詞串 result3 = $(wordlist 2,5, hello world china) #取單詞串 all : echo -n "the result1 is : " echo $(result1) echo -n "the result2 is : " echo $(result2) echo -n "the result3 is : " echo $(result3) .PHONY : all
執行結果:
表達式:
$(words <text>)
函數功能:統計<text>中字符串中的單詞個數
返回值:返回<text>中的單詞數。
示例以下:
result = $(words hello world china) all : echo -n "the result1 is : " echo $(result) .PHONY : all
執行結果:
表達式:
$(firstword <text>)
函數功能:取字符串<text>中的第一個單詞。
返回值:返回字符串<text>的第1個單詞。
示例以下:
result = $(firstword hello world china) all : echo -n "the result1 is : " echo $(result) .PHONY : al
執行結果:
表達式:
$(dir <names...>)
函數功能:從文件名序列<names>中取出目錄部分(目錄部分是指最後一個 / 以前的部分,若是沒有 / ,則返回「./ 」)
返回值:返回文件名序列<names>的目錄部分。
該函數示例以下:
result = $(dir text.c /home/admin/text.c) all : echo -n "the result1 is : " echo $(result) .PHONY : all
執行結果:
表達式:
$(notdir <names...>)
函數功能:從文件名序列<names>中取出非目錄部分。非目錄部分是指最後一個「/」以後的部分。
返回值:返回文件名序列<names>中的非目錄部分
示例以下:
result = $(notdir text.c /home/admin/text.c) all : echo -n "the result1 is : " echo $(result) .PHONY : all
執行結果:
表達式:
$(suffix <names...>)
函數功能:從文件名序列<names>中取出各個文件名的後綴
返回值:文件名序列<names>的後綴序列,若是文件沒有後綴,則返回空字符串。
該函數示例以下:
result = $(suffix text.txt /home/admin/text.c file) all : echo -n "the result1 is : " echo $(result) .PHONY : al
執行結果:
表達式:
$(basename <namses...>)
函數功能:從文件名序列<names>中取出文件名的前綴部分
返回值:文件名序列<names>的前綴序列,若是沒有前綴,返回空字符串。
示例以下:
result = $(basename text.txt /home/admin/text.c file) all : echo -n "the result1 is : " echo $(result) .PHONY : all
執行結果:
表達式:
$(addsuffix <suffix>,<names...>)
函數功能:把後綴<suffix>加到<names>中的每一個單詞後面
返回值:返回加事後綴的文件名序列。
示例以下,至關於添加一個擴展名「
result = $(addsuffix .c,a b c) all : echo -n "the result1 is : " echo $(result) .PHONY : all
執行結果:
表達式:
$(addprefix <prefix>,<names...>)
函數功能:
把前綴<prefix>加到<names>中每一個單詞的前面
返回值:返回加過前綴的文件名序列。
示例以下:
result = $(addprefix /home/admin/,text1.c text2.c text3,c) all : echo -n "the result1 is : " echo $(result) .PHONY : all
執行結果:
表達式:
$(join <list1>,<list2>)
函數功能:把<list2>中的單詞對應地加到<list1>的單詞後面
返回值:返回鏈接後的字符串。
示例以下:
result1 = $(join /home/ /home/,text1.c text2.c text3,c) result2 = $(join /home/ /home/ /home/,text1.c text2.c) all : echo -n "the result1 is : " echo $(result1) echo -n "the result1 is : " echo $(result2) .PHONY : all
執行結果:
foreach函數是用來控制循環的。語法以下:
$(foreach <var>,<list>,<text>)
<var>最好是一個變量名,<list>能夠是一個表達式,而<text>中通常會使用<var>參數來依次枚舉<list>中的單詞。
示例:
names := a b c d result = $(foreach n,$(names),$(n).c) all : echo -n "the result1 is : " echo $(result) .PHONY : all
執行結果:
注意:foreach函數中的<var>參數是一個臨時變量。所以,foreach函數執行完後,<var>將再也不起做用,其做用域只在foreach函數中。
if函數很像makefile文件中所支持的條件語句--ifeq,語法以下:
$(if <condition>,<then-part>) 或者 $(if <condition>,<then-part>,<else-part>)
<condition>參數表示一個條件表達式,若是該表達式爲真,則執行<then-part>中的語句,不然執行<else-part>。
示例:
a := 1 b := 1 result = $(if ifeq($a, $b), $a = 10, $b = 10) all : echo -n "the result1 is : " echo $(result) .PHONY : all
執行結果:
call函數爲用戶建立一個本身定義的函數。用戶寫的一個表達式,每次用到這個表達式的時候,使用call函數跳轉到該表達式處執行便可,語法爲:
$(call <expression>,<parm1>,<parm2> ...)
當make執行這個函數時,<expression>參數中的變量,會被參數<parm1>,<parm2>等依次取代,而<expression>的返回值就是call函數的返回值。
示例:
add = $(1) + $(2) result := $(call add,1,2) all : echo -n "the result1 is : " echo $(result) .PHONY : all
執行結果:
shell函數用來執行shell命令。該函數把執行操做系統命令後的輸出做爲函數返回,用戶能夠經過調用shell函數,使用操做系統命令來生成一個變量。格式以下:
$(shell <command>,<parm1>,<aprm2> ...)
這個函數會生成一個新的進程執行shell命令,因此該函數會影響運行性能。若是在makefile中大量使用該函數,會致使makefile文件執行效率嚴重降低。
示例:
result := $(shell ls) all : echo -n "the result1 is : " echo $(result) .PHONY : all
執行結果: