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