最近更新: 2010-06-17

Hello Autoconf, the GNU Build System

Autoconf solves an important problem—reliable discovery of system-specific build and runtime information. The GNU Build System

一名資深的 Linux 程序員,應該很熟悉下列的軟體源碼安裝動作:

./configure
make
make install

configure 是由 GNU 軟體建構系統產生的自動組態指令稿,它可以檢查源碼編譯前的相依項目,並按照系統環境產生搭配的 Makefile 。所以使用者可以用相同的操作指令,完成軟體源碼的編譯動作。本文將以一個 hello 程式為例,說明如何產生符合 GNU 軟體開發指南的 configure

我寫了一個 hello.c ,放置在源碼子目錄 src 中 (這是慣例)。接下來,我要為這個小程式建立一個自動組態建置項目(autoconf/automake)。

src/hello.c
#include <stdio.h>

int main(int argc, char **argv) {
    puts("Hello world.");
    return 0;
}

Package information

建立下列關於軟體套件資訊的四份文件。內容多寡按你的意願決定,你甚至可以讓它們的內容是空白的。但檔案一定要存在。

  • AUTHORS
    作者資訊。
  • ChangeLog
    異動記錄。
  • NEWS
    最新消息。
  • README
    軟體說明、軟體介紹。

automake 要求你建立上列的四份文件。此外,當你要建立 deb 包時,你也會需要上列四份文件。

此外,以下兩份文件是可選項目。

  • INSTALL
    軟體安裝文件。可由 automake 產生。
  • COPYING
    著作權宣告文件。可由 automake 自動複製一份,但它複製的是 GPL v3 宣告。 若你使用其他的著作權授權方式,你應自行複製。

建立 Autoconf script

我們要建立一份 configure.ac 指示 Autoconf 要檢查的系統組態內容。以 hello.c 為例,下列是 configure.ac 的最少必要內容。如果你想要檢查特定的套件版本、library 或系統資訊,請參考 Making configure Scripts 了解詳細內容。Autoconf檢查額外函數庫 一文中展示了一份更多檢查項目的 configure.ac 。

configure.ac
AC_INIT([hello],[1.0],[bug-automake@gnu.org])
AM_INIT_AUTOMAKE([])
AC_PROG_CC

#AC_CONFIG_FILES([
AC_OUTPUT([
    Makefile
    src/Makefile
])

接著,我們要建立對應的 Makefile.am 作為 Automake 產生 Makefile 的範本。

在源碼的根目錄中,一定要有一份 Makefile.am ,其它要處理的子目錄中也有個別的 Makefile.am。依慣例,軟體源碼放置於 src 目錄內,資料文件放置於 data 目錄內。處理軟體源碼的 automake script 便應位於 src/Makefile.am.

Makefile.am
SUBDIRS = src
dist_doc_DATA = README
src/Makefile.am
bin_PROGRAMS = hello
hello_SOURCES = hello.c

# automake 會自動產生一組產生 bin_PROGRAMS 的行為。
# 如下所示,所以我們通常不必自己寫。
#hello$(EXEEXT): $(hello_OBJECTS) $(hello_DEPENDENCIES) 
#        @rm -f hello$(EXEEXT)
#                $(LINK) $(hello_OBJECTS) $(hello_LDADD) $(LIBS)

到此先作小結,針對 hello.c ,我們需要手動建立的文件內容如下所示。其他的文件,都將由 autoconf/automake 幫我們產生。

.
|-- AUTHORS
|-- ChangeLog
|-- configure.ac
|-- Makefile.am
|-- NEWS
|-- README
`-- src
    |-- hello.c
    `-- Makefile.am

產生 configure

依序操作下列指令,產生 configure 指令稿。

第一步: aclocal. 它會產生 aclocal.m4, autom4te.cache. aclocal.m4 定義了一些 autoconf 會使用的巨集,例如 AM_INIT_AUTOMAKE 。

第二步: autoconf. 它會產生 configure, config.status 等文件。

第三步: automake --add-missing. 這會產生 Makefile.in ,並自動添加某些有預設內容的文件,例如 INSTALL, COPYING。

基本上,到此為止,由 autoconf,automake 自動產生出來的文件,都可以加入版本管理庫。 當你以源碼形式散佈軟體時,其他人僅需執行接下來的 configure 與 make 。

建置你的軟體

當你完成上述的步驟之後,接著就是我們熟悉的源碼建立動作了。 ./configure 產生 Makefile;make 編譯源碼。

更複雜的建置項目

上述的操作指令是最基本的工作,隨著軟體項目內容的擴充,我們通常需要調整更多細節、進行更多的操作工作。所幸,有許多現成的 auto generate 工具,整合了特定軟體項目所需的 autoconf, automake 內容,可以用一行指令幫助我們完成上述的細部操作。

例如,開發 GNOME 桌面程式,可以安裝 gnome-common 套件,執行 gnome-autogen.sh 完成針對 C/C++ 與 GNOME 開發環境的 autoconf, automake 工作。

使用 C# 開發 Mono 程式時,可以下載 monoskel,執行其中的 autogen.sh 完成針對 Mono 開發環境的 autoconf, automake 工作。參考 Guidelines:Application_Deployment

相關文章
樂多舊網址: http://blog.roodo.com/rocksaying/archives/12687975.html