搜尋此網誌

2009年5月29日 星期五

Automake 原理介紹

摘自: http://140.92.88.48/tlog/linux/entry/automake_%E5%8E%9F%E7%90%86%E4%BB%8B%E7%B4%B9
by 鄭治中 in Linux驅動程式開發

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 更多技巧的最佳範例。

沒有留言: