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


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”
則“ foo.cGUNmakemake使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)dir @ ”不存在斜杠,其值就是“. ”(當前目錄)。注意它和 函
數“dir”的區別!
(@F) @ ”為
“dir/foo.o ”,那么“ (@F)foo.o (@F) ”等價於函數“ (notdir @) ”。
(D) (*F)
分別代表目標“莖”中的目錄部分和文件名部分。
( (%F)
當以如“archive(member) ”形式靜態庫為目標時,分別表示庫文件成員
“member”名中的目錄部分和文件名部分。它僅對這種形式的規則目標有效。
$(

版權聲明:本文為博主原創文章,未經博主允許不得轉載。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM