1. 程式人生 > 實用技巧 >makefile學習筆記-13

makefile學習筆記-13

2、中間目標

(1)在預設情況下,對於中間目標,它和一般的目標有兩個地方有所不同:第一個不同是除非中間目標不存在,才會引發中間規則。第二個不同的是,只要目標成功產生,那麼,產生最終目標過程中,所產生的中間目標檔案會被以rm-f刪除。

(2)通常,一個被makefile指定成目標或是依賴目標的檔案不能被當作中介。然而,你可以明顯地說明一個檔案或是目標是中介目標,你可以使用偽目標.INTERMEDIATE來強制宣告。(如:.INTERMEDIATE:mid

(3)你也可以阻止make自動刪除中間目標,要做到這一點,你可以使用偽目標.SECONDARY來強制宣告(如:.SECONDARY:sec)。你還可以把你的目標,以模式的方式來指定(如:%.o

)成偽目標.PRECIOUS的依賴目標,以儲存被隱含規則所生成的中間檔案。

(4)Make會優化一些特殊的隱含規則,而不生成中間檔案。如,從檔案foo.c生成目標程式foo,按道理,make會編譯生成中間檔案foo.o,然後連結成foo,但在實際情況下,這一動作可以被一條cc的命令完成(cc–ofoofoo.c),於是優化過的規則就不會生成中間檔案。

3、定義模式規則

(1)你可以使用模式規則來定義一個隱含規則。一個模式規則就好像一個一般的規則,只是在規則中,目標的定義需要有%字元。%的意思是表示一個或多個任意字元。在依賴目標中同樣可以使用%,只是依賴目標中的%的取值,取決於其目標。有一點需要注意的是,%

的展開發生在變數和函式的展開之後,變數和函式的展開發生在make載入 Makefile時,而模式規則中的%則發生在執行時。

(2)模式規則中,至少在規則的目標定義中要包含%,否則,就是一般的規則。目標中的%定義表示對檔名的匹配,%表示長度任意的非空字串。例如:%.c表示以.c結尾的檔名(檔名的長度至少為3),而s.%.c則表示以s.開頭,.c結尾的檔名(檔名的長度至少為5)。

如果%定義在目標中,那麼,目標中的%的值決定了依賴目標中的%的值,也就是說,目標中模式的%決定了依賴目標中%的樣子。例如有一個模式規則如下:

%.o : %.c ; <command ......>;

其含義是,指出了怎麼從所有的.c

檔案生成相應的.o檔案的規則。如果要生成的目標是a.ob.o,那麼%.c就是a.cb.c

一旦依賴目標中的%模式被確定,那麼,make會被要求去匹配當前目錄下所有的檔名,一旦找到,make就會執行規則下的命令,所以,在模式規則中,目標可能會是多個的,如果由模式匹配出多個目標,make就會產生所有的模式目標,此時,make關心的是依賴的檔名和生成目標的命令這兩件事。