下一節:,上一節:管理發布   [目錄][索引]


7.1 配置應該如何運作

每個 GNU 發行版都應該附帶一個名為 configure 的 shell 腳本。這個腳本會接收描述您想要編譯程式的機器和系統種類的參數。configure 腳本必須記錄配置選項,以便它們影響編譯。

這裡的描述是 GNU 套件中 configure 腳本介面的規範。許多套件使用 GNU Autoconf(請參閱 簡介,在 Autoconf 中)和/或 GNU Automake(請參閱 簡介,在 Automake 中)來實現它,但您不必使用這些工具。您可以用任何您喜歡的方式實現它;例如,通過使 configure 成為完全不同的配置系統的包裝器。

configure 腳本運作的另一種方式是從標準名稱(例如 config.h)連結到所選系統的正確配置檔案。如果您使用此技術,發行版不應包含名為 config.h 的檔案。這是為了防止人們在未先配置程式的情況下構建程式。

configure 可以做的另一件事是編輯 Makefile。如果您這樣做,發行版不應包含名為 Makefile 的檔案。相反,它應該包含一個 Makefile.in 檔案,其中包含用於編輯的輸入。再一次,這是為了防止人們在未先配置程式的情況下構建程式。

如果 configure 確實寫入 Makefile,那麼 Makefile 應該有一個名為 Makefile 的目標,該目標會導致 configure 重新運行,設置與上次設置相同的配置。configure 讀取的檔案應列為 Makefile 的依賴項。

所有從 configure 腳本輸出的檔案都應該在開頭有註解,說明它們是使用 configure 自動生成的。這是為了防止使用者想到嘗試手動編輯它們。

configure 腳本應寫入一個名為 config.status 的檔案,該檔案描述了上次配置程式時指定的配置選項。這個檔案應該是一個 shell 腳本,如果運行,將重新創建相同的配置。

configure 腳本應接受 ‘--srcdir=dirname’ 形式的選項,以指定找到來源程式碼的目錄(如果它不是目前目錄)。這使得可以在單獨的目錄中構建程式,以便實際的來源目錄不會被修改。

如果使用者未指定 ‘--srcdir’,則 configure 應檢查 ... 以查看是否可以找到來源程式碼。如果它在其中一個位置找到來源程式碼,則應從那裡使用它們。否則,它應報告無法找到來源程式碼,並應以非零狀態退出。

通常,支持 ‘--srcdir’ 的簡單方法是通過將 VPATH 的定義編輯到 Makefile 中。某些規則可能需要明確引用指定的來源目錄。為了使這成為可能,configure 可以在 Makefile 中添加一個名為 srcdir 的變數,其值正是指定的目錄。

此外,‘configure’ 腳本應接受與大多數標準目錄變數相對應的選項(請參閱 目錄變數)。這是列表

--prefix --exec-prefix --bindir --sbindir --libexecdir --sysconfdir
--sharedstatedir --localstatedir --runstatedir
--libdir --includedir --oldincludedir
--datarootdir --datadir --infodir --localedir --mandir --docdir
--htmldir --dvidir --pdfdir --psdir

configure 腳本還應接受一個參數,該參數指定要構建程式的系統類型。這個參數應該看起來像這樣

cpu-company-system

例如,基於 Athlon 的 GNU/Linux 系統可能是 ‘i686-pc-linux-gnu’。

configure 腳本需要能夠解碼描述機器的所有合理的替代方案。因此,‘athlon-pc-gnu/linux’ 將是一個有效的別名。有一個名為 config.sub 的 shell 腳本,您可以將其用作子例程來驗證系統類型並規範化別名。

configure 腳本還應接受選項 --build=buildtype,它應等效於純 buildtype 參數。例如,‘configure --build=i686-pc-linux-gnu’ 等效於 ‘configure i686-pc-linux-gnu’。當 build 類型未通過選項或參數指定時,configure 腳本通常應使用 shell 腳本 config.guess 來猜測它。

允許其他選項更詳細地指定機器上存在的軟體或硬體,以包含或排除套件的可選部分,或調整某些工具的名稱或其參數

--enable-feature[=parameter]

配置套件以構建和安裝一個名為 feature 的可選使用者級別設施。這允許使用者選擇要包含哪些可選功能。如果預設構建 feature,則給出 ‘no’ 的可選參數應省略 feature

沒有 ‘--enable’ 選項應該導致一個功能替換另一個功能。沒有 ‘--enable’ 選項應該用一個有用的行為替換另一個有用的行為。‘--enable’ 的唯一正確用途是用於關於是否構建程式的一部分或排除它的問題。

--with-package

套件 package 將被安裝,因此配置此套件以與 package 一起工作。

package 的可能值包括 ‘gnu-as’(或 ‘gas’)、‘gnu-ld’、‘gnu-libc’、‘gdb’、‘x’ 和 ‘x-toolkit’。

請勿使用 ‘--with’ 選項來指定用於查找某些檔案的檔案名。這超出了 ‘--with’ 選項的範圍。

variable=value

將變數 variable 的值設置為 value。這用於覆蓋構建過程中命令或參數的預設值。例如,使用者可以發出 ‘configure CFLAGS=-g CXXFLAGS=-g’ 以使用調試資訊構建,而不使用預設優化。

像這樣將變數指定為 configure 的參數,

./configure CC=gcc

比在環境變數中設置它們更可取

CC=gcc ./configure

因為它有助於稍後使用 config.status 重新創建相同的配置。但是,應該支持這兩種方法。

所有 configure 腳本都應接受所有“詳細”選項和變數設置,無論它們是否對手頭的特定套件產生任何影響。特別是,它們應該接受任何以 ‘--with-’ 或 ‘--enable-’ 開頭的選項。這樣,使用者就可以使用一組選項一次配置整個 GNU 來源樹。

您會注意到,‘--with-’ 和 ‘--enable-’ 類別是狹窄的:它們沒有為您可能想到的任何類型的選項提供位置。這是故意的。我們希望限制 GNU 軟體中可能的配置選項。我們不希望 GNU 程式具有特有的配置選項。

執行部分編譯過程的套件可能支持交叉編譯。在這種情況下,程式的主機和目標機器可能不同。

configure 腳本通常應將指定的系統類型視為主機和目標,從而生成一個在與其運行的機器類型相同的機器上運行的程式。

要編譯一個在與 build 類型不同的主機類型上運行的程式,請使用 configure 選項 --host=hosttype,其中 hosttype 使用與 buildtype 相同的語法。主機類型通常預設為 build 類型。

要配置交叉編譯器、交叉彙編器或任何其他東西,您應該使用 configure 選項 ‘--target=targettype’ 指定與主機不同的目標。targettype 的語法與主機類型相同。因此,命令看起來像這樣

./configure --host=hosttype --target=targettype

目標類型通常預設為主機類型。交叉操作沒有意義的程式不需要接受 ‘--target’ 選項,因為為交叉操作配置整個作業系統不是有意義的操作。

一些程式具有自動配置自身的方法。如果您的程式設置為執行此操作,則您的 configure 腳本可以簡單地忽略其大多數參數。


下一節:,上一節:管理發布   [目錄][索引]