[轉載] http://blog.chinaunix.net/uid-20283771-id-1968709.html
一、通配符介紹
1.1、wildcard : 擴展通配符
在 GNU Make 裏有一個 wildcard 函 數,它後邊跟一個參數。功能是展開成一列所有符合由其參數描述的文件名,文件間以空格間隔。如果不在當前目錄文件名是含路徑的。
你能像下面所示使用這個命令:
SOURCES = $(wildcard *.c)
這行會產生一個所有以 ’.c’ 結尾的文件的列表,然後存入變量 SOURCES 裏。當然你不必一定要把結果存入一個變量。
1.2、notdir : 去除路徑
notdir函數可以把文件名中的路徑去掉。比如,可以在使用wildcard函數後,再配合使用notdir函數只得到文件名(不含路徑)。
1.3、patsubst :替換通配符
另一個有用的函數是 patsubst ( patten substitude, 匹配替換的縮寫)函數。他需要3個參數??第一個是個需要匹配的式樣,第二個表示用什麼來替換他,第三個是個需要被處理的由空格分隔的字列。
例如,處理那個經過上面定義後的變量,
OBJS = $(patsubst %.c,%.o,$(SOURCES))
這行將處理所有在 SOURCES 字列中的字(一列文件名),如果他的 結尾是 ’.c’ ,就用 ’.o’ 把 ’.c’取代。注意這裏的 % 符號將匹配一個或多個字符,而他每次所匹配的字串叫做一個‘柄’(stem) 。 在第二個參數裏, %被解讀成用第一參數所匹配的那個柄。
二、舉例說明
建立一個測試目錄,在測試目錄下建立一個名爲sub的子目錄
$ mkdir test
$ cd test
$ mkdir sub
在test下,建立a.c和b.c2個文件,在sub目錄下,建立sa.c和sb.c2 個文件
建立一個簡單的Makefile
src=$(wildcard *.c ./sub/*.c)
dir=$(notdir $(src))
obj=$(patsubst %.c,%.o,$(dir) )
all:
@echo $(src)
@echo $(dir)
@echo $(obj)
@echo "end"
執行結果分析:
第一行輸出:
a.c b.c ./sub/sa.c ./sub/sb.c
wildcard把 指定目錄 ./ 和 ./sub/ 下的所有後綴是c的文件全部展開。
第二行輸出:
a.c b.c sa.c sb.c
notdir把展開的文件去除掉路徑信息
第三行輸出:
a.o b.o sa.o sb.o
在
或者可以使用
obj=$(dir:%.c=%.o)
效果也是一樣的。
這裏用到makefile裏的替換引用規則,即用您指定的變量替換另一個變量。
它的標準格式是
$(var:a=b) 或 ${var:a=b}
它的含義是把變量var中的每一個值結尾用b替換掉a
三、使用體會
今天在研究makefile時在網上看到一篇文章,介紹了使用函數wildcard得到指定目錄下所有的C語言源程序文件名的方法,這下好了,不用手工一個一個指定需要編譯的.c文件了,方法如下:
SRC = $(wildcard *.c)
等於指定編譯當前目錄下所有.c文件,如果還有子目錄,比如子目錄爲inc,則再增加一個wildcard函數,象這樣:
SRC =
也可以指定彙編源程序:
ASRC = $(wildcard *.S)