1. 程式人生 > >makefile學習總結-----萬用字元使用

makefile學習總結-----萬用字元使用

Maekfile中表示一個單一的檔名時可使用萬用字元。可使用的萬用字元有:“*”、“?”和“[…]”。在Makefile中萬用字元的用法和含義和Linux(unix)的Bourne shell完全相同。例如,“*.c”代表了當前工作目錄下所有的以“.c”結尾的檔案等。但是在Makefile中這些統配符並不是可以用在任何地方,Makefile中統配符可以出現在以下兩種場合:

1.        可以用在規則的目標、依賴中,此時make會自動將其展開;

2.        可出現在規則的命令中,其展開是在shell在執行此命令時完成。

除這兩種情況之外的其它上下文中,不能直接使用萬用字元。二是需要通過函式“wildcard”(可參考 7.3 檔名處理函式 一節)來實現。

如果規則中的某一個檔案的檔名包含作為統配符的字元(“*”、“.”字元),在使用檔案時需要對檔名中的統配字元進行轉義處理,使用反斜線(\)來進行萬用字元的轉義。例如“foo\*bar”,在Makefile中它表示了檔案“foo*bar”。Makefile中對一些特殊字元的轉移和B-SHELL以及C語言中的基本上相同。

另外需要注意:在Linux(unix)中,以波浪線“~”開始的檔名有特殊含義。

單獨使用它或者其後跟一個斜線(~/),代表了當前使用者的宿主目錄。(在shell下可以通過命令“echo ~(~\)”來檢視)。例如“~/bin”代表“/home/username/bin/”(當前使用者宿主目錄下的bin目錄)

波浪線之後跟一個單詞(~word),其代表由這個“word”所指定的使用者的宿主目錄。例如“~john/bin”就是代表使用者john的宿主目錄下的bin目錄。

在一些系統中(像MS-DOS和MS-Windows),使用者沒有各自的宿主目錄,此情況下可通過設定環境變數“HOME”來模擬。

萬用字元代替了你一系列的檔案,如“*.c”表示所以後綴為c的檔案。一個需要我們注意的是,如果我們的檔名中有萬用字元,如:“*”,那麼可以用轉義字元“/”,如“/*”來表示真實的“*”字元,而不是任意長度的字串。

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

    clean:
         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)

這種用法由關鍵字“wildcard”指出,關於Makefile的關鍵字,我們將在後面討論。