【轉】Makefile文本處理函數

接上一篇【轉】Makefile的內嵌函數
摘自《GNU+Makefile中文手冊》整理翻譯:徐海兵

Makefile文本處理函數

以下是 GNU make 內嵌的文本(字符串)處理函數。

2.1 $(subst FROM,TO,TEXT)

函數名稱:字符串替換函數— subst。

函數功能:把字串“ TEXT”中的“ FROM”字符替換爲“ TO”。

返回值:替換後的新字符串。

示例:

$(subst ee,EE,feet on the street)

替換“ feet on the street”中的“ ee”爲“ EE”,結果得到字符串“ fEEt on the strEEt”。

2.2 $(patsubst PATTERN,REPLACEMENT,TEXT)

函數名稱:模式替換函數— patsubst。

函數功能:搜索“ TEXT”中以空格分開的單詞,將否符合模式“PTATTERN”替換爲“REPLACEMENT”。參數“PATTERN”中可以使用模式通配符“%”來代表一個單詞中的若干字符。如果參數“ REPLACEMENT”中也包含一個“%”,那麼“REPLACEMENT”中的“%”將是“TATTERN”中的那個“%”所代表的字符串。在“TATTERN”和“REPLACEMENT”中,只有第一個“ %”被作爲模式字符來處理,之後出現的不再作模式字符(作爲一個字符)。在參數中如果需要將第一個出現的“ %”作爲字符本身而不作爲模式字符時,可使用反斜槓“ \”進行轉義處理(轉義處理的機制和使用靜態模式的轉義一致)。

返回值:替換後的新字符串。

函數說明:參數“ TEXT”單詞之間的多個空格在處理時被合併爲一個空格,並忽略前導和結尾空格。

示例:

$(patsubst %.c,%.o,x.c.c bar.c)

把字串“ x.c.c bar.c”中以.c 結尾的單詞替換成以.o 結尾的字符。函數的返回結果是“ x.c.o bar.o”

本文的第六章在 變量的高級用法的第一小節 中曾經討論過變量的替換引用,它是一個簡化版的“ patsubst”函數在變量引用過程的實現。變量替換引用中:

$(VAR:PATTERN=REPLACEMENT)

就相當於:

$(patsubst PATTERN,REPLACEMENT,$(VAR))

而另外一種更爲簡單的替換字符後綴的實現:

$(VAR:SUFFIX=REPLACEMENT)

它等於:

$(patsubst %SUFFIX,%REPLACEMENT,$(VAR))

例如我們存在一個代表所有.o 文件的變量。定義爲“ objects = foo.o bar.o baz.o”。爲了得到這些.o 文件所對應的.c 源文件。我們可以使用以下兩種方式的任意一個:

$(objects:.o=.c)
$(patsubst %.o,%.c,$(objects))

2.3 $(strip STRINT)

函數名稱:去空格函數— strip。

函數功能:去掉字串(若干單詞,使用若干空字符分割)“ STRINT”開頭和結尾的空字符,並將其中多個連續空字符合併爲一個空字符。

返回值:無前導和結尾空字符、使用單一空格分割的多單詞字符串。

函數說明:空字符包括空格、 [Tab]等不可顯示字符。

示例:

STR = a b c
LOSTR = $(strip $(STR))

結果是“a b c”。“strip”函數經常用在條件判斷語句的表達式中,確保表達式比較的可靠和健壯!

2.4 $(findstring FIND,IN)

函數名稱:查找字符串函數— findstring。

函數功能:搜索字串“ IN”,查找“ FIND”字串。

返回值:如果在“ IN”之中存在“ FIND”,則返回“ FIND”,否則返回空。

函數說明:字串“ IN”之中可以包含空格、 [Tab]。搜索需要是嚴格的文本匹配。

示例:

$(findstring a,a b c)
$(findstring a,b c)

第一個函數結果是字“ a”;第二個值爲空字符。

2.5 $(filter PATTERN…,TEXT)

函數名稱:過濾函數— filter。

函數功能:過濾掉字串“ TEXT”中所有不符合模式“ PATTERN”的單詞,保留所有符合此模式的單詞。可以使用多個模式。模式中一般需要包含模式字符“ %”。存在多個模式時,模式表達式之間使用空格分割。

返回值:空格分割的“ TEXT”字串中所有符合模式“ PATTERN”的字串。

函數說明:“ filter”函數可以用來去除一個變量中的某些字符串,我們下邊的例子中就是用到了此函數。

示例:

sources := foo.c bar.c baz.s ugh.h
foo: $(sources)
cc $(filter %.c %.s,$(sources)) -o foo

使用“ (filter (sources))”的返回值給 cc 來編譯生成目標“ foo”,函數返回值爲“ foo.c bar.c baz.s”。

2.6 $(filter-out PATTERN…,TEXT)

函數名稱:反過濾函數— filter-out。

函數功能:和“ filter”函數實現的功能相反。過濾掉字串“ TEXT”中所有符合模式“ PATTERN”的單詞,保留所有不符合此模式的單詞。可以有多個模式。存在多個模式時,模式表達式之間使用空格分割。

返回值:空格分割的“ TEXT”字串中所有不符合模式“ PATTERN”的字串。

函數說明:“ filter-out”函數也可以用來去除一個變量中的某些字符串,(實現和“ filter”函數相反)。

示例:

objects=main1.o foo.o main2.o bar.o
mains=main1.o main2.o
$(filter-out $(mains),$(objects))

實現了去除變量“ objects”中“ mains”定義的字串(文件名)功能。它的返回值爲“ foo.o bar.o”。

2.7 $(sort LIST)

函數名稱:排序函數— sort。

函數功能:給字串“ LIST”中的單詞以首字母爲準進行排序(升序),並取掉重複的單詞。

返回值:空格分割的沒有重複單詞的字串。

函數說明:兩個功能,排序和去字串中的重複單詞。可以單獨使用其中一個功能。

示例:

$(sort foo bar lose foo)

返回值爲:“ bar foo lose” 。

2.8 $(word N,TEXT)

函數名稱:取單詞函數— word。

函數功能:取字串“ TEXT”中第“ N”個單詞(“ N”的值從 1 開始)。

返回值:返回字串“ TEXT”中第“ N”個單詞。

函數說明:如果“ N”值大於字串“ TEXT”中單詞的數目,返回空字符串。如果“ N”爲 0,出錯!

示例:

$(word 2, foo bar baz)

返回值爲“ bar”。

2.9 $(wordlist S,E,TEXT)

函數名稱:取字串函數— wordlist。

函數功能:從字串“ TEXT”中取出從“ S”開始到“ E”的單詞串。“ S”和“ E”表示單詞在字串中位置的數字。

返回值:字串“ TEXT”中從第“ S”到“ E”(包括“ E”)的單詞字串。

函數說明:
“ S”和“ E”都是從 1 開始的數字。

當“S”比“TEXT”中的字數大時,返回空。  
如果“E”大於“TEXT”字數,返回從“S”開始,到“ TEXT”結束的單詞串。  
如果“S”大於“E”,返回空。  

示例:

$(wordlist 2, 3, foo bar baz)

返回值爲:“ bar baz”。

2.10 $(words TEXT)

函數名稱:統計單詞數目函數— words。

函數功能:字算字串“ TEXT”中單詞的數目。

返回值:“ TEXT”字串中的單詞數。

示例:

$(words, foo bar)

返回值是“ 2”。所以字串“ TEXT”的最後一個單詞就是: (word (words TEXT),TEXT)。

2.11 $(firstword NAMES…)

函數名稱:取首單詞函數— firstword。

函數功能:取字串“ NAMES…”中的第一個單詞。

返回值:字串“ NAMES…”的第一個單詞。

函數說明:“ NAMES”被認爲是使用空格分割的多個單詞(名字)的序列。函數忽略“ NAMES…”中除第一個單詞以外的所有的單詞。

示例:

$(firstword foo bar)

返回值爲“ foo”。

函數“ firstword”實現的功能等效於“ $(word 1, NAMES…)”。

小結

以上 11 個函數是make內嵌的的文本處理函數。書寫Makefile時可搭配使用來實現複雜功能。最後我們使用這些函數來實現一個實際應用。例子中我們使用函數“subst”和“patsbust”。Makefile中可以使用變量“ VPATH”(參考 4.5.1 一般搜索 (變量VPATH)一小節)來指定搜索路徑。對於源代碼所包含的頭文件的搜索路徑需要使用gcc的“-I”參數指定目錄來實現,“ VPATH”羅列的目錄是用冒號“ :”分割的。如下就是Makefile的片段:

VPATH = src:../includes
override CFLAGS += $(patsubst %,-I%,$(subst :, ,$(VPATH)))

那麼第二條語句所實現的功能就是“ CFLAGS += -Isrc –I../includes”。

發佈了68 篇原創文章 · 獲贊 41 · 訪問量 22萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章