automake 的使用

automake 所產生的 Makefile 除了可以做到程序的自動編譯和鏈接外,還可以用來生成各種文檔(如manual pageinfo文件),可以將源代碼文件包裝起來以供發佈。所以程序源代碼所存放的目錄結構最好符合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.m4configure文件:

aclocal
autoconf

6,新建四個空白文件,分別命名爲NEWS,README,AUTHORS,ChangeLog。7,創建一個名爲Makefile.am的文件,並輸入以下內容:

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)執行aclocalautoconf兩個命令,分別生成aclocal.m4configure文件。

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.amautomake根據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 allmake命令產生的可執行文件以軟件的形式安裝到系統中。若使用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類似,但是加入了檢查包裝以後的壓縮文件是否正常。

touch NEWS
touch README
touch AUTHORS
touch ChangeLog

 

AUTOMAKE_OPTIONS= foreign 
bin_PROGRAMS
= hello 
hello_SOURCES
= hello.c
發佈了56 篇原創文章 · 獲贊 7 · 訪問量 24萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章