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)你可以使用模式規則來定義一個隱含規則。一個模式規則就好像一個一般的規則,只是在規則中,目標的定義需要有%
字元。%
的意思是表示一個或多個任意字元。在依賴目標中同樣可以使用%
,只是依賴目標中的%
的取值,取決於其目標。有一點需要注意的是,%
%
則發生在執行時。
(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關心的是依賴的檔名和生成目標的命令這兩件事。