前言:該文從《Linux應用開發基礎》一書中摘要所得。
首先確認系統已經安裝以下軟件:
GNU automake
GNU autoconf
GNU m4
perl
GUN Lib工具
第一步,用編輯器vi生成hello.c文件,然后用autoscan命令產生一個configure.in的雛形configure.scan,如下編輯configure.scan文件并將文件名改為configure.in。
autoscan
vi configure.scan
----------------------------------------------
AC_INIT(hello.c)
AM_INIT_AUTOMAKE(hello, 1.0)
#..........................
AC_PROG_CC
#...........................
AC_OUTPUT(makefile)
-----------------------------------------------
mv configure.scan configure.in
第二步,執行aclocal和autoconf,分別產生aclocal.m4和configure兩個文件。configure文件內信息由configure.in和aclocal產生的巨集生成。
aclocal
autoconf
第三步,編輯makefile.am文檔,內容如下:
vi makefile.am
-----------------------
AUTOMAKE_OPTIONS=foreign
bin_PROGRAMS=hello
hello_SOURCES=hello.c
----------------------
然后執行automake –add-missing,automake會根據makefile.am文件產生一些文件,包含最重要的makefile.in。
automake –add-missing
第四步,執行./configure,生成makefile文檔。大功告成,接下來執行make指令就可以編譯hello.c生成可執行文件。
./configure
make
./hello
注意:除了make指令之外,還有make clean / make install / make dist等指令。
步驟詳細解釋:
autoconf:
autoconf是用來產生configure檔的工具,configure是一個shell script,它可以自動核定原始程序以符合各種不同平臺上Unix系統的特性,并且根據系統參數及環境產生合適的makefile檔或者header file檔,讓原始程序可以很方便地在這些平臺上被編譯。autoconf讀取configure.in檔然后產生configure這個shell script。
configure.in檔的內容是一連串GNU m4的巨集,這些巨集經過autoconf處理后會變成檢查系統特征的shell script configure.in內巨集的順序要求:每一個configure.in檔必須在所有巨集前加入AC_INIT巨集,然后在所有巨集后面加上AC_OUTPUT巨集。
先用autoscan掃描原始檔以產生一個configure.scan檔,在對該檔做些修改,產生configure.in檔,在范例中用到的巨集如下:
AC_INIT(file):用來檢查原始文件所在的路徑。
AM_INIT_AUTOMAKE(PACKAGE, VERSION):使用automake必備的巨集,PACKAGE是要產生軟件套件的名稱,VERSION是版本編號。
AC_PROG_CC:檢查系統可用的C編譯器,如果原始程序是用C寫的就需要用這個巨集。
AC_OUTPUT(file):設定configure所要產生的文檔名,如果是makefile的話,configure便會把它檢查出來的結果帶入makefile.in中然后產生合適的makefile。
在使用automake時,還需要一些其他的巨集,這個額外巨集我們用aclocal來產生。執行aclocal會產生aclocal.m4檔,一般來說不用修改。有了configure.in和aclocal.m4檔,就可以執行autoconf來產生configure檔了。
automake:
automake會根據configure.in中的巨集把makefile.am轉成makefile.in檔。在makefile.am檔中需要定義要產生的目標,具體包括:
AUTOMAKE_OPTIONS:設定automake的選項。automake主要是幫助開發GNU軟件的人員維護軟件套件,一般在執行automake時會檢查目錄下是否存在標準GNU套件中應具備的文件檔案,例如NEWS、AUTHOR、ChangeLog等,設成foreign時,automake會改用一般軟件套件標準來檢查,而gnu是缺省設置,該級別下將盡可能地檢查包是否服從GNU標準,gnits是嚴格標準,不推薦。
bin_PROGRAMS:定義要產生的執行檔名稱,產生多個執行檔的話,需要用空格符隔開。
hello_SOURCES:定義hello這個執行檔的原始檔,如果該程序由多個原始檔產生,必須把所用到的原始檔都列出來,空格符隔開,例如hello_SOURCES=hello.c main.c hello.h。如果定義了多個執行檔,則對每個執行檔都要定義相對的filename_SOURCES。
automake --add-missing指令可以用makefile.am來產生makefile.in,加上--add-missing是要automake順便將軟件套件必備的檔案加入包裝。
之后再執行./configure,根據makefile.in檔產生makefile文檔,有幾個預設的目標可供使用:
make all:產生設定的目標,即可執行文件。和只打make的結果相同,此時開始編譯原始碼,然后連接,并產生最終執行文檔。
make clean:清除之前所編譯的執行文件和目標代碼文件。
make distclean:除了清楚執行文件和目標代碼文件外,也把configure產生的makefile清除掉。
make install:將程序安裝至系統中(系統預設的執行文件存放路徑)。使用bin_PROGRAMS巨集的話,程序會被安裝到user/local/bin這個目錄。
make dist:將程序和相關檔案定制成壓縮包的形式,名稱為PACKAGE-VERSION.tar.gz,其中PACKAGE和VERSION以configure.in中的AM_INIT_AUTOMAKE(PACKAGE, VERSION)為準。
make distcheck:壓縮并且檢查壓縮包是否正常,有相應顯示。