Makefile中wildcard、notdir、patsubst函數的用法

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鍵退格再輸入命令及內容。
 

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