下一個: 標準目標, 上一個: DESTDIR, 上層: Makefile 慣例 [目錄][索引]
安裝目錄應始終以變數命名,以便於安裝在非標準位置。以下描述了這些變數的標準名稱以及它們在 GNU 套件中應具有的值。它們基於標準檔案系統佈局;GNU/Linux 和其他現代作業系統中使用了它的變體。
安裝者應預期在呼叫 make
(例如,make prefix=/usr install) 或 configure
(例如,configure --prefix=/usr) 時覆寫這些值。GNU 套件不應嘗試猜測哪個值適合它們所安裝到的系統上的這些變數:請使用此處指定的預設設定,以便所有 GNU 套件的行為都相同,從而使安裝者能夠實現任何想要的佈局。
所有安裝目錄及其父目錄都應在安裝到其中之前建立(如果需要)。
前兩個變數設定了安裝的根目錄。所有其他安裝目錄都應是這兩個目錄之一的子目錄,並且不應將任何內容直接安裝到這兩個目錄中。
prefix
用於建構以下列出的變數的預設值的前綴。prefix
的預設值應為 /usr/local。在建置完整的 GNU 系統時,prefix 將為空,而 /usr 將是 / 的符號連結。(如果您正在使用 Autoconf,請將其寫為 ‘@prefix@’。)
使用與建置程式時不同的 prefix
值執行 ‘make install’ 不應 重新編譯程式。
exec_prefix
用於建構以下列出的一些變數的預設值的前綴。exec_prefix
的預設值應為 $(prefix)
。(如果您正在使用 Autoconf,請將其寫為 ‘@exec_prefix@’。)
通常,$(exec_prefix)
用於包含機器特定檔案(例如可執行檔和子例程函式庫)的目錄,而 $(prefix)
則直接用於其他目錄。
使用與建置程式時不同的 exec_prefix
值執行 ‘make install’ 不應 重新編譯程式。
可執行程式安裝在以下目錄之一中。
bindir
用於安裝使用者可以執行的可執行程式的目錄。這通常應為 /usr/local/bin,但請將其寫為 $(exec_prefix)/bin。(如果您正在使用 Autoconf,請將其寫為 ‘@bindir@’。)
sbindir
用於安裝可以從 shell 執行,但通常僅對系統管理員有用的可執行程式的目錄。這通常應為 /usr/local/sbin,但請將其寫為 $(exec_prefix)/sbin。(如果您正在使用 Autoconf,請將其寫為 ‘@sbindir@’。)
libexecdir
用於安裝要由其他程式而不是使用者執行的可執行程式的目錄。這個目錄通常應為 /usr/local/libexec,但請將其寫為 $(exec_prefix)/libexec。(如果您正在使用 Autoconf,請將其寫為 ‘@libexecdir@’。)
‘libexecdir’ 的定義對於所有套件都是相同的,因此您應將您的資料安裝在其子目錄中。大多數套件將其資料安裝在 $(libexecdir)/package-name/ 下,可能在其額外的子目錄中,例如 $(libexecdir)/package-name/machine/version。
程式執行期間使用的資料檔案分為兩種類別。
這產生了六種不同的可能性。然而,我們想要不鼓勵使用與架構相關的檔案,除了物件檔案和函式庫之外。使其他資料檔案與架構無關會更乾淨,而且通常不難做到。
以下是 Makefiles 應使用來指定放置這些各種檔案類型的目錄的變數
唯讀且與架構無關的資料檔案的目錄樹根目錄。這通常應為 /usr/local/share,但請將其寫為 $(prefix)/share。(如果您正在使用 Autoconf,請將其寫為 ‘@datarootdir@’。)‘datadir’ 的預設值基於此變數;‘infodir’、‘mandir’ 和其他變數也是如此。
用於安裝此程式特有的唯讀且與架構無關的資料檔案的目錄。這通常與 ‘datarootdir’ 相同,但我們使用兩個單獨的變數,以便您可以移動這些程式特定的檔案,而不會更改 Info 檔案、man pages 等的位置。
這通常應為 /usr/local/share,但請將其寫為 $(datarootdir)。(如果您正在使用 Autoconf,請將其寫為 ‘@datadir@’。)
‘datadir’ 的定義對於所有套件都是相同的,因此您應將您的資料安裝在其子目錄中。大多數套件將其資料安裝在 $(datadir)/package-name/ 下。
用於安裝與單一機器相關的唯讀資料檔案的目錄——也就是說,用於設定主機的檔案。郵件程式和網路設定檔、/etc/passwd 等都屬於這裡。這個目錄中的所有檔案都應為普通的 ASCII 文字檔案。這個目錄通常應為 /usr/local/etc,但請將其寫為 $(prefix)/etc。(如果您正在使用 Autoconf,請將其寫為 ‘@sysconfdir@’。)
這個目錄不是安裝透過執行 ‘make’ 建置的可執行檔的正確位置——它們可能屬於 $(libexecdir) 或 $(sbindir)。也不要在此處安裝在正常使用過程中會被修改的檔案(排除目的是更改系統設定的程式)。這些檔案可能屬於 $(localstatedir)。
用於安裝與架構無關的資料檔案的目錄,程式在執行時會修改這些檔案。這通常應為 /usr/local/com,但請將其寫為 $(prefix)/com。(如果您正在使用 Autoconf,請將其寫為 ‘@sharedstatedir@’。)
用於安裝程式在執行時會修改,且與特定機器相關的資料檔案的目錄。使用者永遠不需要修改此目錄中的檔案來設定套件的運作;請將此類設定資訊放在單獨的檔案中,這些檔案放在 $(datadir) 或 $(sysconfdir) 中。$(localstatedir) 通常應為 /usr/local/var,但請將其寫為 $(prefix)/var。(如果您正在使用 Autoconf,請將其寫為 ‘@localstatedir@’。)
用於安裝程式在執行時會修改,與特定機器相關,並且不需要持續超過程式執行時間的資料檔案的目錄——程式執行時間通常很長,例如,直到下次重新啟動。系統守護程式的 PID 檔案是典型的用途。此外,這個目錄不應被清除,除非可能在重新啟動時,而一般的 /tmp (TMPDIR
) 可能會被任意清除。這通常應為 /var/run,但請將其寫為 $(localstatedir)/run。將其作為一個單獨的變數允許在需要時使用 /run,例如。(如果您正在使用 Autoconf 2.70 或更新版本,請將其寫為 ‘@runstatedir@’。)
這些變數指定用於安裝某些特定類型檔案的目錄,如果您的程式有這些檔案的話。每個 GNU 套件都應具有 Info 檔案,因此每個程式都需要 ‘infodir’,但並非所有程式都需要 ‘libdir’ 或 ‘lispdir’。
用於安裝標頭檔的目錄,這些標頭檔將被使用者程式使用 C ‘#include’ 前置處理器指令包含。這通常應為 /usr/local/include,但請將其寫為 $(prefix)/include。(如果您正在使用 Autoconf,請將其寫為 ‘@includedir@’。)
大多數 GCC 以外的編譯器不會在 /usr/local/include 目錄中尋找標頭檔。因此,以這種方式安裝標頭檔僅對 GCC 有用。有時這不是問題,因為某些函式庫實際上僅旨在與 GCC 一起使用。但有些函式庫旨在與其他編譯器一起使用。它們應將其標頭檔安裝在兩個位置,一個由 includedir
指定,另一個由 oldincludedir
指定。
用於安裝 ‘#include’ 標頭檔的目錄,供 GCC 以外的編譯器使用。這通常應為 /usr/include。(如果您正在使用 Autoconf,您可以將其寫為 ‘@oldincludedir@’。)
Makefile 命令應檢查 oldincludedir
的值是否為空。如果是,它們不應嘗試使用它;它們應取消標頭檔的第二次安裝。
套件不應替換此目錄中現有的標頭,除非該標頭來自同一個套件。因此,如果您的 Foo 套件提供標頭檔 foo.h,那麼如果 (1) 該目錄中沒有 foo.h 或 (2) 現有的 foo.h 來自 Foo 套件,則應將標頭檔安裝在 oldincludedir
目錄中。
為了判斷 foo.h 是否來自 Foo 套件,請在檔案中放入一個魔術字串——註解的一部分——並 grep
搜尋該字串。
用於安裝此套件的文件檔案(Info 以外)的目錄。預設情況下,它應為 /usr/local/share/doc/yourpkg,但應將其寫為 $(datarootdir)/doc/yourpkg。(如果您正在使用 Autoconf,請將其寫為 ‘@docdir@’。)yourpkg 子目錄(可能包含版本號碼)可防止具有通用名稱的檔案(例如 README)之間發生衝突。
用於安裝此套件的 Info 檔案的目錄。預設情況下,它應為 /usr/local/share/info,但應將其寫為 $(datarootdir)/info。(如果您正在使用 Autoconf,請將其寫為 ‘@infodir@’。)infodir
與 docdir
分開,是為了與現有做法相容。
用於安裝特定格式的文件檔案的目錄。它們都應預設設定為 $(docdir)
。(如果您正在使用 Autoconf,請將它們寫為 ‘@htmldir@’、‘@dvidir@’ 等)。提供多種文件翻譯版本的套件應將其安裝在 ‘$(htmldir)/’ll、‘$(pdfdir)/’ll 等目錄中,其中 ll 是語言環境縮寫,例如 ‘en’ 或 ‘pt_BR’。
物件檔案和物件程式碼函式庫的目錄。不要在此處安裝可執行檔,它們可能應該改為放在 $(libexecdir) 中。libdir
的值通常應為 /usr/local/lib,但請將其寫為 $(exec_prefix)/lib。(如果您正在使用 Autoconf,請將其寫為 ‘@libdir@’。)
用於安裝此套件中任何 Emacs Lisp 檔案的目錄。預設情況下,它應為 /usr/local/share/emacs/site-lisp,但應將其寫為 $(datarootdir)/emacs/site-lisp。
如果您正在使用 Autoconf,請將預設值寫為 ‘@lispdir@’。為了使 ‘@lispdir@’ 正常運作,您需要在您的 configure.ac 檔案中加入以下幾行
lispdir='${datarootdir}/emacs/site-lisp' AC_SUBST(lispdir)
用於安裝此套件的特定於語言環境的消息目錄的目錄。預設情況下,它應為 /usr/local/share/locale,但應將其寫為 $(datarootdir)/locale。(如果您正在使用 Autoconf,請將其寫為 ‘@localedir@’。)這個目錄通常每個語言環境都有一個子目錄。
Unix 風格的 man pages 安裝在以下目錄之一中
用於安裝此套件的 man pages(如果有的話)的頂層目錄。它通常會是 /usr/local/share/man,但您應將其寫為 $(datarootdir)/man。(如果您正在使用 Autoconf,請將其寫為 ‘@mandir@’。)
用於安裝 section 1 man pages 的目錄。將其寫成 $(mandir)/man1。
用於安裝 section 2 man pages 的目錄。將其寫成 $(mandir)/man2
不要將任何 GNU 軟體的主要文件設為 man page。請改用 Texinfo 撰寫手冊。Man pages 僅僅是為了在 Unix 上執行 GNU 軟體的人們,這只是一個次要應用。
已安裝的 man page 的檔案名稱副檔名。這應包含一個句點,後跟適當的數字;它通常應為 ‘.1’。
已安裝的 section 1 man pages 的檔案名稱副檔名。
已安裝的 section 2 man pages 的檔案名稱副檔名。
如果套件需要在手冊的多個 section 中安裝 man pages,請使用這些名稱而不是 ‘manext’。
最後,您應該設定以下變數
正在編譯的來源目錄。這個變數的值通常由 configure
shell 腳本插入。(如果您正在使用 Autoconf,請使用 ‘srcdir = @srcdir@’。)
例如
# Common prefix for installation directories. # NOTE: This directory must exist when you start the install. prefix = /usr/local datarootdir = $(prefix)/share datadir = $(datarootdir) exec_prefix = $(prefix) # Where to put the executable for the command 'gcc'. bindir = $(exec_prefix)/bin # Where to put the directories used by the compiler. libexecdir = $(exec_prefix)/libexec # Where to put the Info files. infodir = $(datarootdir)/info
如果您的程式將大量檔案安裝到標準使用者指定的目錄之一中,則將它們分組到特定於該程式的子目錄中可能很有用。如果您這樣做,您應該編寫 install
規則來建立這些子目錄。
不要期望使用者在上面列出的任何變數的值中包含子目錄名稱。對於安裝目錄使用統一的變數名稱集的想法是為了讓使用者能夠為幾個不同的 GNU 套件指定完全相同的值。為了使這有用,所有套件都必須設計成當使用者這樣做時,它們可以合理地運作。
有時,並非所有這些變數都可能在目前版本的 Autoconf 和/或 Automake 中實作;但截至 Autoconf 2.60,我們相信所有這些變數都已實作。當有任何變數遺失時,此處的描述將作為 Autoconf 將實作的規範。作為程式設計師,您可以選擇使用開發版本的 Autoconf,或者避免使用這些變數,直到發布支援它們的穩定版本。
下一個: 標準目標, 上一個: DESTDIR, 上層: Makefile 慣例 [目錄][索引]