Linux中的自動(dòng)化變量
模式規(guī)則中,規(guī)則的目標(biāo)和依賴文件名代表了一類文件名;規(guī)則的命令是對(duì)所有這一類文件重建過程的描述,顯然,在命令中不能出現(xiàn)具體的文件名,否則模式規(guī)則失去意義。那么在模式規(guī)則的命令行中該如何表示文件,將是本小節(jié)的討論的重點(diǎn)。
假如你需要書寫一個(gè)將.c文件編譯到.o文件的模式規(guī)則,那么你該如何為gcc書寫正確的源文件名?當(dāng)然了,不能使用任何具體的文件名,因?yàn)樵诿恳淮螆?zhí)行模式規(guī)則時(shí)源文件名都是不一樣的。為了解決這個(gè)問題,就需要使用“自動(dòng)環(huán)變量”,自動(dòng)化變量的取值是根據(jù)具體所執(zhí)行的規(guī)則來決定的,取決于所執(zhí)行規(guī)則的目標(biāo)和依賴文件名。
下面對(duì)所有的自動(dòng)化變量進(jìn)行說明:
$@
表示規(guī)則的目標(biāo)文件名。如果目標(biāo)是一個(gè)文檔文件(Linux中,一般稱.a文件為文檔文件,也稱為靜態(tài)庫(kù)文件),那么它代表這個(gè)文檔的文件名。在多目標(biāo)模式規(guī)則中,它代表的是哪個(gè)觸發(fā)規(guī)則被執(zhí)行的目標(biāo)文件名。
$%
當(dāng)規(guī)則的目標(biāo)文件是一個(gè)靜態(tài)庫(kù)文件時(shí),代表靜態(tài)庫(kù)的一個(gè)成員名。例如,規(guī)則的目標(biāo)是“foo.a(bar.o)”,那么,“$%”的值就為“bar.o”,“$@”的值為“foo.a”。如果目標(biāo)不是靜態(tài)庫(kù)文件,其值為空。
$<
規(guī)則的第一個(gè)依賴文件名。如果是一個(gè)目標(biāo)文件使用隱含規(guī)則來重建,則它代表由隱含規(guī)則加入的第一個(gè)依賴文件。
$?
所有比目標(biāo)文件更新的依賴文件列表,空格分割。如果目標(biāo)是靜態(tài)庫(kù)文件名,代表的是庫(kù)成員(.o文件)。
$^
規(guī)則的所有依賴文件列表,使用空格分隔。如果目標(biāo)是靜態(tài)庫(kù)文件,它所代表的只能是所有庫(kù)成員(.o文件)名。一個(gè)文件可重復(fù)的出現(xiàn)在目標(biāo)的依賴中,變量“$^”只記錄它的一次引用情況。就是說變量“$^”會(huì)去掉重復(fù)的依賴文件。
$+
類似“$^”,但是它保留了依賴文件中重復(fù)出現(xiàn)的文件。主要用在程序鏈接時(shí)庫(kù)的交叉引用場(chǎng)合。
$*
在模式規(guī)則和靜態(tài)模式規(guī)則中,代表“莖”。“莖”是目標(biāo)模式中“%”所代表的部分(當(dāng)文件名中存在目錄時(shí),“莖”也包含目錄(斜杠之前)部分)。例如:文件“dir/a.foo.b”,當(dāng)目標(biāo)的模式為“a.%.b”時(shí),“$*”的值為“dir/a.foo”。“莖”對(duì)于構(gòu)造相關(guān)文件名非常有用。
自動(dòng)化變量“$*”需要兩點(diǎn)說明:
1 對(duì)于一個(gè)明確指定的規(guī)則來說不存在“莖”,這種情況下“$*”的含義發(fā)生改變。此時(shí),如果目標(biāo)文件名帶有一個(gè)可識(shí)別的后綴,那么“$*”表示文件中除后綴以外的部分。例如:“foo.c”則“$*”的值為:“foo”,因?yàn)?c是一個(gè)可識(shí)別的文件后綴名。GUN make對(duì)明確規(guī)則的這種奇怪的處理行為是為了和其它版本的make兼容。通常,在除靜態(tài)規(guī)則和模式規(guī)則以外,明確指定目標(biāo)文件的規(guī)則中應(yīng)該避免使用這個(gè)變量。
2 當(dāng)明確指定文件名的規(guī)則中目標(biāo)文件名包含不可識(shí)別的后綴時(shí),此變量為空。
自動(dòng)化變量“$?”在顯式規(guī)則中也是非常有用的,使用它規(guī)則可以指定只對(duì)更新以后的依賴文件進(jìn)行操作。例如,靜態(tài)庫(kù)文件“libN.a”,它由一些.o文件組成。這個(gè)規(guī)則實(shí)現(xiàn)了只將更新后的.o文件加入到庫(kù)中:
lib: foo.o bar.o lose.o win.o
ar r lib $?
以上羅列的自動(dòng)化變量中。其中有四個(gè)在規(guī)則中代表文件名($@、$<、$%、$*)。而其它三個(gè)的在規(guī)則中代表一個(gè)文件名列表。GUN make中,還可以通過這七個(gè)自動(dòng)化變量來獲取一個(gè)完整文件名中的目錄部分和具體文件名部分。在這些變量中加入“D”或者“F”字符就形成了一系列變種的自動(dòng)環(huán)變量。這些變量會(huì)出現(xiàn)在以前版本的make中,在當(dāng)前版本的make中,可以使用“dir”或者“notdir”函數(shù)來實(shí)現(xiàn)同樣的功能。
$(@D)
表示目標(biāo)文件的目錄部分(不包括斜杠)。如果“$@”是“dir/foo.o”,那么“$(@D)”的值為“dir”。如果“$@”不存在斜杠,其值就是“.”(當(dāng)前目錄)。注意它和函數(shù)“dir”的區(qū)別!
$(@F)
目標(biāo)文件的完整文件名中除目錄以外的部分(實(shí)際文件名)。如果“$@”為“dir/foo.o”,那么“$(@F)”只就是“foo.o”。“$(@F)”等價(jià)于函數(shù)“$(notdir $@)”。
$(*D)
$(*F)
分別代表目標(biāo)“莖”中的目錄部分和文件名部分。
$(%D)
$(%F)