本系列文章均翻譯自make官方文檔:make Manual,github同步項目:question
10.5 匹配規則與自動變量
10.5.1 匹配規則介紹
%
字符匹配任何非空字符串。%
匹配到的字符串叫做stem
(詞幹)。
prerequisites中的*%代表了目標中%匹配的同樣的stem*。
%.o : %.c ; recipe…
要求xxx.c必須存在或者可以創建。
10.5.4 模式是如何匹配的
模式不包括/
時,文件名中的目錄名會被先移除,匹配完文件名的部分之後,再把目錄部分加上來。例:
e%t匹配文件src/eat,stem就是src/a。
note:已經存在或被引用的prerequisites的優先級總是比需要被其它隱含規則創建的prerequisites高。
多個匹配規則滿足時:
- make會選擇stem最短的那個規則。
- 如果stem等長,選擇第一個發現的規則。
10.5.5 匹配任何文件的模式規則
模式規則的目標只是一個%
的時候,它會匹配任何一個文件名,稱作match-anything規則。
每次定義這種規則的時候,必須選擇下面的一項進行約束:
- 使用
::
標記規則爲terminal,只有prerequisites已經存在的時候才能應用規則。 - 非終端規則。non-terminal match-anything rule不能應用於指定了文件類型的文件名。???
10.5.3 自動變量
自動變量只在recipe
中生效。但是,make的二次擴展特性(see Secondary Expansion)允許在prerequisites
中使用自動變量的值。
- $@ - 目標文件名。目標是歸檔成員時,代表的是歸檔文件名。在有多個生成目標的匹配規則情況下,代表了任何引起recipe執行的目標文件。
- @代表foo.a,$%*代表bar.o。
- $< - 第一個prerequisites的名字。如果目標從隱含規則執行recipe,這會成爲第一個prerequisite。see Implicit Rules.
- $? - 所有的比目標新的prerequisites的名字,空格分隔。對於是歸檔成員的prerequisites,只有命名的成員被使用。???
- $^ - 所有的prerequisites,空格分隔。歸檔成員的規則同上。如果prerequisites中有重複多次的prerequisite,那麼該變量只會包含一個重複的prerequisite。此變量不包括order-only prerequisites(指只有目標不存在的時候纔會參與目標的生成的prerequisites,與常規的用
|
分隔)。 - ^`類似,不過它包含重複的prerequisite。
- $| - 所有的
order-only prerequisites
,空格分隔。 - $* - 隱含規則匹配的詞幹。以後再看!!!
- @=‘dir/foo.a’,$(@D)=‘dir’。如果目標沒有
/
,此值爲.
。 - (notdir $@)`相等。
以下變量都是類似的:
- $(*D)
- $(*F)
- $(%D)
- $(%F)
- $(<D)
- $(<F)
- $(^D)
- $(^F)
- $(+D)
- $(+F)
- $(?D)
- $(?F)