MAKEFILE--通配符

如果我們想定義一系列比較類似的文件,我們很自然地就想起使用通配符。make支持三個通配符:“*”,“?”和“~”。這是和Unix的B-Shell是相同的。

波浪號(“~”)字符在文件名中也有比較特殊的用途。如果是“~/test”,這就表示當前用戶的$HOME目錄下的test目錄。而 “~hchen/test”則表示用戶hchen的宿主目錄下的test目錄。(這些都是Unix下的小知識了,make也支持)而在Windows或是 MS-DOS下,用戶沒有宿主目錄,那麼波浪號所指的目錄則根據環境變量“HOME”而定。

通配符代替了你一系列的文件,如“*.c”表示所有後綴爲c的文件。一個需要我們注意的是,如果我們的文件名中有通配符,如:“*”,那麼可以用轉義字符“\”,如“\*”來表示真實的“*”字符,而不是任意長度的字符串。

好吧,還是先來看幾個例子吧:

clean:
	rm -f *.o

其實在這個clean:後面可以加上你想做的一些事情,如果你想看到在編譯完後執行clean看看main.c的源代碼,你可以在加上cat這個命令,例子如下:

clean :
     cat main.c
      rm -f *.o

其結果你試一下就知道的。 上面這個例子我不多說了,這是操作系統Shell所支持的通配符。這是在命令中的通配符。

print: *.c
	lpr -p $?
	touch print

上面這個例子說明了通配符也可以在我們的規則中,目標print依賴於所有的[.c]文件。其中的“$?”是一個自動化變量,我會在後面給你講述。

objects = *.o

上面這個例子,表示了通配符同樣可以用在變量中。並不是說[*.o]會展開,不!objects的值就是“*.o”。Makefile中的變量其實就是C/C++中的宏。如果你要讓通配符在變量中展開,也就是讓objects的值是所有[.o]的文件名的集合,那麼,你可以這樣:

objects := $(wildcard *.o)

另給一個變量使用通配符的例子:

a. 列出一確定文件夾中的所有”.c"文件

objects := $(wildcard *.c)

b. 列出(a)中所有文件對應的".o"文件,在(c)中我們可以看到它是由make自動編譯出的。

$(patsubst %.c,%.o,$(wildcard *.c))

c. 由(a)(b)兩步,可寫出編譯並鏈接所有“.c"和”.o"文件

 objects := $(patsubst %.c,%.o,$(wildcard *.c))
 foo : $(objects)
        cc -o foo $(objects)  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章