Makefile 裏的函數跟它的變量很相似——使用的時候,你用一個 $ 符號跟開括號,函數名,空格後跟一列由逗號分隔的參數,最後用關括號結束。
在 GNU Make 裏有一個叫 'wildcard' 的函 數,它有一個參數,功能是展開成一列所有符合由其參數描述的文 件名,文件間以空格間隔。你可以像下面所示使用這個命令:
SOURCES= $(wildcard *.c)
這行會產生一個所有以 '.c' 結尾的文件的列表,然後存入變量 SOURCES 裏。當然你不需要一定要把結果存入一個變量。
notdir把展開的文件的路徑去掉,只顯示文件名而不包含其路徑信息,例如:
FILES =$(notdir $(SOURCES))
這行的作用是把上面以'.c'結尾的文件的文件列表中附帶的路徑去掉,只顯示符合條件的文件名。
patsubst( patten substitude, 匹配替換的縮寫)函數。它需要3個參數:第一個是一個需要匹配的式樣,第二個表示用什麼來替換它,第三個是一個需要被處理的由空格分隔的字列。例如,處理那個經過上面定義後的變量,
OBJS = $(patsubst %.c,%.o,$(SOURCES))
這行將處理所有在 SOURCES列箇中的字(一列文件名),如果它的 結尾是 '.c' ,就用'.o' 把 '.c' 取代。注意這裏的 % 符號將匹配一個或多個字符,而它每次所匹配的字串叫做一個‘柄’(stem) 。在第二個參數裏, % 被解讀成用第一參數所匹配的那個柄。
簡單使用示例:
一、建立一個測試目錄,在測試目錄下新建立一個子目錄:
$ mkdir test
$ cd test
$ mkdir sub
二、在test下,新建幾個測試文件:
touch aaa.c、bbb.c、ddd.c。
在sub目錄下,touchsuba.c、subb.c。
三、寫一個簡單的Makefile:
#
#This is a simple Makefile for test.
#
SOURCES = $(wildcard *.c ./sub/*.c)
FILES = $(notdir$(SOURCES))
OBJS = $(patsubst %.c, %.o, $(FILES) )
all:
@echo "teststart......"
@echo $(SOURCES)
@echo $(FILES)
@echo $(OBJS)
@echo "test end!"
四、執行結果:
root@Adam:/home/Adam/test/# make
test start......
aaa.c bbb.c ddd.c ./sub/suba.c ./sub/subb.c
aaa.c bbb.c ddd.c suba.c subb.c
aaa.o bbb.o ddd.o suba.o subb.o
end !
注:在$(patsubst %.c,%.o,$(FILES) )中,patsubst把$(FILES)中的變量符合後綴是.c的全部替換成.o後綴,還可以使用下面這一句,效果一樣:
OBJS = $(FILES:%.c=%.o)
注意:
在編寫makefile後,make項目時提示如下錯誤:
Makefile:(行號):*** missing separator. Stop.
這個錯誤是因爲你在讓makefile來執行你所指定的命令時,命令沒有以tab鍵作起始導到的,即在makefile中輸入命令要先以tab鍵退格再輸入命令及內容。