makefile(六)使用函數

在makefile中能夠使用函數來處理變量,從而使用戶的命令和規則更靈活,函數調用後,函數的返回值能夠當作變量來使用。shell

1、函數調用的語法

makefile文件中的函數調用以$標示,其語法以下:express

$(<function> <argumnets>)

或者

${<function> <argumnets>}

<function>表示函數名,<arguments>表示函數的參數列表。參數間以「,」分隔,而函數名之間以空格分隔。函數

 

2、字符串處理函數

1.字符串替換函數

表達式:性能

$(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

2.模式字符串替換函數

表達式:排序

$(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

執行結果:

3.去空格函數

表達式:

$(strip<string>)

函數功能:去掉<string>字串中開頭和結尾的空字符

返回值:返回被去掉空格的字符串值

該函數的示例以下:

result = $(strip      hello world      )
all :
	echo -n "the result is : "
	echo $(result)

.PHONY : all

執行結果以下:

4.查找字符串函數

表達式:

$(findstring <find>,<in>)

函數功能:在字符串<in>中查找<find>字串

返回值:若是找到指定的字符串,則返回<find>,不然返回空字符串

示例以下:

result = $(findstring h,hello)
all :
	echo -n "the result is : "
	echo $(result)

.PHONY : all

執行結果:

5.過濾函數

表達式:

$(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

執行結果:

6.反過濾函數

表達式:

$(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

執行結果:

7.排序函數

表達式:

$(sort <list>)

函數功能:給字符串<list>中的單詞排序(升序)

返回值:返回排序後的字符串。

示例以下,將hello world china字符串排序:

result = $(sort hello world china)
all :
	echo -n "the result is : "
	echo $(result)

.PHONY : all

執行結果:

注:sort函數回去掉<list>中相同的單詞。

8.取單詞函數

表達式:

$(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

執行結果:

9.取單詞串函數

表達式:

$(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

執行結果:

10.單詞個數統計函數

表達式:

$(words <text>)

函數功能:統計<text>中字符串中的單詞個數

返回值:返回<text>中的單詞數。

示例以下:

result = $(words hello world china)
all :
	echo -n "the result1 is : "
	echo $(result)

.PHONY : all

執行結果:

11.首單詞函數

表達式:

$(firstword <text>)

函數功能:取字符串<text>中的第一個單詞。

返回值:返回字符串<text>的第1個單詞。

示例以下:

result = $(firstword hello world china)
all :
	echo -n "the result1 is : "
	echo $(result)

.PHONY : al

執行結果:

 

3、文件名操做函數

1.取目錄函數

表達式:

$(dir <names...>)

函數功能:從文件名序列<names>中取出目錄部分(目錄部分是指最後一個 / 以前的部分,若是沒有 / ,則返回「./ 」)

返回值:返回文件名序列<names>的目錄部分。

該函數示例以下:

result = $(dir text.c /home/admin/text.c)
all :
	echo -n "the result1 is : "
	echo $(result)

.PHONY : all

執行結果:

2.取文件函數

表達式:

$(notdir <names...>)

函數功能:從文件名序列<names>中取出非目錄部分。非目錄部分是指最後一個「/」以後的部分。

返回值:返回文件名序列<names>中的非目錄部分

示例以下:

result = $(notdir text.c /home/admin/text.c)
all :
	echo -n "the result1 is : "
	echo $(result)

.PHONY : all

執行結果:

3.取後綴函數

表達式:

$(suffix <names...>)

函數功能:從文件名序列<names>中取出各個文件名的後綴

返回值:文件名序列<names>的後綴序列,若是文件沒有後綴,則返回空字符串。

該函數示例以下:

result = $(suffix text.txt /home/admin/text.c file)
all :
	echo -n "the result1 is : "
	echo $(result)

.PHONY : al

執行結果:

4.取前綴函數

表達式:

$(basename <namses...>)

函數功能:從文件名序列<names>中取出文件名的前綴部分

返回值:文件名序列<names>的前綴序列,若是沒有前綴,返回空字符串。

示例以下:

result = $(basename text.txt /home/admin/text.c file)
all :
	echo -n "the result1 is : "
	echo $(result)

.PHONY : all

執行結果:

5.加前綴函數

表達式:

$(addsuffix <suffix>,<names...>)

函數功能:把後綴<suffix>加到<names>中的每一個單詞後面

返回值:返回加事後綴的文件名序列。

示例以下,至關於添加一個擴展名「

result = $(addsuffix .c,a b c)
all :
	echo -n "the result1 is : "
	echo $(result)

.PHONY : all

執行結果:

6.加前綴函數

表達式:

$(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

執行結果:

7.鏈接函數

表達式:

$(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

執行結果:

 

4、foreach函數

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函數中。

 

5、if函數

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

執行結果:

 

6、call函數

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

執行結果:

 

7、shell函數

shell函數用來執行shell命令。該函數把執行操做系統命令後的輸出做爲函數返回,用戶能夠經過調用shell函數,使用操做系統命令來生成一個變量。格式以下:

$(shell <command>,<parm1>,<aprm2> ...)

這個函數會生成一個新的進程執行shell命令,因此該函數會影響運行性能。若是在makefile中大量使用該函數,會致使makefile文件執行效率嚴重降低。

示例:

result := $(shell ls)
all :
	echo -n "the result1 is : "
	echo $(result)

.PHONY : all

執行結果:

相關文章
相關標籤/搜索