Makefile之通配符

[轉載] 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

(patsubst (dir) )中,patsubst把$(dir)中的變量符合後綴是.c的全部替換成.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 = (wildcard.c) (wildcard inc/*.c)

也可以指定彙編源程序:
ASRC = $(wildcard *.S)

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