makefile中的自動化變數 , ,

2022-09-08 15:15:13 字數 3071 閱讀 4578

makefile中的自動化變數$*

自動化變數

模式規則中,規則的目標和依賴檔名代表了一類檔名;規則的命令是對所有這一類檔案重建過程的描述,顯然,在命令中不能出現具體的檔名,否則模式規則失去意義。那麼在模式規則的命令列中該如何表示檔案,將是本小節的討論的重點。

假如你需要書寫乙個將.c 檔案編譯到.o 檔案的模式規則,那麼你該如何為gcc 書寫正確的源檔名?當然了,不能使用任何具體的檔名,因為在每一次執行模式規則時源檔名都是不一樣的。為了解決這個問題,就需要使用「自動環變數」,自動化變數的取值是根據具體所執行的規則來決定的,取決於所執行規則的目標和依賴檔名。

下面對所有的自動化變數進行說明:

$@

表示規則的目標檔名。如果目標是乙個文件檔案(linux中,一般稱.a 檔案為文件檔案,也稱為靜態庫檔案),那麼它代表這個文件的檔名。在多目標模式規則中,它代表的是哪個觸發規則被執行的目標檔名。

$%

當規則的目標檔案是乙個靜態庫檔案時,代表靜態庫的乙個成員名。例如,規則的目標是「foo.a(bar.o)」,那麼,「 $$%」的值就為「bar.o」,「 $@ 」的值為「foo.a」。如果目標不是靜態庫檔案,其值為空。

$<

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

$?

所有比目標檔案更新的依賴檔案列表,空格分割。如果目標是靜態庫檔名,代表的是庫成員(.o 檔案)。

$^

規則的所有依賴檔案列表,使用空格分隔。如果目標是靜態庫檔案,它所代表的只能是所有庫成員(.o 檔案)名。乙個檔案可重複的出現在目標的依賴中,變數「*」只

記錄它的

一次引用

情況。就

是說變數

「^*」會去掉重複的依賴檔案。

$+

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

$*

在模式規則和靜態模式規則中,代表「莖」。「莖」是目標模式中「% 」所代表的部分(當檔名中存在目錄時,「莖」也包含目錄(斜槓之前)部分,可參考 10.5.4 模式的匹配 一小節)。例如:檔案「dir/a.foo.b」,當目標的模式為「a.%.b 」時,「$* 」的值為「dir/a.foo 」。「莖」對於構造相關檔名非常有用。

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

1.對於乙個明確指定的規則來說不存在「莖」,這種情況下「∗」

的含義發

生改變。

此時,如

果目標文

件名帶有

乙個可識

別的字尾

(參考10.7字尾

規則一節

),那麼

「* 」表示檔案中除字尾以外的部分。例如:「foo.c」 則「∗

」的值為

:「fo

o」,因

為.c是

乙個可識

別的檔案

字尾名。

gunm

ake對

明確規則

的這種奇

怪的處理

行為是為

了和其它

版本的m

ake兼

容。通常

,在除靜

態規則和

模式規則

以外,明

確指定目

標檔案的

規則中應

該避免使

用這個變

量。2.當

明確指定

檔名的

規則中目

標檔名

包含不可

識別的後

綴時,此

變數為空

。自動化

變數「?」在顯式規則中也是非常有用的,使用它規則可以指定只對更新

以後的依賴檔案進行操作。例如,靜態庫檔案「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)」的

值為「d

ir」。

如果「@ 」不存在斜槓,其值就是「. 」(當前目錄)。注意它和 函

數「dir」的區別! (@

f)目標

檔案的完

整檔名

中除目錄

以外的部

分(實際

檔名)

。如果「

@ 」為

「dir/foo.o 」,那麼「(@

f)」只

就是「f

oo.o

」。「(@f) 」等價於函式「(n

otdi

r@) 」。 (∗

d)(*f)

分別代表目標「莖」中的目錄部分和檔名部分。

((%f)

當以如「archive(member) 」形式靜態庫為目標時,分別表示庫檔案成員

「member」名中的目錄部分和檔名部分。它僅對這種形式的規則目標有效。

$(

makefile中自動化變數

所謂自動化變數,就是這種變數會把模式中所定義的一系列的檔案自動地挨個取出,直至所有的符合模式的檔案都取完了。這種自動化變數只應出現在規則的命令中。下面是所有的自動化變數及其說明 表示規則中的目標檔案集。在模式規則中,如果有多個目標,那麼,就是匹配於目標中模式定義的集合。僅當目標是函式庫檔案中,表示規...

makefile中的自動化變數 , ,

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

makefile中的自動化變數 , ,

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