下一主題:,上一主題:,上一層:Makefile 慣例   [目錄][索引]


7.2.6 使用者的標準目標

所有 GNU 程式的 Makefile 中應包含以下目標

all

編譯整個程式。這應為預設目標。此目標不需要重建任何文件檔案;Info 檔案通常應包含在發行版本中,而 DVI(及其他文件格式)檔案應僅在明確要求時建立。

預設情況下,Make 規則應使用 ‘-g’ 進行編譯和連結,以便可執行程式具有偵錯符號。否則,當程式崩潰時,您基本上束手無策,並且通常很難用全新的建置重現問題。

install

編譯程式,並將可執行檔、函式庫等複製到它們實際使用時應存放的檔案名稱位置。如果有一個簡單的測試可以驗證程式是否已正確安裝,則此目標應執行該測試。

安裝時請勿移除可執行檔的符號資訊 (strip)。這有助於日後可能需要的除錯,而且現在磁碟空間便宜,動態載入器通常確保在正常執行期間不會載入除錯區段。需要移除符號資訊二進位檔的使用者可以調用 install-strip 目標來執行此操作。

如果可能,編寫 install 目標規則時,使其在 ‘make all’ 剛完成的情況下,不會修改程式建置目錄中的任何內容。這對於以一個使用者名稱建置程式,並以另一個使用者名稱安裝程式來說很方便。

命令應建立所有要安裝檔案的目錄,如果這些目錄尚不存在。這包括指定為變數 prefixexec_prefix 值的目錄,以及所有需要的子目錄。一種方法是使用如下所述的 installdirs 目標。

在任何安裝 man page 的命令之前使用 ‘-’,以便 make 將忽略任何錯誤。這是為了應對某些系統可能未安裝 Unix man page 文件系統的情況。

安裝 Info 檔案的方法是使用 $(INSTALL_DATA)(請參閱 命令變數)將它們複製到 $(infodir) 中,然後在 install-info 程式存在時執行它。install-info 是一個程式,用於編輯 Info dir 檔案,以新增或更新給定 Info 檔案的選單項目;它是 Texinfo 套件的一部分。

這是一個安裝 Info 檔案的範例規則,它也嘗試處理一些額外情況,例如 install-info 不存在。

do-install-info: foo.info installdirs
        $(NORMAL_INSTALL)
# Prefer an info file in . to one in srcdir.
        if test -f foo.info; then d=.; \
         else d="$(srcdir)"; fi; \
        $(INSTALL_DATA) $$d/foo.info \
          "$(DESTDIR)$(infodir)/foo.info"
# Run install-info only if it exists.
# Use 'if' instead of just prepending '-' to the
# line so we notice real errors from install-info.
# Use '$(SHELL) -c' because some shells do not
# fail gracefully when there is an unknown command.
        $(POST_INSTALL)
        if $(SHELL) -c 'install-info --version' \
           >/dev/null 2>&1; then \
          install-info --dir-file="$(DESTDIR)$(infodir)/dir" \
                       "$(DESTDIR)$(infodir)/foo.info"; \
        else true; fi

在編寫 install 目標時,您必須將所有命令分為三類:一般命令、預先安裝 命令和 後安裝 命令。請參閱 安裝命令類別

install-html
install-dvi
install-pdf
install-ps

這些目標安裝 Info 格式以外的文件;它們旨在由安裝套件的人員在需要該格式時明確調用。GNU 偏好 Info 檔案,因此這些檔案必須由 install 目標安裝。

當您有許多文件檔案要安裝時,我們建議您安排這些目標安裝到適當安裝目錄(例如 htmldir)的子目錄中,以避免衝突和混亂。舉例來說,如果您的套件有多個手冊,並且您希望安裝包含許多檔案的 HTML 文件(例如 makeinfo --html 輸出的「分割」模式),您肯定會希望使用子目錄,否則不同手冊中具有相同名稱的兩個節點將互相覆寫。

請使這些 install-format 目標調用 format 目標的命令,例如,通過使 format 成為依賴項。

uninstall

刪除所有已安裝的檔案——即 ‘install’ 和 ‘install-*’ 目標建立的副本。

此規則不應修改執行編譯的目錄,而僅應修改安裝檔案的目錄。

卸載命令分為三個類別,就像安裝命令一樣。請參閱 安裝命令類別

install-strip

類似 install,但在安裝時移除可執行檔的符號資訊。在簡單的情況下,此目標可以簡單地使用 install 目標

install-strip:
        $(MAKE) INSTALL_PROGRAM='$(INSTALL_PROGRAM) -s' \
                install

但是,如果套件除了實際的可執行檔外還安裝腳本,則 install-strip 目標不能僅僅參考 install 目標;它必須移除可執行檔的符號資訊,但不能移除腳本的。

install-strip 不應移除正在複製以進行安裝的建置目錄中可執行檔的符號資訊。它應該只移除已安裝副本的符號資訊。

通常,除非您確定程式沒有錯誤,否則我們不建議移除可執行檔的符號資訊。但是,安裝一個移除符號資訊的可執行檔以供實際執行,同時將未移除符號資訊的可執行檔保存在其他地方以防出現錯誤,可能是合理的。

clean

刪除目前目錄中通常由建置程式所建立的所有檔案。如果其他目錄中的檔案是由此 makefile 建立的,也將其刪除。但是,不要刪除記錄配置的檔案。同時保留可以通過建置建立,但通常不會建立的檔案,因為發行版本已包含它們。無需刪除使用 ‘mkdir -p’ 建立的父目錄,因為它們可能本來就存在。

如果 .dvi 檔案不是發行版本的一部分,則在此處刪除它們。

distclean

刪除目前目錄中(或由此 makefile 建立)由配置或建置程式所建立的所有檔案。如果您已解壓縮原始碼並建置程式,而沒有建立任何其他檔案,則 ‘make distclean’ 應僅保留發行版本中的檔案。但是,無需刪除使用 ‘mkdir -p’ 建立的父目錄,因為它們可能本來就存在。

mostlyclean

類似 ‘clean’,但可能會避免刪除一些人們通常不希望重新編譯的檔案。例如,GCC 的 ‘mostlyclean’ 目標不會刪除 libgcc.a,因為重新編譯它很少需要且耗費大量時間。

maintainer-clean

刪除幾乎所有可以使用此 Makefile 重建的內容。這通常包括 distclean 刪除的所有內容,以及更多內容:Bison 產生的 C 原始碼檔案、標籤表、Info 檔案等等。

我們之所以說「幾乎所有內容」,是因為即使可以使用 Makefile 中的規則重新建立 configure,執行命令 ‘make maintainer-clean’ 也不應刪除 configure。更廣泛地說,‘make maintainer-clean’ 不應刪除任何運行 configure 然後開始建置程式所需存在的內容。此外,無需刪除使用 ‘mkdir -p’ 建立的父目錄,因為它們可能本來就存在。這些是唯一的例外;maintainer-clean 應刪除所有其他可以重建的內容。

maintainer-clean’ 目標旨在供套件維護者使用,而不是普通使用者。您可能需要特殊工具來重建 ‘make maintainer-clean’ 刪除的一些檔案。由於這些檔案通常包含在發行版本中,因此我們不注意使其易於重建。如果您發現需要再次解壓縮完整發行版本,請不要責怪我們。

為了幫助使用者意識到這一點,特殊 maintainer-clean 目標的命令應以以下兩者開頭

@echo 'This command is intended for maintainers to use; it'
@echo 'deletes files that may need special tools to rebuild.'
TAGS

更新此程式的標籤表。

info

產生任何需要的 Info 檔案。編寫規則的最佳方式如下

info: foo.info

foo.info: foo.texi chap1.texi chap2.texi
        $(MAKEINFO) $(srcdir)/foo.texi

您必須在 Makefile 中定義變數 MAKEINFO。它應執行 makeinfo 程式,該程式是 Texinfo 發行版本的一部分。

通常,GNU 發行版本附帶 Info 檔案,這表示 Info 檔案存在於原始碼目錄中。因此,Info 檔案的 Make 規則應在原始碼目錄中更新它。當使用者建置套件時,通常 Make 不會更新 Info 檔案,因為它們已經是最新的。

dvi
html
pdf
ps

以給定格式產生文件檔案。這些目標應始終存在,但如果無法產生給定的輸出格式,則任何或所有目標都可以是空操作 (no-op)。這些目標不應是 all 目標的依賴項;使用者必須手動調用它們。

這是一個從 Texinfo 產生 DVI 檔案的範例規則

dvi: foo.dvi

foo.dvi: foo.texi chap1.texi chap2.texi
        $(TEXI2DVI) $(srcdir)/foo.texi

您必須在 Makefile 中定義變數 TEXI2DVI。它應執行程式 texi2dvi,該程式是 Texinfo 發行版本的一部分。(texi2dvi 使用 TeX 來完成實際的格式化工作。TeX 不與 Texinfo 一起發行。)或者,僅編寫依賴項,並允許 GNU make 提供命令。

這是另一個範例,這個範例是關於從 Texinfo 產生 HTML

html: foo.html

foo.html: foo.texi chap1.texi chap2.texi
        $(TEXI2HTML) $(srcdir)/foo.texi

同樣,您需要在 Makefile 中定義變數 TEXI2HTML;例如,它可能會執行 makeinfo --no-split --htmlmakeinfo 是 Texinfo 發行版本的一部分)。

dist

為此程式建立發行版本 tar 檔案。應設定 tar 檔案,使其中的檔案名稱以子目錄名稱開頭,該子目錄名稱是它作為發行版本的套件名稱。此名稱可以包含版本號。

例如,GCC 1.40 版的發行版本 tar 檔案會解壓縮到名為 gcc-1.40 的子目錄中。

最簡單的方法是建立一個適當命名的子目錄,使用 lncp 將正確的檔案安裝到其中,然後 tar 該子目錄。

使用 gzip 壓縮 tar 檔案。例如,GCC 1.40 版的實際發行版本檔案名為 gcc-1.40.tar.gz。支援其他免費壓縮格式也是可以的。

dist 目標應明確依賴發行版本中的所有非原始碼檔案,以確保它們在發行版本中是最新的。請參閱 製作發行版本

check

執行自我測試(如果有的話)。使用者必須在執行測試之前建置程式,但不需要安裝程式;您應編寫自我測試,使其在程式已建置但未安裝時也能運作。

以下目標建議作為慣用名稱,適用於它們有用的程式。

installcheck

執行安裝測試(如果有的話)。使用者必須在執行測試之前建置並安裝程式。您不應假設 $(bindir) 在搜尋路徑中。

installdirs

新增一個名為 ‘installdirs’ 的目標來建立檔案安裝目錄及其父目錄很有用。有一個名為 mkinstalldirs 的腳本對此很方便;您可以在 Gnulib 套件中找到它。您可以使用如下規則

# Make sure all installation directories (e.g. $(bindir))
# actually exist by making them if necessary.
installdirs: mkinstalldirs
        $(srcdir)/mkinstalldirs $(bindir) $(datadir) \
                                $(libdir) $(infodir) \
                                $(mandir)

或者,如果您希望支援 DESTDIR(強烈建議),

# Make sure all installation directories (e.g. $(bindir))
# actually exist by making them if necessary.
installdirs: mkinstalldirs
        $(srcdir)/mkinstalldirs \
            $(DESTDIR)$(bindir) $(DESTDIR)$(datadir) \
            $(DESTDIR)$(libdir) $(DESTDIR)$(infodir) \
            $(DESTDIR)$(mandir)

此規則不應修改執行編譯的目錄。它應該只建立安裝目錄。


下一主題:,上一主題:,上一層:Makefile 慣例   [目錄][索引]