在模式規則中,規則的目標和依賴檔名代表了一類檔名。命令是對所有這一類檔案重建過
程的描述,顯然,在命令中不能指定特定的檔名,否則模式規則將沒有了意義。那麼在模式規則
的命令列中該如何表示檔案,將成我們這一小節的討論重點。 make中使用了「自動環變數」來實
現這個目的,自動化變數的取值是根據具體的規則決定的,就是說對不同的規則其所代表的檔名
不同。前邊我們也看到了很多例子中使用到了自動化變數。下面對所有的自動化變數進行說明:
$@代表規則中的目標檔名。如果目標是乙個文件( linux中,一般稱.a檔案為文件),那麼
它代表這個文件的檔名。在多目標的模式規則中,它代表的是哪個觸發規則被執行的目標
檔名。
$%規則的目標檔案是乙個靜態庫檔案時,代表靜態庫的乙個成員名。例如,規則的目標是
「foo.a(bar.o)」,那麼,「$%」的值就為「bar.o」,「$@」的值為「foo.a」。如果目標不
是函式庫檔案,其值為空。
$<
規則的第乙個依賴檔名。如果是隱含規則,則它代表通過目標指定的第乙個依賴檔案。
$?所有比目標檔案更新的依賴檔案列表,空格分割。如果目標是靜態庫檔名,代表的是庫成
員( .o檔案)的更新情況。
$^規則的所有依賴檔案列表,使用空格分隔。如果目標是靜態庫檔名,它所代表的只能是所
有庫成員( .o檔案)名。乙個檔案可重複的出現在目標的依賴中,變數「$^」只記錄它的
一次引用情況。就是說變數「$^」會去掉重複的依賴檔案。
$+類似「$^」,但是它保留了依賴檔案中重複出現的檔案。主要用在程式鏈結時,庫的交叉引
用場合。
$*在模式規則和靜態模式規則中,代表「莖」。「莖」是目標模式中「%」所代表的部分(當
檔名中存在目錄時,「莖」也包含目錄(斜槓之前)部分,可參考 9.5.4 模式的匹配 一
小節)。例如:檔案「dir/a.foo.b」,當目標的模式為「a.%.b」時,「$*」的值為「dir/a.foo」。
「莖」對於構造相關檔名非常有用。
自動化變數「$*」需要兩點說明:
對於乙個明確指定的規則來說不存在「莖」,這種情況下「$*」所代表的值發生變
化。此時,如果目標檔名帶有乙個可識別的字尾(參考 9.7 字尾規則 一節),
那麼「$*」表示檔案中除字尾以外的部分。例如:「foo.c」則「$*」的值為:「foo」,
因為.c是乙個可識別的檔案字尾名。gun make對明確規則的這種奇怪的處理行為
是為了和其它版本的make相容。通常,在除靜態規則和模式規則以外,明確指定
目標檔案的規則中避免使用這個變數。
當明確指定檔名的規則中目標檔名包含不可識別的字尾時,此變數為空。
自動化變數「$?」在顯式規則中也是非常有用的,規則中可以使用它來指定只對更新的依賴文
件進行操作。例如,函式庫檔案「libn.a」,它由一些.o檔案組成。如下的規則實現了根據變化的.o
檔案更新庫檔案:
lib: foo.o bar.o lose.o win.o
ar r lib $?
上述列出的自動量變數中。其中有四個在規則中代表乙個檔名( $@、 $<、 $%、 $*)。而
其它三個的在規則中代表乙個檔名的列表。 gun make中,還可以通過這七個自動化變數來獲取
乙個完整檔名中的目錄部分或者具體檔名,需要在這些變數中加入「d」或者「f」字元。這樣
就形成了一系列變種的自動環變數。這些變數在以前版本的make中使用,在當前版本的make中,
可以使用「dir」或者「notdir」函式來實現同樣的功能。
$(@d)
代表目標檔案的目錄部分(去掉目錄部分的最後乙個斜槓)。如果「$@」是「dir/foo.o」,
那麼「$(@d)」的值為「dir」。如果「$@」不存在斜槓,其值就是「.」(當前目錄)。注
意它和函式「dir」 的區別!
$(@f)
目標檔案的完整檔名中除目錄以外的部分(實際檔名)。如果「$@」為「dir/foo.o」,
那麼「$(@f)」只就是「foo.o」。「$(@f)」等價於函式「$(notdir $@)」。
$(*d)
$(*f)
分別代表目標「莖」中的目錄部分和檔名部分。
$(%d)
$(%f)
當以如「archive(member)」形式靜態庫為目標時,分別表示庫檔案成員「member」名
中的目錄部分和檔名部分。它僅對這種形式的規則目標有效。
$($(分別表示規則中第乙個依賴檔案的目錄部分和檔名部分。
$(^d)
$(^f)
分別表示所有依賴檔案的目錄部分和檔案部分(不存在同一檔案)。
$(+d)
$(+f)
分別表示所有依賴檔案的目錄部分和檔案部分(可存在重複檔案)。
$(?d)
$(?f)
分別表示被更新的依賴檔案的目錄部分和檔案部分。
需要說明的是:在討論自動化變數時,為了和普通變數(如:「cflags」)的區別,我們直接
使用了「$<」的形式。這只是僅僅為了和普通變數區別,沒有別的目的。其實對於自動環變數和
普通變數一樣,代表規則第乙個依賴檔名的變數名實際上是「<」,我們完全可以使用「$(<)」
來替代「$<」。我們在引用自動化變數時通常的做法是形如「$<」,因為自動化變數是乙個字元。
gun make提供了支援「sysv」的特性,允許在規則的依賴列表中使用特殊的變數引用(一
般的自動化變數只能在規則的命令列中被引用)「$$@」、「$$(@d)」和「$$(@f)」(注意:要使
用「$$」),它們分別代表了「目標完整的檔名」、「目標檔名中的目錄部分」和「目標的實際文
件名部分」。
這三個特殊的變數只能用在明確指定目標檔名的規則中或者是靜態模式規則中,不能使用在
於隱含規則中。另外sysv make和gnu make對規則依賴的處理也不盡相同。 sysv make會對規
則的依賴進行兩次替換展開,而gun make對依賴列表的處理只有一次,對其中的引用直接進行展
開。自動化變數存在這個有點古怪的特性完全是為了相容sysv 版本的makefile檔案。我們在使用
gnu make時可以不考慮這個特性,也可以在makefile中使用偽目標「.posix」來禁止這一特性。
makefile自動化變數
makefile自動化變數 表示規則中的目標檔案集。在模式規則中,如果有多個目標,那麼,就是匹配於目標中模式定義的集合。僅當目標是函式庫檔案中,表示規則中的目標成員名。例如,如果乙個目標是 foo.a bar.o 那麼,就是 bar.o 就是 foo.a 如果目標不是函式庫檔案 unix下是 a w...
makefile 自動化變數
代表規則中的目標檔名。如果目標是乙個文件 linux中,一般稱.a檔案為文件 那麼它代表這個文件的檔名。在多目標的模式規則中,它代表的是哪個觸發規則被執行的目標檔名。規則的目標檔案是乙個靜態庫檔案時,代表靜態庫的乙個成員名。例如,規則的目標是 foo.a bar.o 那麼,的值就為 bar.o 的值...
Makefile自動化變數
在上述的模式規則中,目標和依賴檔案都是一系例的檔案,那麼我們如何書寫乙個命令來完成從不同的依賴檔案生成相應的目標?因為在每一次的對模式規則的解析時,都會是不同的目標和依賴檔案。自動化變數就是完成這個功能的。在前面,我們已經對自動化變數有所提涉,相信你看到這裡已對它有乙個感性認識了。所謂自動化變數,就...