用autotools(Automake\Autoconf)生成Makefile

automake所產生的Makefile除了可以做到程序的自動編譯和鏈接外,還可以用來生成各種文檔(如manual page, info文件),可以將源代碼文件包裝起來以供發佈。所以程序源代碼所存放的目錄結構最好符合GNU的標準慣例.下面以hello.c程序生成Makefile文件作爲例子。


1.在當前目錄下創建一個名爲hello的子目錄。hello這個目錄用於存放hello.c這個程序及相關文件。新建一個源程序文件hello.c
#include <stdio.h>
int main(int argc, char** argv)
{
printf("Welcome to use autoconf and automake\n");
return 0:
}


2.執行autoscan命令生成一個名爲configure.scan文件:
autoscan


3.將configure.scan改名爲configure.in:
mv configure.scan configure.in


4.打開configure.in,將該文件修改爲以下內容:
#Process this file with Autoconf to produce a configure script.
AC_INIT(hello.c)
AM_INIT_AUTOMAKE(hello, 1.0)
#Checks for programs.
AC_PROG_CC
#Checks for libraries.
#Checks for header files.
#Checks for typedefs, structures, and compiler characteristics.
#Checks for library functions.
AC_OUTPUT(Makefile)


5.然後執行以下兩個命令,分別生成aclocal.m4和configure文件:
aclocal
autoconf


6.新建四個空白文件,分別命名爲NEWS,README,AUTHORS, ChangeLog。
touch NEWS
touch README
touch AUTHORS
touch ChangeLog


7.創建一個名爲Makefile.am的文件,並輸入以下內容:
AUTOMAKE_OPTIONS= foreign
bin_PROGRAMS= hello
hello_SOURCES= hello.c


8.執行命令“automake --add-missing", automake會根據Makefile.am文件產生一些文件,其中包含最重要的Makefile.in
automake --add-missing


9.最後執行“./configure”命令生成Makefile文件
./configure


10.生成Makefile文件後,就可以執行“make"命令來編譯hello.c程序,從而生成可執行程序hello。生成可執行程序hello後,執行。
make
./hello
Welcome to use autoconf and automake




歸納一下這個例子的流程。
(1)在存放源代碼的目錄下執行autoscan命令生成configure.scan文件。
(2)將configure.scan文件改名爲configure.in,並對其默認配置進行修改。
(3)執行aclocal, autocon倆個命令,分別生成aclocal.m4, configure文件。
(4)創建一個名爲Makefile.am的文件,並輸入相應的內容。
(5)執行automake --add-missing,它根據Makefile.am文件,生成Makefile.in。
(6)執行./configure腳本文件,它根據Makefile.in文件,生成最終的Makefile文件。
通過以上步驟,在源代碼所在目錄下自動生成了Makefile文件。
configure.in文件
autoconf提用來產生"configure"文件的工具。"configure"是一個Shell腳本,它可以自動設定一些編譯參數使程序能夠在不同平臺上進行編譯。autoconf讀取configure.in文件然後產生,"configure"這個Shell腳本。
configure.in文件的內容是一系列GNU m4的宏,這些宏經autoconf理後會變成檢查系統特性的Shell腳本。configure.in文件中宏的順序並沒有特別的規定,但是每一個configure.in文件必須以宏AC_INIT開頭,以宏AC_OUTPUT結束。一般可先用autoscan這個工具掃描原始文件以產生一個configure.scan文件,再對configure.scan作些修改,從而生成configure.in文件
configure.in文件中一些宏的含義如下。
l  #或dnl: #或dnl後面的內容作爲註釋不會被處理,它們是註釋的起始標誌。
l  AC_INIT(FILE):該宏用來說明源代碼所在路徑,如上例中的AC_INIT(hello.c),表明源代碼在當前目錄下,名爲hello.c。
l  AM_INIT_AUTOMAKE(PACKAGE,VERSION):這個是後面運行automake命令所必需的宏,PACKAGE指明要產生軟件的名稱,VERSION是其版本號。
l  AC_PROG_CC:檢查系統可用的C編譯器,若源代碼是用C語言編寫的就需要這個宏。
l  AC_OUTPUT(FILE):設置configure命令所要產生的文件。我們最終期望產生Makefile這個文件,因此一般將其設置爲AC_OUTPUT(Makefile)。
在運行automake命令時,還需要一些其他的宏,這些額外的宏由aclocal產生。執行aclocal會產生aclocal.m4文件,如果沒有特別的要求,無需修改它。用aclocal產生的宏將會提示automake如何動作。
另一個重要的文件是Makefile.am。 automake根據configure.in中的宏並在Perl的幫助下把Makefile.am轉成Makefile.in文件。
Makefile.am文件定義所要產生的目標。
Makefile.am文件
Makefile.am文件中幾個預定的選項的含義如下所示。
l  AUTOMAKE_OPTIONS:它用於設置automake的選項。automake主要是幫助開發GNU軟件的人員來維護軟件,所以在執行automake時,會檢查目錄下是否存在標準GNU軟件中應具備的文件,例如"NEWS"、"AUTHOR"、"ChangeLog"等文件。設置爲foreign時,automake會改用一般軟件的標準來進行檢查。
l  bin_PROGRAMS:定義要產生的可執行程序的文件名。如果要產生多個可執行文件,每個文件名用空白符隔開。
l  hello_SOURCES:定義“hello"這個可執行程序所需要的原始文件。如果“hello"這個程序是由多個原始文件產生的,必須把它所用到的所有原始文件都列出來,並以空白符隔開。假設“hello"還需要"hello.c"、"main.c"、"hello.h"3個文件,則定義hello_SOURCES= hello.c main.c hello.h。如果定義多個可執行文件,則對每個可執行程序都要定義相應的filename_SOURCES,其中filename爲要生成的可執行程序的文件名。
編輯好Makefile.am文件後,就可以使用命令automake --add-missing生成Makefile.in。加上--add-missing這個選項是用來提示
automake加入包裝一個軟件所必需的文件,如果不使用該選項,automake可能會報告缺少了某些文件。automake產生出來的Makefile.in文件是完全符合GNU Makefile規定的,只要執行configure這個Shell腳本便可以產生合適的Makefile文件了。
如何使用產生的Makefile文件
執行configure腳本文件所產生的Makefile文件有幾個預定的選項可供使用。
l  make all:產生設定的目標,即生成所有的可執行文件。使用make也可以達到此目的。
l  make clean:刪除之前編譯時生成的可執行文件及目標文件(形如*.o的中間文件)。
l  make distclean:除了刪除可執行文件和目標文件以外,把configure所產生的Makefile文件也清除掉。通常在發佈軟件前執行該命令。
l  make install:將使用make all或make命令產生的可執行文件以軟件的形式安裝到系統中。若使用bin_PROGRAMS宏,程序將會被安裝到/usr/local/bin下,否則安裝到預定義的目錄下。
l  make dist:將程序和相關的文檔包裝爲一個壓縮文檔以供發佈。執行完該命令,在當前目錄下會產生一個名爲PACKAGE-VERSION.tar.gz的文件。PACKAGE和VERSION這兩個參數是來自configure.in文件中的AM_INIT_AUTOMAKE(PACKAGE,VERSION)。如在上個例子中執行make dist命令,會產生名爲“hello-1.0.tar.gz”的文件。

l  make distcheck:與make dist類似,但是加入了檢查包裝以後的壓縮文件是否正常。

From: http://wenku.baidu.com/view/8f44ca9c51e79b8968022632.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章