makefile中的自動化變數 , ,

2021-06-23 09:41:30 字數 3447 閱讀 9323

makefile中的自動化變數$@,$%,$

自動化變數 

模式規則中,規則的目標和依賴檔名代表了一類檔名;規則的命令是對所有這

一類檔案重建過程的描述,顯然,在命令中不能出現具體的檔名,否則模式規則失去

意義。那麼在模式規則的命令列中該如何表示檔案,將是本小節的討論的重點。 

假如你需要書寫乙個將.c 檔案編譯到.o 檔案的模式規則,那麼你該如何為gcc 書寫

正確的源檔名?當然了,不能使用任何具體的檔名,因為在每一次執行模式規則時

源檔名都是不一樣的。為了解決這個問題,就需要使用「自動環變數」,自動化變數

的取值是根據具體所執行的規則來決定的,取決於所執行規則的目標和依賴檔名。 

下面對所有的自動化變數進行說明:   www.2cto.com  

$@ 表示規則的目標檔名。如果目標是乙個文件檔案(

linux中,一般稱.a 檔案為

文件檔案,也稱為靜態庫檔案),那麼它代表這個文件的檔名。在多目標模式

規則中,它代表的是哪個觸發規則被執行的目標檔名。 

$% 當規則的目標檔案是乙個靜態庫檔案時,代表靜態庫的乙個成員名。例如,規則

的目標是「foo.a(bar.o)」,那麼,「 $%」的值就為「bar.o」,「 $@ 」的值為「foo.a」。

如果目標不是靜態庫檔案,其值為空。 

$< 

規則的第乙個依賴檔名。如果是乙個目標檔案使用隱含規則來重建,則它代表

由隱含規則加入的第乙個依賴檔案。 

$? 所有比目標檔案更新的依賴檔案列表,空格分割。如果目標是靜態庫檔名,代

表的是庫成員(.o 檔案)。   www.2cto.com  

$^ 規則的所有依賴檔案列表,使用空格分隔。如果目標是靜態庫檔案,它所代表的

只能是所有庫成員(.o 檔案)名。乙個檔案可重複的出現在目標的依賴中,變數

「$^」只記錄它的一次引用情況。就是說變數「$^」會去掉重複的依賴檔案。 

$+ 類似「$^」,但是它保留了依賴檔案中重複出現的檔案。主要用在程式鏈結時庫

的交叉引用場合。 

$* 在模式規則和靜態模式規則中,代表「莖」。「莖」是目標模式中「% 」所代表的

部分(當檔名中存在目錄時,「莖」也包含目錄(斜槓之前)部分,可參考  10.5.4 

模式的匹配  一小節)。例如:檔案「dir/a.foo.b」,當目標的模式為「a.%.b 」時,

「$* 」的值為「dir/a.foo 」。「莖」對於構造相關檔名非常有用。 

自動化變數「$* 」需要兩點說明: 

?   對於乙個明確指定的規則來說不存在「莖」,這種情況下「$* 」的含義發

生改變。此時,如果目標檔名帶有乙個可識別的字尾(參考  10.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」函式來實現同樣的功能(可

參考  8.3  檔名處理函式  一節)。 

$(@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中的自動化變數 , ,

自動化變數 模式規則中,規則的目標和依賴檔名代表了一類檔名 規則的命令是對所有這一類檔案重建過程的描述,顯然,在命令中不能出現具體的檔名,否則模式規則失去意義。那麼在模式規則的命令列中該如何表示檔案,將是本小節的討論的重點。假如你需要書寫乙個將.c 檔案編譯到.o 檔案的模式規則,那麼你該如何為gc...

makefile中的自動化變數 , ,

makefile中的自動化變數 自動化變數 模式規則中,規則的目標和依賴檔名代表了一類檔名 規則的命令是對所有這一類檔案重建過程的描述,顯然,在命令中不能出現具體的檔名,否則模式規則失去意義。那麼在模式規則的命令列中該如何表示檔案,將是本小節的討論的重點。假如你需要書寫乙個將.c 檔案編譯到.o 檔...