常常要手寫項目的Makefile,或者看其餘項目的遺留項目的Makefile,有些makefile內置函數經常使用,函數
卻用完就忘記了,最近項目中使用patsubst,感受挺好用的測試
格式:$(patsubst <pattern>,<replacement>,<text> ) .net
名稱:模式字符串替換函數——patsubst。
功能:查找<text>中的單詞(單詞以「空格」、「Tab」或「回車」「換行」分隔)是否符合模式<pattern>,若是匹配的話,則以<replacement>替換。字符串
這裏,<pattern>能夠包括通配符「%」,表示任意長度的字串。若是<replacement>中也包含「%」,那麼,<replacement>中的這個「%」將是<pattern>中的那個「%」所表明的字串。get
(能夠用「\」來轉義,以「\%」來表示真實含義的「%」字符)
返回:函數返回被替換事後的字符串。class
示例:變量
$(patsubst %.c,%.o, a.c b.c)擴展
把字串「a.c b.c」符合模式[%.c]的單詞替換成[%.o],返回結果是「a.o b.o」file
make中有個變量替換引用引用
對於一個已經定義的變量,可使用「替換引用」將其值中的後綴字符(串)使用指定的字符(字符串)替換。格式爲「$(VAR:A=B)」(或者「${VAR:A=B}」),
意思是,替換變量「VAR」中全部「A」字符結尾的字爲「B」結尾的字。「結尾」的含義是空格以前(變量值多個字之間使用空格分開)。而對於變量其它部分的「A」字符不進行替換。
例如:
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.c wildcard把 指定目錄 ./ 和 ./sub/ 下的全部後綴是c的文件所有展開。 第二行輸出: a.c b.c aa.c bb.c notdir把展開的文件去除掉路徑信息 第三行輸出: a.o b.o aa.o bb.o 在$(patsubst %.c,%.o,$(src) )中,patsubst把$(file)中的變量符合後綴是.c的所有替換成.o, 任何輸出。 或者可使用 obj=$(file:%.c=%.o) 效果也是同樣的。