linux makefile字符串操作函數 替換subst、模式替換patsubst

1.1 字符操作函數使用
在Makefile中可以使用函數來處理變量,從而讓我們的命令或是規則更爲的靈活和具有智能。make所支持的函數也不算很多,不過已經足夠我們的操作了。函數調用後,函數的返回值可以當做變量來使用。
函數調用,很像變量的使用,也是以“$”來標識的,其語法如下:
$(<function> <arguments> )
或是
${<function> <arguments>}
這裏,<function>就是函數名,make支持的函數不多。<arguments>是函數的參數,參數間以逗號“,”分隔,而函數名和參數之間以“空格”分隔。函數調用以“$”開頭,以圓括號或花括號把函數名和參數括起。例如字符替換函數。

1.1.1 字符串替換函數

$(subst <from>,<to>,<text> )
名稱:字符串替換函數——subst。
功能:把字串<text>中的<from>字符串替換成<to>。
返回:函數返回被替換過後的字符串。

Makefile 內容

all:

@echo $(subst t,e,maktfilt)  <-- 將t替換爲e

bash 中執行 make

$ make

makefile

1.1.2 模式字符串替換函數

$(patsubst <pattern>,<replacement>,<text> )

名稱:模式字符串替換函數——patsubst。
功能:以通配符的形式替換字符,查找<text>中的單詞(單詞以“空格”、“Tab”或“回車”“換行”分隔)是否符合模式<pattern>,如果匹配的話,則以<replacement>替換。這裏,<pattern>可以包括通配符“%”,表示任意長度的字串。如果<replacement>中也包含“%”,那麼,<replacement>中的這個“%”將是<pattern>中的那個“%”所代表的字串。(可以用“\”來轉義,以“\%”來表示真實含義的“%”字符)返回:函數返回被替換過後的字符串。
示例:
$(patsubst %.c,%.o,x.c.c bar.c)
把字串“x.c.c bar.c”符合模式[%.c]的單詞替換成[%.o],返回結果是“x.c.o bar.o”

Makefile 內容

all:

@echo $(patsubst %.c,%.o,programA.c programB.c)

bash 中執行 make

$ make

programA.o programB.o

1.1.3 去首尾空格函數

名稱:去空格函數——strip。
功能:去掉<string>字串中開頭和結尾的空字符。
返回:返回被去掉空格的字符串值。
示例:
$(strip a b c )
把字串“a b c ”去到開頭和結尾的空格,結果是“a b c”。

Makefile 內容

VAL := " aa bb cc "

all:

@echo "去除空格前: " $(VAL)

@echo "去除空格後: " $(strip $(VAL))

bash 中執行 make

$ make

去除空格前: aa bb cc

去除空格後: aa bb cc

1.1.4 查找字符串函數

$(findstring <find>,<in> )

名稱:查找字符串函數——findstring。
功能:在字串<in>中查找<find>字串。
返回:如果找到,那麼返回找到的字符串,否則返回空字符串。
示例:
$(findstring a,a b c)
$(findstring a,b c)
第一個函數返回“a”字符串,第二個返回“”字符串(空字符串)

Makefile 內容

VAL := " aa bb cc "

all:

@echo $(findstring aa,$(VAL))

@echo $(findstring ab,$(VAL))

bash 中執行 make

$ make

aa

1.1.5 過濾函數

$(filter <pattern...>,<text> )
名稱:過濾函數——filter。
功能:以<pattern>模式過濾<text>字符串中的單詞,保留符合模式<pattern>的單詞。可以有多個模式。
返回:返回符合模式<pattern>的字串。
示例:
sources := foo.c bar.c baz.s ugh.h
foo: $(sources)
cc $(filter %.c %.s,$(sources)) -o foo
$(filter %.c %.s,$(sources))返回的值是“foo.c bar.c baz.s”。
$(filter-out <pattern...>,<text> )

Makefile 內容

all:

@echo $(filter %.o %.a,program.c program.o program.a)

bash 中執行 make

$ make

program.o program.a

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章