Unix上自動產生Makefile --- Automake



一般而言,在UNIX上面的程式語言設計,通常都是利用Automake來製造Makefile來編譯。由於在設計與BBS相關的程式部分,都是修改程式碼與新增 部分程式區段的程式碼,所以幾乎都僅僅只是修改makefile來執行罷了,並沒有必要到說去自行設計一個Makefile的撰寫,即使之前寫一些簡單的 Multi-processes的程式也僅僅是直接手寫一些簡單的Makefile,於是在我心中決定必須把這套軟體好好的學學,相信搭配Global來建製程式碼參考用網頁之後,可以更方便的使用Gdb來作debug的工作,當然對於這個陌生的軟體,又是一個向Google請教的好時間,於是我找到一篇不錯的Automake參考文獻(由陳雍穆所寫),透過他詳細的介紹,其實很快的就會使用了Automake來製造屬於自己的Makefile檔

AutoMake簡易使用法

1.利用Autoscan 來掃瞄出整個目錄的檔案

2.將編輯出來的configure.scan改為configure.in,並將檔案中的AC_OUTPUT() -->AC_OUTPUT(Makefile)

3.執行 aclocal 和 autoconf ,分別會產生 aclocal.m4 及 configure 兩個檔案

4.利用文字編輯器,自行編輯Makefile.am(此時尚無此檔,請自行編輯),在此注意您所使用的原始檔必須為*.c

AUTOMAKE_OPTIONS= foreign
bin_PROGRAMS= 程式執行檔名稱
程式執行檔名稱_SOURCES= (裡面放相關的C與H)

 5.使用 automake --add-missing 將 Makefile.in 產生出來,這樣一來就可以正常運作


Automake 原理介紹

使用 Automake產生 Makefile 的過程和以往自行編寫的方式非常不一樣,只需定義一些用到的巨集即可。

我們把巨集及目標 (target) 寫在 Makefile.am 檔內,Automake讀入 Makefile.am 檔後會把這一串已經定義好的巨集展開並且產生對應的Makefile.in 檔, 然後再由 configure 這個 shell script 根據Makefile.in 產生適合的 Makefile。



這篇簡介是 Autoconf 及 Automake 的入門,希望這篇檔能幫助你對產生 Makefile有個簡單的依據。其他有關開發 GNU 程式或 C 程式設計及 Makefile 的詳細運用及技巧,我建議你從 GNU Coding Standards3 (GNU 編碼標準規定) 讀起,裡面包含了 GNU Makefile 慣例,還有發展 GNU 軟體套件的標準程式和慣例。這些 GNU 軟體的線上說明文件可以在 http://www.gnu.org/ 這個網站上找到。

1. 編輯 configure.in 檔

configure.in 檔的內容是一連串 GNU m4 的巨集,這些巨集經過autoconf 處理後會變成檢查系統特徵的 shell script。

我們可先用 autoscan 掃瞄原始檔以產生一個 configure.scan 檔,再對 configure.scan 做些修改成 configure.in 檔。

configure.in 內必須以 AC_INIT 巨集開頭,以AC_OUTPUT 巨集結尾。中間定義多個使用者自定巨集 (User Defined Micro),使用者自定巨集的順序沒有規定。

configure.in常用的範例巨集如下:

dnl

為註解,這個巨集後面的字不會被處理。

AC_INIT(FILE)

這個巨集用來檢查原始碼所在的路徑,autoscan 會自動產生,我們不必修改它。

AM_INIT_AUTOMAKE(PACKAGE,VERSION)

PACKAGE 是我們所要產生軟體套件的名稱,VERSION 是版本編號。

AC_PROG_CC

檢查系統可用的 C 編譯器,如果原始程式是用 C 寫的就需要這個巨集。

AC_OUTPUT(FILE)

設定 configure 所要產生的檔案,如果是 Makefile 的話,configure 便會把它檢查出來的結果帶入 Makefile.in 檔然後產生合適的 Makefile。

2. 產生 aclocol.mr 檔

實際上,我們使用 Automake 時,還須要一些其他的巨集,這些額外的巨集我們用 aclocal 來幫我們產生。執行 aclocal 會產生 aclocal.m4 檔,如果沒有特別的用途,我們可以不必修改它,用 aclocal 所產生的巨集會告訴 Automake 怎麼做。

3. 產生 configure 檔

有了 configure.in 及 aclocal.m4 兩個檔案後,便可以執行 autoconf來產生 configure 檔了。

Autoconf 是用來產生 'configure' 檔的工具。'configure' 是一個shell script,它可以自動設定原始程式以符合各種不同平臺上 Unix 系統的特性,並且根據系統三數及環境產生合適的 Makefile 檔或是C 的標頭檔 (header file),讓原始程式可以很方便地在這些不同的平臺上被編譯出來。Autoconf 會讀取 configure.in 檔然後產生 'configure' 這個shell script。

4. 編輯 Makefile.am 檔

接下來我們要編輯 Makefile.am 檔,Automake 會根據 configure.in 中的巨集把Makefile.am 轉成 Makefile.in 檔。Makefile.am 檔定義我們所要產的目標:

AUTOMAKE_OPTIONS

Automake 主要是幫助開發 GNU 軟體的人員維護軟體套件,所以在執行 automake 時,會檢查目錄下是否存在標準 GNU 軟體套件中應具備的檔檔案,例如 'NEWS'、'AUTHOR'、'ChangeLog' 等文件檔。

設成 foreign 時,automake 會改用一般軟體套件的標準來檢查。

bin_PROGRAMS

定義我們所要產生的執行檔檔名。如果要產生多個執行檔,每個檔名用空白字元隔開。

hello_SOURCES

定義執行檔所需要的原始檔。

如果 'hello' 這個程式是由多個原始檔所產生,必須把它所用到的原始檔都列出來,以空白字元隔開。

5. 產生Makefile.in

Automake 產生出來的 Makefile.in檔是完全符合 GNU Makefile 的慣例,我們只要執行 configure 這個shell script 便可以產生合適的 Makefile 檔了。

# automake --add-missing

加上 --add-missing 選項是告訴 automake 順便幫我們加入包裝一個軟體套件所必備的檔案。

6.使用 Makefile

執行 ./configure,利用 configure 產生Makefile 檔。

要注意的是,利用 Autoconf 及 Automake 所產生出來的軟體套件是可以在沒有安裝 Autoconf 及 Automake 的環境上使用的,因為 configure 是一個 shell script,它己被設計可以在一般 Unix 的 sh 這個 shell 下執行。但是如果要修改 configure.in 及 Makefile.am 檔再產生新的configure 及 Makefile.in 檔時就一定要有 Autoconf 及 Automake 了。

Autoconf 和 Automake 功能十分強大,你可以從它們所附的 info 檔找到詳細的用法。你也可以從許多現存的 GNU 軟體或 Open Source 軟體中找到相關的 configure.in 或 Makefile.am 檔,它們是學習 Autoconf 及Automake 更多技巧的最佳範例。

 

LinuxMakefileautomake生成全攻略

  作為Linux下的程序開發人員,大家一定都遇到過Makefile,用make命令來編譯自己寫的程序確實是很方便。一般情況下,大家都是手工寫一個簡單Makefile,如果要想寫出一個符合自由軟件慣例的Makefile就不那麼容易了。

   在本文中,將給大家介紹如何使用autoconf和automake兩個工具來幫助我們自動地生成符合自由軟件慣例的Makefile,這樣就可以像常 見的GNU程序一樣,只要使用「./configure」,「make」,「make instal」就可以把程序安裝到Linux系統中去了。這將特別適合想做開放源代碼軟件的程序開發人員,又或如果你只是自己寫些小的Toy程序,那麼這 個文章對你也會有很大的幫助。

  一、Makefile介紹

  Makefile是用於自動編譯和鏈接的,一個工程有很多文件組成,每一個文件的改變都會導致工程的重新鏈接,但是不是所有的文件都需要重新編譯,Makefile中紀錄有文件的信息,在make時會決定在鏈接的時候需要重新編譯哪些文件。

  Makefile的宗旨就是:讓編譯器知道要編譯一個文件需要依賴其他的哪些文件。當那些依賴文件有了改變,編譯器會自動的發現最終的生成文件已經過時,而重新編譯相應的模塊。

   Makefile的基本結構不是很複雜,但當一個程序開發人員開始寫Makefile時,經常會懷疑自己寫的是否符合慣例,而且自己寫的 Makefile經常和自己的開發環境相關聯,當系統環境變量或路徑發生了變化後,Makefile可能還要跟著修改。這樣就造成了手工書寫 Makefile的諸多問題,automake恰好能很好地幫助我們解決這些問題。

  使用automake,程序開發人員只需要寫一些 簡單的含有預定義宏的文件,由autoconf根據一個宏文件生成configure,由automake根據另一個宏文件生成Makefile.in, 再使用configure依據Makefile.in來生成一個符合慣例的Makefile。下面我們將詳細介紹Makefile的automake生成 方法。

  二、使用的環境

  本文所提到的程序是基於Linux發行版本:Fedora Core release 1,它包含了我們要用到的autoconf,automake。

  三、從helloworld入手

  我們從大家最常使用的例子程序helloworld開始。

  下面的過程如果簡單地說來就是:

  新建三個文件:

   helloworld.c
   configure.in
   Makefile.am

  然後執行:

aclocal; autoconf; automake --add-missing; ./configure; make; ./helloworld


  就可以看到Makefile被產生出來,而且可以將helloworld.c編譯通過。

  很簡單吧,幾條命令就可以做出一個符合慣例的Makefile,感覺如何呀。

  現在開始介紹詳細的過程:

  1、建目錄

  在你的工作目錄下建一個helloworld目錄,我們用它來存放helloworld程序及相關文件,如在/home/my/build下:

$ mkdir helloword
$ cd helloworld


  2、 helloworld.c

  然後用你自己最喜歡的編輯器寫一個hellowrold.c文件,如命令:vi helloworld.c。使用下面的代碼作為helloworld.c的內容。

int main(int argc, char** argv)
{
printf("Hello, Linux World!\n");
return 0;
}


  完成後保存退出。

  現在在helloworld目錄下就應該有一個你自己寫的helloworld.c了。

  3、生成configure

  我們使用autoscan命令來幫助我們根據目錄下的源代碼生成一個configure.in的模板文件。

  命令:

$ autoscan
$ ls
configure.scan helloworld.c


  執行後在hellowrold目錄下會生成一個文件:configure.scan,我們可以拿它作為configure.in的藍本。

  現在將configure.scan改名為configure.in,並且編輯它,按下面的內容修改,去掉無關的語句:

============================configure.in內容開始=========================================
# -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.

AC_INIT(helloworld.c)
AM_INIT_AUTOMAKE(helloworld, 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)
============================configure.in內容結束=========================================


 
 然後執行命令aclocal和autoconf,分別會產生aclocal.m4及configure兩個文件:

$ aclocal
$ls
aclocal.m4 configure.in helloworld.c
$ autoconf
$ ls
aclocal.m4 autom4te.cache configure configure.in helloworld.c


  大家可以看到configure.in內容是一些宏定義,這些宏經autoconf處理後會變成檢查系統特性、環境變量、軟件必須的參數的shell腳本。

  autoconf 是用來生成自動配置軟件源代碼腳本(configure)的工具。configure腳本能獨立於autoconf運行,且在運行的過程中,不需要用戶的干預。

  要生成configure文件,你必須告訴autoconf如何找到你所用的宏。方式是使用aclocal程序來生成你的aclocal.m4。

  aclocal根據configure.in文件的內容,自動生成aclocal.m4文件。aclocal是一個perl 腳本程序,它的定義是:「aclocal - create aclocal.m4 by scanning configure.ac」。

  autoconf從configure.in這個列舉編譯軟件時所需要各種參數的模板文件中創建configure。

  autoconf需要GNU m4宏處理器來處理aclocal.m4,生成configure腳本。

  m4是一個宏處理器。將輸入拷貝到輸出,同時將宏展開。宏可以是內嵌的,也可以是用戶定義的。除了可以展開宏,m4還有一些內建的函數,用來引用文件,執行命令,整數運算,文本操作,循環等。m4既可以作為編譯器的前端,也可以單獨作為一個宏處理器。

  4、新建Makefile.am

  新建Makefile.am文件,命令:

$ vi Makefile.am


  內容如下:

AUTOMAKE_OPTIONS=foreign
bin_PROGRAMS=helloworld
helloworld_SOURCES=helloworld.c


  automake會根據你寫的Makefile.am來自動生成Makefile.in。

  Makefile.am中定義的宏和目標,會指導automake生成指定的代碼。例如,宏bin_PROGRAMS將導致編譯和連接的目標被生成。

  5、運行automake

  命令:

$ automake --add-missing
configure.in: installing `./install-sh'
configure.in: installing `./mkinstalldirs'
configure.in: installing `./missing'
Makefile.am: installing `./depcomp'


  automake會根據Makefile.am文件產生一些文件,包含最重要的Makefile.in。

  6、執行configure生成Makefile

$ ./configure
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for gawk... gawk
checking whether make sets $(MAKE)... yes
checking for gcc... gcc
checking for C compiler default output... a.out
checking whether the C compiler works... yes
checking whether we are cross compiling... no
checking for suffix of executables...
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
checking whether gcc accepts -g... yes
checking for gcc option to accept ANSI C... none needed
checking for style of include used by make... GNU
checking dependency style of gcc... gcc3
configure: creating ./config.status
config.status: creating Makefile
config.status: executing depfiles commands
$ ls -l Makefile
-rw-rw-r-- 1 yutao yutao 15035 Oct 15 10:40 Makefile


  你可以看到,此時Makefile已經產生出來了。

  7、使用Makefile編譯代碼

$ make
if gcc -DPACKAGE_NAME=\"\" -DPACKAGE_TARNAME=\"\" -DPACKAGE_VERSION=\"\" -

DPACKAGE_STRING=\"\" -DPACKAGE_BUGREPORT=\"\" -DPACKAGE=\"helloworld\" -DVERSION=\"1.0\"

-I. -I. -g -O2 -MT helloworld.o -MD -MP -MF ".deps/helloworld.Tpo" \
-c -o helloworld.o `test -f 'helloworld.c' || echo './'`helloworld.c; \
then mv -f ".deps/helloworld.Tpo" ".deps/helloworld.Po"; \
else rm -f ".deps/helloworld.Tpo"; exit 1; \
fi
gcc -g -O2 -o helloworld helloworld.o


  運行helloworld

$ ./helloworld
Hello, Linux World!


   這樣helloworld就編譯出來了,你如果按上面的步驟來做的話,應該也會很容易地編譯出正確的helloworld文件。你還可以試著使用一些其 他的make命令,如make clean,make install,make dist,看看它們會給你什麼樣的效果。感覺如何?自己也能寫出這麼專業的Makefile,老闆一定會對你刮目相看。

  四、深入淺出

  針對上面提到的各個命令,我們再做些詳細的介紹。

  1、 autoscan

   autoscan是用來掃瞄源代碼目錄生成configure.scan文件的。autoscan可以用目錄名做為參數,但如果你不使用參數的話,那麼 autoscan將認為使用的是當前目錄。autoscan將掃瞄你所指定目錄中的源文件,並創建configure.scan文件。

  2、 configure.scan

  configure.scan包含了系統配置的基本選項,裡面都是一些宏定義。我們需要將它改名為configure.in

  3、 aclocal

   aclocal是一個perl 腳本程序。aclocal根據configure.in文件的內容,自動生成aclocal.m4文件。aclocal的定義是:「aclocal - create aclocal.m4 by scanning configure.ac」。

  4、 autoconf

  autoconf是用來產生configure文件的。configure是一個腳本,它能設置源程序來適應各種不同的操作系統平台,並且根據不同的系統來產生合適的Makefile,從而可以使你的源代碼能在不同的操作系統平台上被編譯出來。

   configure.in文件的內容是一些宏,這些宏經過autoconf 處理後會變成檢查系統特性、環境變量、軟件必須的參數的shell腳本。configure.in文件中的宏的順序並沒有規定,但是你必須在所有宏的最前 面和最後面分別加上AC_INIT宏和AC_OUTPUT宏。

  在configure.ini中:

  #號表示註釋,這個宏後面的內容將被忽略。

  AC_INIT(FILE)

  這個宏用來檢查源代碼所在的路徑。

AM_INIT_AUTOMAKE(PACKAGE, VERSION)


   這個宏是必須的,它描述了我們將要生成的軟件包的名字及其版本號:PACKAGE是軟件包的名字,VERSION是版本號。當你使用make dist命令時,它會給你生成一個類似helloworld-1.0.tar.gz的軟件發行包,其中就有對應的軟件包的名字和版本號。

AC_PROG_CC

  這個宏將檢查系統所用的C編譯器。

AC_OUTPUT(FILE)

  這個宏是我們要輸出的Makefile的名字。

  我們在使用automake時,實際上還需要用到其他的一些宏,但我們可以用aclocal 來幫我們自動產生。執行aclocal後我們會得到aclocal.m4文件。

  產生了configure.in和aclocal.m4 兩個宏文件後,我們就可以使用autoconf來產生configure文件了。

  5、 Makefile.am

  Makefile.am是用來生成Makefile.in的,需要你手工書寫。Makefile.am中定義了一些內容:

AUTOMAKE_OPTIONS

  這個是automake的選項。在執行automake時,它會檢查目錄下是否存在標準GNU軟件包中應具備的各種文件,例如AUTHORS、ChangeLog、NEWS等文件。我們將其設置成foreign時,automake會改用一般軟件包的標準來檢查。

bin_PROGRAMS

  這個是指定我們所要產生的可執行文件的文件名。如果你要產生多個可執行文件,那麼在各個名字間用空格隔開。

helloworld_SOURCES

   這個是指定產生「helloworld」時所需要的源代碼。如果它用到了多個源文件,那麼請使用空格符號將它們隔開。比如需要 helloworld.h,helloworld.c那麼請寫成helloworld_SOURCES= helloworld.h helloworld.c。

  如果你在bin_PROGRAMS定義了多個可執行文件,則對應每個可執行文件都要定義相對的filename_SOURCES。

  6、 automake

  我們使用automake --add-missing來產生Makefile.in。

  選項--add-missing的定義是「add missing standard files to package」,它會讓automake加入一個標準的軟件包所必須的一些文件。

  我們用automake產生出來的Makefile.in文件是符合GNU Makefile慣例的,接下來我們只要執行configure這個shell 腳本就可以產生合適的 Makefile 文件了。

  7、 Makefile

  在符合GNU Makefiel慣例的Makefile中,包含了一些基本的預先定義的操作:

make

  根據Makefile編譯源代碼,連接,生成目標文件,可執行文件。

make clean

  清除上次的make命令所產生的object文件(後綴為「.o」的文件)及可執行文件。

make install

  將編譯成功的可執行文件安裝到系統目錄中,一般為/usr/local/bin目錄。

make dist

  產生發布軟件包文件(即distribution package)。這個命令將會將可執行文件及相關文件打包成一個tar.gz壓縮的文件用來作為發佈軟件的軟件包。

  它會在當前目錄下生成一個名字類似「PACKAGE-VERSION.tar.gz」的文件。PACKAGE和VERSION,是我們在configure.in中定義的AM_INIT_AUTOMAKE(PACKAGE, VERSION)。

make distcheck

  生成發佈軟件包並對其進行測試檢查,以確定發佈包的正確性。這個操作將自動把壓縮包文件解開,然後執行configure命令,並且執行make,來確認編譯不出現錯誤,最後提示你軟件包已經準備好,可以發佈了。

===============================================
helloworld-1.0.tar.gz is ready for distribution
===============================================
make distclean


  類似make clean,但同時也將configure生成的文件全部刪除掉,包括Makefile。

  五、結束語

  通過上面的介紹,你應該可以很容易地生成一個你自己的符合GNU慣例的Makefile文件及對應的項目文件。

  如果你想寫出更複雜的且符合慣例的Makefile,你可以參考一些開放代碼的項目中的configure.in和Makefile.am文件,比如:嵌入式數據庫sqlite,單元測試cppunit。


結合實際,用autoscan和automake由makefile.am自動生成makefile的過程中所遇問題與總結


對於一個UNIX/Linux下C程序員來說,一個比較麻煩的工作就是寫自己的Makefile。可能你有如下經驗:寫一個簡單的C程序,自己多寫幾行gcc命令就把程序變成可執行的了;寫一個稍微複雜點的程序,源文件個數可能在30個左右,還是寫一行行的gcc命令就麻煩了,你可能想到寫個makefile,你可能也在這樣做著;但你某一天會發現你寫的這個Makefile可能不是一個所有 UNIX/Linux類操作系統下通用的Makefile,比如某人下載了你的程序去他自己電腦上可能make不了。

 

這樣,你就有必要瞭解並學會運用autoconf和automake了

 

先簡單介紹一下這兩個工具:
 

 

autoconf是一個用於生成可以自動地配置軟件源代碼包以適應多種UNIX類系統的shell腳本的工具。由autoconf生 成的配置腳本在運行的時候不需要用戶的手工干預;通常它們甚至不需要手工給出參數以確定系統的類型。相反,它們對軟體套件可能需要的各種特徵進行獨立的測試。在每個測試之前,它們打印一個單行的消息以說明它們正在進行的檢測,以使得用戶不會因為等待腳本執行完畢而焦躁。因此,它們在混合系統或者從各種常見UNIX變種定製而成的系統中工作的很好。你也省了工作,沒必要維護文件以儲存由各個UNIX變種、各個發行版本所支持的特徵的列表。
 

 

automake是一個從文件Makefile.am自動生成Makefile.in的工具。每個Makefile.am基本上是一系列make的宏定義(make規則也會偶爾出現)生成的Makefile.in,服從GNU Makefile標準。為了生成Makefile.in,automake需要perl。但是由automake創建的發布完全服從GNU標準,並且在創建中不需要perl。

   

 

 

不囉嗦了,進入正題~

在本文中,我將結合最近的實踐經歷以及遇到的問題,給大家介紹如何使用autoconf和automake兩個工具來幫助我們自動地生成符合自由軟件慣例的Makefile,這樣就可以像常見的GNU程序一樣,只要使用「./configure」,「make」,「make instal」就可以把程序安裝到Linux系統中去了。

   

 

 

* 在開始使用autoconf和automake之前,首先確認你的系統安裝有GNU的如下軟件:
    1. automake
    2. autoconf
    3. m4
    4. perl
    5.
如果你需要產生共享函示庫(shared library)則還需要GNU Libtool。

   

 

* 介紹方法之前,大家先記下autoconf和automake工作的幾個步驟,步驟解釋如下:                 

 

1、由你的原始檔案通過autoscanf命令生成configure.scan檔案,然後修改configure.scan檔案並重命名為configure.in
      2、由aclocal命令生成aclocal.m4
      3、由autoconf命令生成configure

 

註:很重要

如果這裡緊接著直接進行第4步:

automake --add-missing:後會出現錯誤:configure.in:8:required file

   `./config.h.in' not found

緊接著./configure後會出現 config.status: error: cannot find input file:

config.h


解決辦法:在automake --add-missing之前執行autoheader就ok了,一般網上的資料,很少有人提到這一步,大家也都是轉來轉去,所有會導致錯誤的發生。


    4
、編輯一個Makefile.am文件並由automake(automake --add-missing)命令生成Makefile.in檔案

 
    5、./configure命令生成Makefile    (後面有命令介紹)

     

實戰:我的源程序結構如下總共兩個目錄:viaencode/ 、videolib/,
viaencode/下有兩個原始檔案和一個makefile.am
檔案: encodeapi.c 、viaenc.c 、 Makefile.amvideolib/下有四個標頭: MP4EncApi.h、hw_lib.h、ViaApi.h 、itu.h,以及六個 *.a 函式庫檔案:libext_device_ctrl.a 、libhwdec.a、libhwenc.a、libitu.a、libuserdev.a、libvia.a。生成目標程序viaenc要下載到開板中執行。


    按照如下步驟來自動生成Makefile吧:


1進入viaencode/目錄,運行autoscan命令,命令如下:


# cd viaencode/
# autoscan


2ls會發現多了一個configure.scan文件。修改此文件,在AC_INIT宏之後加入AM_INIT_AUTOMAKE(viaenc, 1.0),這裡hello是你的軟件名稱,1.0是版本號,即你的這些源程序編譯將生成一個軟件viaenc-1.0版。「然後把 configure.scan文件的最後一行AC_OUTPUT宏填寫完整變成AC_OUTPUT(Makefile),表明autoconf和 automake最終將生成Makefile文件」,這樣的話會出錯,因為之前有一句AC_CONFIG_FILES([Makefile]),所以我沒變。最後把configure.scan文件改名為configure.in


3aclocal命令,ls會發現多了一個aclocal.m4檔案


4然後運行autoconf命令,ls 將發現生成了一個可執行的configure命令。


5、執行autoheader,前面已講過。     

                                          

6、編輯一個Makefile.am文件,已有,檔案內容如下:

 
    bin_PROGRAMS = viaenc
    viaenc_SOURCES = viaenc.c encodeapi.c
    AM_CFLAGS = -I../videolib
    LDADD = -L../videolib -lvia -litu -lhwdec -lext_device_ctrl -lhwenc -     lpthread -luserdev

 

7執行automake --add-missing命令。螢幕提示如下:


automake: configure.in: installing `./install-sh'
automake: configure.in: installing `./mkinstalldirs'
automake: configure.in: installing `./missing'

 

8、行configure命令來生成一個Makefile文件,輸入./configure命令即可 。


 9、因為應用程序是要下載到開發版中運行,所以必須修改交叉編譯工具。修改Makefile中的CC = gcc,改為指向自己的交叉編譯工具,CC=/usr/local/arm/gcc-3.4.4-glibc-2.3.6/bin/arm-linux-gcc。否則會出錯!!!
 

 

10、經過上述這些步驟後,輸入一個make即可生成目標程序viaenc,然後就可以運行./viaenc使你的程序執行了。

  

運用autoconf和automake的最大好處是,你的程序以源程序方式發佈後,其它所有人只需要依次輸入./configure ,make,make install命令就可以把你的程序安裝在自己的電腦上運行了。所有符合GNU標準的UNIX/Linux都不需要再修改Makefile裡的任何字串。


 

總的來說,程序開發人員只需要寫一些簡單的含有預定義巨集的文件,由autoconf根據一個巨集文件生成configure,由automake根據另一個巨集檔案生成Makefile.in 再使用configure依據Makefile.in來生成一個符合慣例的Makefile


 


 

以下我們再做些詳細的介紹。

1、autoscan
autoscan 是用來掃瞄原始碼目錄生成configure.scan檔案的。autoscan可以用目錄名做為參數,但如果你不使用參數的話,那麼 autoscan將認為使用的是當前目錄。autoscan將掃瞄你所指定目錄中的原始碼檔案,並創建configure.scan檔案。

2、configure.scan
configure.scan包含了系統配置的基本選項,裡面都是一些巨集定義。我們需要將它改名為configure.in

3、aclocal
aclocal 是一個perl 腳本程序。aclocal根據configure.in檔案的內容,自動生成aclocal.m4檔案。aclocal的定義是:「aclocal - create aclocal.m4 by scanning configure.ac」。

4、autoconf
autoconf是用來產生configure檔案的。configure是一個腳本,它能設置源程序來適應各種不同的操作系統平台,並且根據不同的系統來產生合適的Makefile,從而可以使你的原始碼能在不同的操作系統平台上被編譯出來。

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

在configure.in中:

#號表示註釋,這個巨集後面的內容將被忽略。

AC_INIT(FILE)
這個巨集用來檢查原始碼所在的路徑。

AM_INIT_AUTOMAKE(PACKAGE, VERSION)
這 個巨集是必須的,它描述了我們將要生成的軟體套件的名字及其版本號:PACKAGE是軟體套件的名字,VERSION是版本號。當你使用make dist命令時,它會給你生成一個類似helloworld-1.0.tar.gz的軟體發行套件,其中就有對應的軟體套件的名字和版本號。

AC_PROG_CC
這個巨集將檢查系統所用的C編譯器。

AC_OUTPUT(FILE)
這個巨集是我們要輸出的Makefile的名字。

我們在使用automake時,實際上還需要用到其他的一些巨集,但我們可以用aclocal 來幫我們自動產生。執行aclocal後我們會得到aclocal.m4檔案。

產生了configure.in和aclocal.m4 兩個巨集檔案後,我們就可以使用autoconf來產生configure檔案了。

5、Makefile.am

例子:AUTOMAKE_OPTIONS=foreign
bin_PROGRAMS=hello
hello_SOURCES=main.c comm/comm.c comm/comm.h tools/tools.c tools/tools.h db/db.c db/db.h network/network.c network/network.h interface/interface.c interface/interface.h
Makefile.am是用來生成Makefile.in的,需要你手工書寫。Makefile.am中定義了一些內容:

AUTOMAKE_OPTIONS
這個是automake的選項。在執行automake時,它會檢查目錄下是否存在標準GNU軟體套件中應具備的各種檔案,例如AUTHORS、ChangeLog、NEWS等檔案。我們將其設置成foreign時,automake會改用一般軟體套件的標準來檢查。

bin_PROGRAMS
這個是指定我們所要產生的可執行檔案的檔案名。如果你要產生多個可執行檔案,那麼在各個名字間用空格隔開。

helloworld_SOURCES
這 個是指定產生「helloworld」時所需要的原始碼。如果它用到了多個原始碼檔案,那麼請使用空格符號將它們隔開。比如需要 helloworld.h,helloworld.c那麼請寫成helloworld_SOURCES= helloworld.h helloworld.c。

如果你在bin_PROGRAMS定義了多個可執行檔案,則對應每個可執行檔案都要定義相對的filename_SOURCES。 如:bin_PROGRAMS=hello1 hello2   hello1_SOURCES=… hello2_SOURCES=…

6、automake
我們使用automake --add-missing來產生Makefile.in。

選項--add-missing的定義是「add missing standard files to package」,它會讓automake加入一個標準的軟體套件所必須的一些檔案。

我們用automake產生出來的Makefile.in檔案是符合GNU Makefile慣例的,接下來我們只要執行configure這個shell 腳本就可以產生合適的 Makefile 檔案了。


7、 Makefile
在符合GNU Makefiel慣例的Makefile中,包含了一些基本的預先定義的操作:

make
根據Makefile編譯原始碼,連接,生成目標檔案,可執行檔案。

make clean
清除上次的make命令所產生的object檔案(後綴為「.o」的檔案)及可執行檔案。

make install
將編譯成功的可執行檔案安裝到系統目錄中,一般為/usr/local/bin目錄。

make dist
產生發布軟體套件檔案(即distribution package)。這個命令將會將可執行檔案及相關檔案打包成一個tar.gz壓縮的檔案用來作為發佈軟體的軟體套件。

它會在當前目錄下生成一個名字類似「PACKAGE-VERSION.tar.gz」的檔案。PACKAGE和VERSION,是我們在configure.in中定義的AM_INIT_AUTOMAKE(PACKAGE, VERSION)。

make distcheck
生成發佈軟體套件並對其進行測試檢查,以確定發佈套件的正確性。這個操作將自動把壓縮套件檔案解開,然後執行configure命令,並且執行make,來確認編譯不出現錯誤,最後提示你軟體套件已經準備好,可以發佈了。

===============================================
helloworld-1.0.tar.gz is ready for distribution
===============================================
make distclean
類似make clean,但同時也將configure生成的檔案全部刪除掉,包括Makefile。

大家可以看到configure.in內容是一些巨集定義,這些巨集經autoconf處理後會變成檢查系統特性、環境變量、軟體必須的參數的shell腳本。
   autoconf 是用來生成自動配置軟體原始碼腳本(configure)的工具。configure腳本能獨立於autoconf運行,且在運行的過程中,不需要用戶的干預。
   要生成configure檔案,你必須告訴autoconf如何找到你所用的巨集。方式是使用aclocal程序來生成你的aclocal.m4。
   aclocal根據configure.in檔案的內容,自動生成aclocal.m4檔案。aclocal是一個perl 腳本程序,它的定義是:「aclocal - create aclocal.m4 by scanning configure.ac」。
   autoconf從configure.in這個列舉編譯軟體時所需要各種參數的模板檔案中創建configure。   autoconf需要GNU m4巨集處理器來處理aclocal.m4,生成configure腳本。
m4是一個巨集處理器。將輸入拷貝到輸出,同時將巨集展開。巨集可以是內嵌的,也可以是用戶定義的。除了可以展開巨集,m4還有一些內建的函數,用來引用檔案,執行命令,整數運算,文本操作,循環等。m4既可以作為編譯器的前端,也可以單獨作為一個巨集處理器。)//

automake支持三種目錄層次:flat、shallow和deep。
一個flat套件指的是所有檔案都在一個目錄中的套件。為這類套件提供的Makefile.am不需要SUBDIRS這個巨集。這類套件的一個例子是termutils。對應咱們程序員來說:就是所有原始碼檔案及自己寫的頭檔案都位於當前目錄裡面,且沒有子目錄。

一 個deep套件指的是所有的原始碼都被儲存在子目錄中的套件;頂層目錄主要包含配置訊息。GNU cpio是這類套件的一個很好的例子,GNU tar也是。deep套件的頂層Makefile.am將包括巨集SUBDIRS,但沒有其它定義需要創建的對象的巨集。對應咱們程序員來說:就是所有原 始碼檔案及自己寫的頭檔案都位於當前目錄的一個子目錄裡面,而當前目錄裡沒有任何原始碼檔案。


一個shallow套件指的是主要的原始碼儲存在頂 層目錄中,而各個部分(典型的是庫)則儲存在子目錄中的套件。automake本身就是這類套件(GNU make也是如此,它現在已經不使用automake)。對應咱們程序員來說:就是主要原始碼檔案在當前目錄裡,而其它一些實現各部分功能的原始碼檔案各 自位於不同目錄。


前兩個層次的程序編輯方法非常簡單,按照上述步驟一步步即可。而第三種層次shallow稍微複雜一點,但這是我們經常寫程序用到的結構。

結束語:

通過上面的介紹,你應該可以很容易地生成一個你自己的符合GNU慣例的Makefile檔案及對應的項目檔案。如果你想寫出更複雜的且符合慣例的Makefile,你可以參考一些開放代碼的項目中的configure.in和Makefile.am檔案,比如:嵌入式資料庫sqlite,單元測試cppunit。

arrow
arrow
    全站熱搜

    Bluelove1968 發表在 痞客邦 留言(0) 人氣()