上一項:,上一層:Makefile 慣例   [目錄][索引]


7.2.7 安裝命令類別

在編寫 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 目錄中刪除條目。

如果 installuninstall 目標有任何充當安裝子程序的依賴項,那麼您應該以類別行開始每個依賴項的命令,並且也以類別行開始主要目標的命令。這樣,您可以確保每個命令都放置在正確的類別中,無論實際執行哪個依賴項。

安裝前和安裝後命令不應執行除了以下程式之外的任何程式

[ 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 慣例   [目錄][索引]