Linux中的自動化變數

來源:互聯網
上載者:User

Linux中的自動化變數 模式規則中,規則的目標和依賴檔案名稱代表了一類檔案名稱;規則的命令是對所有這一類檔案重建過程的描述,顯然,在命令中不能出現具體的檔案名稱,否則模式規則失去意義。那麼在模式規則的命令列中該如何表示檔案,將是本小節的討論的重點。 假如你需要書寫一個將.c檔案編譯到.o檔案的模式規則,那麼你該如何為gcc書寫正確的源檔案名稱?當然了,不能使用任何具體的檔案名稱,因為在每一次執行模式規則時源檔案名稱都是不一樣的。為瞭解決這個問題,就需要使用“自動環變數”,自動化變數的取值是根據具體所執行的規則來決定的,取決於所執行規則的目標和依賴檔案名稱。 下面對所有的自動化變數進行說明: $@ 表示規則的目標檔案名。如果目標是一個文檔檔案(Linux中,一般稱.a檔案為文檔檔案,也稱為靜態庫檔案),那麼它代表這個文檔的檔案名稱。在多目標模式規則中,它代表的是哪個觸發規則被執行的目標檔案名。 $% 當規則的目標檔案是一個靜態庫檔案時,代表靜態庫的一個成員名。例如,規則的目標是“foo.a(bar.o)”,那麼,“$%”的值就為“bar.o”,“$@”的值為“foo.a”。如果目標不是靜態庫檔案,其值為空白。 $< 規則的第一個依賴檔案名稱。如果是一個目標檔案使用隱含規則來重建,則它代表由隱含規則加入的第一個依賴檔案。 $? 所有比目標檔案更新的依賴檔案清單,空格分割。如果目標是靜態庫檔案名稱,代表的是庫成員(.o檔案)。 $^ 規則的所有依賴檔案清單,使用空格分隔。如果目標是靜態庫檔案,它所代表的只能是所有庫成員(.o檔案)名。一個檔案可重複的出現在目標的依賴中,變數“$^”只記錄它的一次引用情況。就是說變數“$^”會去掉重複的依賴檔案。 $+ 類似“$^”,但是它保留了依賴檔案中重複出現的檔案。主要用在程式連結時庫的交叉引用場合。 $* 在模式規則和靜態模式規則中,代表“莖”。“莖”是目標模式中“%”所代表的部分(當檔案名稱中存在目錄時,“莖”也包含目錄(斜杠之前)部分)。例如:檔案“dir/a.foo.b”,當目標的模式為“a.%.b”時,“$*”的值為“dir/a.foo”。“莖”對於構造相關檔案名稱非常有用。 自動化變數“$*”需要兩點說明: 1    對於一個明確指定的規則來說不存在“莖”,這種情況下“$*”的含義發生改變。此時,如果目標檔案名帶有一個可識別的尾碼,那麼“$*”表示檔案中除尾碼以外的部分。例如:“foo.c”則“$*”的值為:“foo”,因為.c是一個可識別的檔案尾碼名。GUN make對明確規則的這種奇怪的處理行為是為了和其它版本的make相容。通常,在除靜態規則和模式規則以外,明確指定目標檔案的規則中應該避免使用這個變數。 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”函數來實現同樣的功能。 $(@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) 分別表示所有依賴檔案的目錄部分和檔案部分(可存在重複檔案)。 $(?D) $(?F) 分別表示被更新的依賴檔案的目錄部分和檔案名稱部分。 在討論自動化變數時,為了和普通變數(如:“CFLAGS”)區別,我們直接使用了“$<”的形式。這種形式僅僅是為了和普通變數進行區別,沒有別的目的。其實對於自動環變數和普通變數一樣,代表規則第一個依賴檔案名稱的變數名實際上是“<”,我們完全可以使用“$(<)”來替代“$<”。但是在引用自動化變數時通常的做法是“$<”,因為自動化變數本身是一個特殊字元。 GUN make同時支援“Sysv”特性,允許在規則的依賴列表中使用特殊的變數引用(一般的自動化變數只能在規則的命令列中被引用)“$$@”、“$$(@D)”和“$$(@F)”(注意:要使用“$$”),它們分別代表了“目標的完整檔案名稱”、“目標檔案名中的目錄部分”和“目標的實際檔案名稱部分”。這三個特殊的變數只能用在明確指定目標檔案名的規則中或者是靜態模式規則中,不用於隱含規則中。另外Sysv make和GNU make對規則依賴的處理也不盡相同。Sysv make對規則的依賴進行兩次替換展開,而GUN make對依賴列表的處理只有一次,對其中的變數和函數引用直接進行展開。 自動化變數的這個古怪的特性完全是為了相容Sysv 版本的makefile檔案。在使用GNU make時可以不考慮這個,也可以在Makefile中使用偽目標“.POSIX”來禁止這一特性。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.