上一項:標準目標,上一層:Makefile 慣例 [目錄][索引]
在編寫 install
目標時,您必須將所有命令分為三類:一般命令、安裝前 命令和 安裝後 命令。
一般命令將檔案移動到它們正確的位置,並設定它們的模式。除了完全來自它們所屬套件的檔案外,它們不得修改任何其他檔案。
安裝前和安裝後命令可能會修改其他檔案;特別是,它們可以編輯全域組態檔或資料庫。
安裝前命令通常在一般命令之前執行,而安裝後命令通常在一般命令之後執行。
安裝後命令最常見的用途是執行 install-info
。這不能使用一般命令完成,因為它會修改一個檔案(Info 目錄),該檔案並非完全且僅來自正在安裝的套件。它是一個安裝後命令,因為它需要在安裝套件 Info 檔案的一般命令之後執行。
大多數程式不需要任何安裝前命令,但我們提供此功能以備不時之需。
若要將 install
規則中的命令分類為這三種類別,請在它們之間插入類別行。類別行指定後續命令的類別。
類別行由一個 Tab 字元和對一個特殊的 Make 變數的引用組成,末尾可以加上可選的註解。您可以使用三個變數,每個類別一個;變數名稱指定類別。類別行在一般執行中是空操作,因為這三個 Make 變數通常未定義(而且您不應該在 makefile 中定義它們)。
以下是三種可能的類別行,每種都帶有註解來解釋其含義
$(PRE_INSTALL) # Pre-install commands follow. $(POST_INSTALL) # Post-install commands follow. $(NORMAL_INSTALL) # Normal commands follow.
如果您在 install
規則的開頭不使用類別行,則在第一個類別行之前,所有命令都歸類為一般命令。如果您不使用任何類別行,則所有命令都歸類為一般命令。
以下是 uninstall
的類別行
$(PRE_UNINSTALL) # Pre-uninstall commands follow. $(POST_UNINSTALL) # Post-uninstall commands follow. $(NORMAL_UNINSTALL) # Normal commands follow.
通常,預先卸載命令將用於從 Info 目錄中刪除條目。
如果 install
或 uninstall
目標有任何充當安裝子程序的依賴項,那麼您應該以類別行開始每個依賴項的命令,並且也以類別行開始主要目標的命令。這樣,您可以確保每個命令都放置在正確的類別中,無論實際執行哪個依賴項。
安裝前和安裝後命令不應執行除了以下程式之外的任何程式
[ basename bash cat chgrp chmod chown cmp cp dd diff echo expand expr false find getopt grep gunzip gzip hostname install install-info kill ldconfig ln ls md5sum mkdir mkfifo mknod mv printenv pwd rm rmdir sed sort tee test touch true uname xargs yes
以這種方式區分命令的原因是為了製作二進制套件。通常,二進制套件包含所有需要安裝的可執行檔和其他檔案,並且有其自己的安裝方法——因此它不需要執行一般安裝命令。但是安裝二進制套件確實需要執行安裝前和安裝後命令。
用於構建二進制套件的程式通過提取安裝前和安裝後命令來工作。以下是一種提取安裝前命令的方法(需要 make
的 -s
選項來靜音有關進入子目錄的消息)
make -s -n install -o all \ PRE_INSTALL=pre-install \ POST_INSTALL=post-install \ NORMAL_INSTALL=normal-install \ | gawk -f pre-install.awk
其中檔案 pre-install.awk
可能包含以下內容
$0 ~ /^(normal-install|post-install)[ \t]*$/ {on = 0} on {print $0} $0 ~ /^pre-install[ \t]*$/ {on = 1}
上一項:標準目標,上一層:Makefile 慣例 [目錄][索引]