Makefile之patsubst

 

 常常要手寫項目的Makefile,或者看其餘項目的遺留項目的Makefile,有些makefile內置函數經常使用,
卻用完就忘記了,最近項目中使用patsubst,感受挺好用的
 
 
格式: $(patsubst <pattern>,<replacement>,<text> ) 

名稱:模式字符串替換函數——patsubst。
功能:查找<text>中的單詞(單詞以「空格」、「Tab」或「回車」「換行」分隔)是否符合模式<pattern>,若是匹配的話,則以<replacement>替換。函數

   這裏,<pattern>能夠包括通配符「%」,表示任意長度的字串。若是<replacement>中也包含「%」,那麼,<replacement>中的這個「%」將是<pattern>中的那個「%」所表明的字串。測試

   (能夠用「\」來轉義,以「\%」來表示真實含義的「%」字符)
返回:函數返回被替換事後的字符串。spa

示例:字符串

$(patsubst %.c,%.o, a.c b.c)it

把字串「a.c b.c」符合模式[%.c]的單詞替換成[%.o],返回結果是「a.o b.o」class

 

make中有個變量替換引用變量

 

對於一個已經定義的變量,可使用「替換引用」將其值中的後綴字符(串)使用指定的字符(字符串)替換。格式爲「$(VAR:A=B)」(或者「${VAR:A=B}」),擴展

意思是,替換變量「VAR」中全部「A」字符結尾的字爲「B」結尾的字。「結尾」的含義是空格以前(變量值多個字之間使用空格分開)。而對於變量其它部分的「A」字符不進行替換。file

例如: 引用

foo := a.o b.o c.o

bar := $(foo:.o=.c)

 

在這個定義中,變量「bar」的值就爲「a.c b.c c.c」。使用變量的替換引用將變量「foo」以空格分開的值中的全部的字的尾字符「o」替換爲「c」,其餘部分不變。

若是在變量「foo」中若是存在「o.o」時,那麼變量「bar」的值爲「a.c b.c c.c o.c」而不是「a.c b.c c.c c.c」。



例子:
使用如下3個內置函數
一、wildcard : 擴展通配符
二、notdir : 去除路徑
三、patsubst :替換通配符

創建一個測試目錄,在測試目錄下創建一個名爲sub的子目錄
$ mkdir  mk
$ cd mk
$ mkdir sub

在mk下,創建a.c和b.c 2個文件,在sub目錄下,創建aa.c和bb.c 2 個文件

創建一個簡單的Makefile
src=$(wildcard *.c ./sub/*.c)
file=$(notdir $(src))
obj=$(patsubst %.c,%.o,$(src) )
all:  @echo $(src)    @echo $(file)  @echo $(obj)執行結果分析:第一行輸出:a.c b.c ./sub/aa.c ./sub/bb.cwildcard把 指定目錄 ./ 和 ./sub/ 下的全部後綴是c的文件所有展開。第二行輸出:a.c b.c aa.c bb.cnotdir把展開的文件去除掉路徑信息第三行輸出:a.o b.o aa.o bb.o在$(patsubst %.c,%.o,$(src) )中,patsubst把$(file)中的變量符合後綴是.c的所有替換成.o,任何輸出。或者可使用obj=$(file:%.c=%.o)效果也是同樣的。
相關文章
相關標籤/搜索