1. 程式人生 > >運用Autoconf和Automake生產Makefile的學習之路

運用Autoconf和Automake生產Makefile的學習之路

Makefile

makefile用來定義整個工程的編譯規則。一個工程的原始檔按照型別、功能、模組分別放在若干個子目錄中,makefile定義了一系列的規則來指定,哪些檔案需要先編譯,哪些檔案需要後編譯,哪些檔案需要重新編譯,甚至於進行更復雜的功能操作。因為makefile就像一個Shell指令碼一樣,其中也可以執行作業系統的命令。
makefile帶來的好處就是——”自動化編譯“,一旦寫好,只需要一個make命令,整個工程完全自動編譯,極大的提高了軟體開發的效率。make是一個命令工具,是一個解釋makefile中指令的命令工具,一般來說,大多數的IDE都有這個命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可見,makefile都成為了一種在工程方面的編譯方法。

Autoconf

Autoconf是一個用於生成可以自動地配置軟體原始碼包以適應多種Unix類系統的 shell指令碼的工具。由Autoconf生成的配置指令碼在執行的時候與Autoconf是無關的, 就是說配置指令碼的使用者並不需要擁有Autoconf。

Automake

Automake是一個從檔案Makefile.am'自動生成Makefile.in’ 的工具。每個Makefile.am'基本上是一系列make的巨集定義 (make規則也會偶爾出現)。生成的Makefile.in’服從GNU Makefile標準。GNU Makefile標準文件長、複雜,而且會發生改變。Automake的目的就是解除個人GNU維護者維護Makefile的負擔 (並且讓Automake的維護者來承擔這個負擔)。典型的Automake輸入檔案是一系列簡單的巨集定義。處理所有這樣的檔案以建立 Makefile.in'。在一個專案(project)的每個目錄中通常包含一個

Makefile.am’。Automake在幾個方面對一個專案做了限制;例如它假定專案使用Autoconf並且對`configure.in’的內容施加了某些限制。

Automake支援三種目錄層次: “flat”、“shallow”和“deep”。一個flat(平)包指的是所有檔案都在一個目錄中的包。為這類包提供的Makefile.am' 缺少巨集SUBDIRS。這類包的一個例子是termutils。一個deep(深)包指的是所有的原始碼都被儲存在子目錄中的包;頂層 目錄主要包含配置資訊。GNU cpio 是這類包的一個很好的例子,GNU tar也是。deep包的頂層Makefile.am’將包括 巨集SUBDIRS,但沒有其它定義需要建立的物件的巨集。一個shallow(淺)包指的是主要的原始碼儲存在頂層目錄中,而 各個部分(典型的是庫)則儲存在子目錄中的包。Automake本身就是這類包(GNU make也是如此,它現在已經不使用automake)。

流程總結

1.在存放原始碼的頂層目錄下執行autoscan命令生成configure.scan檔案。
2.將configure.scan檔案改名為configure.in,並對其預設配置進行修改(如何修改參照configure檔案學習)。
3.執行aclocal、autoconf兩個命令,分別生成aclocal.m4、configure檔案。
4.在每個目錄下建立一個名字為Makefile.am的檔案,並輸入相應的內容。
5.autoheader
6.執行automake –add-missing,它根據Makefile.am檔案,生產Makefile.in。
7.執行./ configure指令碼檔案,他根據Makefile.in檔案,生產最終的Makefile檔案。
8.生產Makefile之後,執行“make”編譯工程並且生產可執行程式。

能力進階

以上的的程式還只是處於初級階段,並且生成的是 靜態庫 。我們可以發現,用autoconf和automake生成Makefile的關鍵在於configure.in和Makefile.am的檔案的書寫。所以,要想使自己的功力更上一層,需要熟悉autoconf和automake這兩個工具的使用,其中有很多重要的巨集需要我們瞭解。這裡時具體的參考手冊:

autoconf手冊

   英文版:http://www.gnu.org/software/autoconf/manual/autoconf.html

   中文版:http://www.linuxforum.net/books/autoconf.html

automake手冊

   中文版:http://www.linuxforum.net/books/automake.html

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 檔案中一些巨集的含義如下:

或dnl 或dnl後面的內容作為註釋不會被處理,它們是註釋的起始標誌
AC_INIT([FULL-PACKAGE-NAME], [VERSION], [BUG-REPORT-ADDRESS])
AM_INIT_AUTOMAKE(PACKAGE,VERSION) 這個是後面執行automake命令所必需的巨集,PACKAGE指明要產生軟體的名稱,VERSION 是其版本號
AC_PROG_CC 檢查系統可用的C編譯器,若原始碼是用C語言編寫的就需要這個巨集
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檔案

執行configure指令碼檔案所產生的Makefile檔案有幾個預訂的選項可供使用:
make all:產生設定的目標,即生成所有可執行檔案。使用make也可以達到此目的。
make clean:刪除之前編譯時生成的可執行檔案和目標檔案(形如*.o的中間檔案)。
make distclean:除了刪除可執行檔案和目標檔案以外,把configure所產生的Makefile檔案也清除掉。通常在釋出軟體之前執行該命令。
make install:將使用make all或make命令產生的可執行檔案以軟體的形式安裝到系統中。若使用bin_PROGRAMS巨集,程式將會被安裝到 /usr/local/bin下,否則安裝到預定義的目錄下。
make dist:將程式和相關的文件包裝為一個壓縮文件以供釋出。執行完該命令,在當前目錄下會產生一個名為PACKAGE-VERSION.tar.gz的檔案。PACKAGE 和 VERSION 這兩個引數是來自configure.in檔案中的AM_INIT_AUTOMAKE(PACKAGE,VERSION)。如在上個例子中執行make dist命令,會產生名“hello-1.0.tar.gz”的檔案。
make distcheck:與make dist類似,但是加入了檢查包裝以後的壓縮檔案是否正常。