GNU make 的主要預定義變數

2021-05-18 11:20:24 字數 2244 閱讀 3352

gnu make 的主要預定義變數

預定義變數                      含義

$* 不包含副檔名的目標檔名稱。

$+ 所有的依賴檔案,以空格分開,並以出現的先後為序,可能包含重複的依賴檔案。

$< 第乙個依賴檔案的名稱。

$? 所有的依賴檔案,以空格分開,這些依賴檔案的修改日期比目標的建立日期晚。

$@ 目標的完整名稱。

$^ 所有的依賴檔案,以空格分開,不包含重複的依賴檔案。

$% 如果目標是歸檔成員,則該變數表示目標的歸檔成員名稱。例如,如果目標名稱

為 mytarget.so(image.o),則 $@ 為 mytarget.so,而 $% 為 image.o。

ar 歸檔維護程式的名稱,預設值為 ar。

arflags 歸檔維護程式的選項。

as 匯程式設計序的名稱,預設值為 as。

asflags 匯程式設計序的選項。

cc c 編譯器的名稱,預設值為 cc。

ccflags c 編譯器的選項。

cpp c 預編譯器的名稱,預設值為 $(cc) -e。

cppflags c 預編譯的選項。

cxx c++ 編譯器的名稱,預設值為 g++。

cxxflags c++ 編譯器的選項。

fc fortran 編譯器的名稱,預設值為 f77。

fflags fortran 編譯器的選項。

在模式規則中,規則的目標和依賴檔名代表了一類檔名。命令是對所有這一類檔案重建過程的描述,顯然,在命令中不能指定特定的檔名,否則模式規則將沒

有了意義。那麼在模式規則的命令列中該如何表示檔案,將成我們這一小節的討論重點。make中使用了「自動環變數」來實現這個目的,自動化變數的取值是根

據具體的規則決定的,就是說對不同的規則其所代表的檔名不同。

前邊我們也看到了很多例子中使用到了自動化變數。下面對所有的自動化變數進行說明:

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

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

$<

規則的第乙個依賴檔名。如果是隱含規則,則它代表通過目標指定的第乙個依賴檔案。

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

$^規則的所有依賴檔案列表,使用空格分隔。如果目標是靜態庫檔名,它所代表的只能是所有庫成員(.o檔案)名。乙個檔案可重複的出現在目標的依賴中,變數「$^」只記錄它的一次引用情況。就是說變數「$^」會去掉重複的依賴檔案。

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

$*在模式規則和靜態模式規則中,代表「莖」。「莖」是目標模式中「%」所代表的部分(當檔名中存在目錄時,「莖」也包含目錄(斜槓之前)部分)。例如:文

件「dir/a.foo.b」,當目標的模式為「a.%.b」時,「$*」的值為「dir/a.foo」。「莖」對於構造相關檔名非常有用。

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

ø        

對於乙個明確指定的規則來說不存在「莖」,這種情況下「$*」所代表的值發生變化。此時,如果目標檔名帶有乙個可識別的字尾,那麼「$*」表示檔案中除

字尾以外的部分。例如:「foo.c」則「$*」的值為:「foo」,因為.c是乙個可識別的檔案字尾名。gun

make對明確規則的這種奇怪的處理行為是為了和其它版本的make相容。通常,在除靜態規則和模式規則以外,明確指定目標檔案的規則中避免使用這個變

量。ø         當明確指定檔名的規則中目標檔名包含不可識別的字尾時,此變數為空。

自動化變數「$?」在顯式規則中也是非常有用的,規則中可以使用它來指定只對更新的依賴檔案進行操作。例如,函式庫檔案「libn.a」,它由一些.o檔案組成。

GNU make 的主要預定義變數

預定義變數 含義 不包含副檔名的目標檔名稱。所有的依賴檔案,以空格分開,並以出現的先後為序,可能包含重複的依賴檔案。第乙個依賴檔案的名稱。所有的依賴檔案,以空格分開,這些依賴檔案的修改日期比目標的建立日期晚。目標的完整名稱。所有的依賴檔案,以空格分開,不包含重複的依賴檔案。如果目標是歸檔成員,則該變...

GNU make 的主要預定義變數

4 gnu make 的主要預定義變數 gnu make 有許多預定義的變數,這些變數具有特殊的含義,可在規則中使用。表 1 5 給出了一些主要的 預定義變數,除這些變數外,gnu make 還將所有的環境變數作為自己的預定義變數。表 1 5 gnu make 的主要預定義變數 預定義變數 含義 不...

預定義變數

不包含副檔名的目標檔名稱。所有的依賴檔案,以空格分開,並以出現的先後為序,可能包含重複的依賴檔案。第乙個依賴檔案的名稱。所有的依賴檔案,以空格分開,這些依賴檔案的修改日期比目標的建立日期晚。目標的完整名稱。所有的依賴檔案,以空格分開,不包含重複的依賴檔案。如果目標是歸檔成員,則該 變數表示目標的歸檔...