天天看點

autotools工具自動生成Makefile

<b>autotools</b><b>的使用流程</b>

<b>&lt;?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /&gt;</b>

<b></b>

<b></b> 

autoscan-&gt;aclocal-&gt;autoconf-&gt; automake-&gt;configure

&lt;?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" /&gt;

以helloworld為例加以說明:

<b>1</b><b>)建立</b><b>helloworld.c</b><b>,并修改代碼如下:</b><b></b>

   int main(int argc,char** argv)

   {

        printf("hello world!");

   }

<b>2)autoscan:autoscan:</b><b>生成</b><b>configure.scan</b>

<b>3)</b><b>編輯</b><b>configure.scan,</b><b>并重命名為</b><b>configure.in</b>

  内容如下:

#      -*- Run autoconf -*-

# Process this file with autoconf to produce a configure script.

AC_PREREQ(2.59)

#The next one is modified by sunq

#AC_INIT(FULL-PACKAGE-NAME,VERSION,BUG-REPORT-ADDRESS)

AC_INIT(hello,1.0)

# The next one is added by author

AM_INIT_AUTOMAKE(hello,1.0)

AC_CONFIG_SRCDIR([hello.c])

# 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_CONFIG_FILES([Makefile])

AC_OUTPUT

<b>4</b><b>)aclocal:生成aclocal.m4</b>

<b>5) autoconf:</b><b>生成configure</b>

<b>6)vim makefile.am</b><b>:</b>建立makefile.am并編輯内容如下:

  AUTOMAKE_OPTIONS=foreign

  bin_PROGRAMS=helloworld

  helloworld_SOURCES=helloworld.c

<b>7</b><b>)atuomake --add-missing:</b>生成makefile.in

<b>8</b><b>)./configure:</b>生成makefile

這樣helloworld的makefile就生成了,make就可生成可執行程式了。

<b>autotools</b><b>各步詳解:</b>

<b>1</b><b>.</b><b>autoscan</b>

它會在給定目錄及其子目錄樹中檢查源檔案,若沒有給出目錄,就在目前目錄及其子目錄樹中進行檢查。它會搜尋源檔案以尋找一般的移植性問題并建立一個檔案“configure.scan”,它是“configure.in”的原型檔案.

<b>2.configure.in</b><b></b>

configure.in是autoconf的腳本配置檔案,檔案的内容是一些宏,這些宏經過autoconf 處理後會變成檢查系統特性、環境變量、軟體必須的參數的shell腳本。configure.in檔案中的宏的順序并沒有規定,但是你必須在所有宏的最前面和最後面分别加上AC_INIT宏和AC_OUTPUT宏。其中:

1)以“#”号開始的行為注釋。

2)AC_PREREQ宏聲明本檔案要求的autoconf版本,如本例使用的版本2.59。

3) AC_INIT宏用來定義軟體的名稱和版本等資訊,在本例中省略了BUG-REPORT-ADDRESS,一般為作者的e-mail。

4)M_INIT_AUTOMAKE是筆者另加的,它是automake所必備的宏,也同前面一樣,PACKAGE是所要産生軟體套件的名稱,VERSION是版本編号。

5)AC_CONFIG_SRCDIR宏用來偵測所指定的源碼檔案是否存在,來确定源碼目錄的有效性。在此處為目前目錄下的hello.c。

6)AC_CONFIG_HEADER宏用于生成config.h檔案,以便autoheader使用。

7)AC_CONFIG_FILES宏用于生成相應的Makefile檔案。

<b>4.aclocal</b>

它生成一個“aclocal.m4”檔案,該檔案主要處理本地的宏定義。

<b>5.autoconf</b>

生成“configure”shell檔案。configure是一個腳本,它能設定源程式來适應各種不同的作業系統平台,并且根據不同的系統來産生合适的Makefile,進而可以使你的源代碼能在不同的作業系統平台上被編譯出來。

<b>6.makefile.am</b>

<b>·</b>  其中的AUTOMAKE_OPTIONS為設定automake的選項。由于GNU對自己釋出的軟體有嚴格的規範,比如必須附帶許可證聲明檔案COPYING等,否則automake執行時會報錯。automake提供了三種軟體等級:foreign、gnu和gnits,讓使用者選擇采用,預設等級為gnu。在本例使用foreign等級,它隻檢測必須的檔案。

·  bin_PROGRAMS定義要産生的執行檔案名。如果要産生多個執行檔案,每個檔案名用空格隔開。

·  hello_SOURCES定義“hello”這個執行程式所需要的原始檔案。如果”hello”這個程式是由多個原始檔案所産生的,則必須把它所用到的所有原始檔案都列出來,并用空格隔開。例如:若目标體“hello”需要“hello.c”、“sunq.c”、“hello.h”三個依賴檔案,則定義hello_SOURCES=hello.c sunq.c hello.h。要注意的是,如果要定義多個執行檔案,則對每個執行程式都要定義相應的file_SOURCES。

<b>7.automake - -add-missing</b>

生成“makefile.in”檔案,在這裡使用選項“—adding-missing”可以讓automake自動添加有一些必需的腳本檔案。

<b>8</b><b>.運作configure</b>

在這一步中,通過運作自動配置設定檔案configure,把Makefile.in變成了最終的Makefile。

<b>automake</b><b>工具介紹</b>

automake是一個從檔案Makefile.am自動生成Makefile.in的工具。每個Makefile.am基本上是一系列make的宏定義(make規則也會偶爾出現)。生成的Makefile.in也服從GNU Makefile标準。

典型的automake輸入檔案是一系列簡單的宏定義。處理所有相關的檔案并建立Makefile.in檔案。在一個項目的每個目錄中通常僅包含一個Makefile.am。

目前automake支援三種目錄層次:平坦模式(flat)、混合模式(shallow)和深層模式(deep)。

(1)平坦模式指的是所有檔案都位于同一個目錄中。就是所有源檔案、頭檔案及其他庫檔案都位于目前目錄中,且沒有子目錄。

(2)混合模式指的是主要的源代碼都存儲在頂層目錄,其他各個部分則存儲在子目錄中。也就是主要源檔案在目前目錄中,而其他一些實作各部分功能的源檔案位于各自不同的目錄。

(3)深層模式指的是所有源代碼都被存儲在子目錄中;頂層目錄主要包含配置資訊。也就是所有源檔案及程式員自己寫的頭檔案都位于目前目錄的一個子目錄中,而目前目錄裡沒有任何源檔案。

在這三種支援的目錄層次中,平坦模式類型是最簡單的,深層模式類型是最複雜的。但是這些模式使用autoconf和automake所遵循的基本原則和流程是一樣的。

<b>其他工具介紹</b>

(1)autoheader:能夠産生供configure腳本使用的C #define語句模闆檔案。

(2)autom4te:對檔案執行 GNU M4。

(3)autoreconf:如果有多個autoconf産生的配置檔案,autoreconf可以儲存一些相似的工作,它通過重複運作autoconf(以及在合适的地方運作autoheader)以重新産生autoconf配置腳本和配置頭模闆,這些檔案儲存在以目前目錄為根的目錄樹中。

(4)autoscan:該程式可以用來為軟體包建立configure.in檔案。autoscan在以指令行參數中指定的目錄為根(如果未給定參數,則以目前目錄為根)的目錄樹中檢查源檔案。為軟體包建立一個configure.scan檔案,該檔案就是configure.in的前身。

(5)autoupdate:該程式的作用是轉換configure.in,進而使用新的宏名。

<b>相關連結:</b>

<a href="http://blog.ossxp.com/2010/04/954/">http://blog.ossxp.com/2010/04/954/</a>

<a href="http://hi.baidu.com/gouoooo/blog/item/ae52cf349f84ff87a61e129c.html">http://hi.baidu.com/gouoooo/blog/item/ae52cf349f84ff87a61e129c.html</a>