下一主題:安裝命令類別,上一主題:目錄變數,上一層:Makefile 慣例 [目錄][索引]
所有 GNU 程式的 Makefile 中應包含以下目標
編譯整個程式。這應為預設目標。此目標不需要重建任何文件檔案;Info 檔案通常應包含在發行版本中,而 DVI(及其他文件格式)檔案應僅在明確要求時建立。
預設情況下,Make 規則應使用 ‘-g’ 進行編譯和連結,以便可執行程式具有偵錯符號。否則,當程式崩潰時,您基本上束手無策,並且通常很難用全新的建置重現問題。
編譯程式,並將可執行檔、函式庫等複製到它們實際使用時應存放的檔案名稱位置。如果有一個簡單的測試可以驗證程式是否已正確安裝,則此目標應執行該測試。
安裝時請勿移除可執行檔的符號資訊 (strip)。這有助於日後可能需要的除錯,而且現在磁碟空間便宜,動態載入器通常確保在正常執行期間不會載入除錯區段。需要移除符號資訊二進位檔的使用者可以調用 install-strip
目標來執行此操作。
如果可能,編寫 install
目標規則時,使其在 ‘make all’ 剛完成的情況下,不會修改程式建置目錄中的任何內容。這對於以一個使用者名稱建置程式,並以另一個使用者名稱安裝程式來說很方便。
命令應建立所有要安裝檔案的目錄,如果這些目錄尚不存在。這包括指定為變數 prefix
和 exec_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
目標時,您必須將所有命令分為三類:一般命令、預先安裝 命令和 後安裝 命令。請參閱 安裝命令類別。
這些目標安裝 Info 格式以外的文件;它們旨在由安裝套件的人員在需要該格式時明確調用。GNU 偏好 Info 檔案,因此這些檔案必須由 install
目標安裝。
當您有許多文件檔案要安裝時,我們建議您安排這些目標安裝到適當安裝目錄(例如 htmldir
)的子目錄中,以避免衝突和混亂。舉例來說,如果您的套件有多個手冊,並且您希望安裝包含許多檔案的 HTML 文件(例如 makeinfo --html
輸出的「分割」模式),您肯定會希望使用子目錄,否則不同手冊中具有相同名稱的兩個節點將互相覆寫。
請使這些 install-format
目標調用 format 目標的命令,例如,通過使 format 成為依賴項。
刪除所有已安裝的檔案——即 ‘install’ 和 ‘install-*’ 目標建立的副本。
此規則不應修改執行編譯的目錄,而僅應修改安裝檔案的目錄。
卸載命令分為三個類別,就像安裝命令一樣。請參閱 安裝命令類別。
類似 install
,但在安裝時移除可執行檔的符號資訊。在簡單的情況下,此目標可以簡單地使用 install
目標
install-strip: $(MAKE) INSTALL_PROGRAM='$(INSTALL_PROGRAM) -s' \ install
但是,如果套件除了實際的可執行檔外還安裝腳本,則 install-strip
目標不能僅僅參考 install
目標;它必須移除可執行檔的符號資訊,但不能移除腳本的。
install-strip
不應移除正在複製以進行安裝的建置目錄中可執行檔的符號資訊。它應該只移除已安裝副本的符號資訊。
通常,除非您確定程式沒有錯誤,否則我們不建議移除可執行檔的符號資訊。但是,安裝一個移除符號資訊的可執行檔以供實際執行,同時將未移除符號資訊的可執行檔保存在其他地方以防出現錯誤,可能是合理的。
刪除目前目錄中通常由建置程式所建立的所有檔案。如果其他目錄中的檔案是由此 makefile 建立的,也將其刪除。但是,不要刪除記錄配置的檔案。同時保留可以通過建置建立,但通常不會建立的檔案,因為發行版本已包含它們。無需刪除使用 ‘mkdir -p’ 建立的父目錄,因為它們可能本來就存在。
如果 .dvi 檔案不是發行版本的一部分,則在此處刪除它們。
刪除目前目錄中(或由此 makefile 建立)由配置或建置程式所建立的所有檔案。如果您已解壓縮原始碼並建置程式,而沒有建立任何其他檔案,則 ‘make distclean’ 應僅保留發行版本中的檔案。但是,無需刪除使用 ‘mkdir -p’ 建立的父目錄,因為它們可能本來就存在。
類似 ‘clean’,但可能會避免刪除一些人們通常不希望重新編譯的檔案。例如,GCC 的 ‘mostlyclean’ 目標不會刪除 libgcc.a,因為重新編譯它很少需要且耗費大量時間。
刪除幾乎所有可以使用此 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.'
更新此程式的標籤表。
產生任何需要的 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 檔案,因為它們已經是最新的。
以給定格式產生文件檔案。這些目標應始終存在,但如果無法產生給定的輸出格式,則任何或所有目標都可以是空操作 (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 --html
(makeinfo
是 Texinfo 發行版本的一部分)。
為此程式建立發行版本 tar 檔案。應設定 tar 檔案,使其中的檔案名稱以子目錄名稱開頭,該子目錄名稱是它作為發行版本的套件名稱。此名稱可以包含版本號。
例如,GCC 1.40 版的發行版本 tar 檔案會解壓縮到名為 gcc-1.40 的子目錄中。
最簡單的方法是建立一個適當命名的子目錄,使用 ln
或 cp
將正確的檔案安裝到其中,然後 tar
該子目錄。
使用 gzip
壓縮 tar 檔案。例如,GCC 1.40 版的實際發行版本檔案名為 gcc-1.40.tar.gz。支援其他免費壓縮格式也是可以的。
dist
目標應明確依賴發行版本中的所有非原始碼檔案,以確保它們在發行版本中是最新的。請參閱 製作發行版本。
執行自我測試(如果有的話)。使用者必須在執行測試之前建置程式,但不需要安裝程式;您應編寫自我測試,使其在程式已建置但未安裝時也能運作。
以下目標建議作為慣用名稱,適用於它們有用的程式。
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 慣例 [目錄][索引]