歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Linux下的Autoconf和AutoMake

Linux下的Autoconf和AutoMake

日期:2017/2/28 14:27:53   编辑:Linux教程

1、工具安裝

在開始使用autoconf和automake之前,首先確認你的系統安裝有GNU的如下軟件: automake/autoconf/m4/perl。
如果你需要產生共享庫(shared library)則還需要GNU Libtool。
如果使用RedHat的Linux版本,這幾個工具會自動安裝,我試驗中用SUSE11也安裝了所有程序。

autoconf:是一個shell腳本的工具,可以自動地配置軟件源代碼包以適應多種UNIX類系統。由autoconf生成的配置腳本在運行的時候不需要用戶的手工干預;通常它們甚至不需要手工給出參數以確定系統的類型。其中autoconf需要用到m4,便於生成腳本。

automake:是一個從文件Makefile.am自動生成Makefile.in的工具。每個Makefile.am基本上是一系列make的宏定義。生成的Makefile.in,服從GNU Makefile標准。為了生成Makefile.in,automake還需用到perl(它本身就是一個perl程序)。

2、使用流程

(1)由你的源文件通過autoscan命令,生成configure.scan文件,然後修改configure.scan文件並重命名為configure.in。
configure.in文件的內容是一些宏,這些宏經過autoconf 處理後會變成檢查系統特性、環境變量、軟件必須的參數的shell腳本。
configure.in文件中的宏的順序並沒有規定,但是你必須在所有宏的最前面和最後面分別加上AC_INIT宏和AC_OUTPUT宏。
(2)由aclocal命令,從configure.in生成aclocal.m4
(3)由autoconf命令,生成configure
(4)編輯各個Makefile.am文件,並由automake --add-missing 命令生成Makefile.in文件,
(5)運行configure命令,從Makefile.in文件生成Makefile

3、如何修改configure.in文件

AM_INIT_AUTOMAKE(PACKAGE,VERSION)
這個是使用 Automake 所必備的宏,PACKAGE 是所要產生軟件的名稱,VERSION 是版本編號。也可以把包和版本號等信息放在AC_INIT(FILE) 宏裡。
AC_PROG_CC:檢查系統可用的C 編譯器
AC_PROG_RANLIB:如果需要生成靜態庫,則需要加入這一句
AC_PROG_LIBTOOL:如果需要生成動態庫,則加入這一句,表示用libtool自動生成動態庫

4、如何編寫makefile.am文件

在makefile.am檔中需要定義要產生的目標,具體包括:
AUTOMAKE_OPTIONS:設定automake的選項。automake主要是幫助開發GNU軟件的人員維護軟件套件,一般在執行automake時會檢查目錄下是否存在標准GNU套件中應具備的文件檔案,例如NEWS、AUTHOR、ChangeLog等,設成foreign時,automake會改用一般軟件套件標准來檢查,而gnu是缺省設置,該級別下將盡可能地檢查包是否服從GNU標准,gnits是嚴格標准,不推薦。
bin_PROGRAMS:定義要產生的執行檔名稱。產生多個執行檔的話,需要用空格符隔開。
hello_SOURCES:定義hello這個執行檔的源文件,如果該程序由多個原始檔產生,必須把所用到的原始檔都列出來,空格符隔開,例如hello_SOURCES = hello.c main.c hello.h。如果定義了多個執行檔,則對每個執行檔都要定義相對的filename_SOURCES。

舉例:

noinst_LIBRARIES=libhello.a
libhello_a_SOURCES=test.c
AUTOMAKE_OPTIONS=foreign 第一行noinst 表示生成的是靜態庫。如果要把靜態庫生成到其他地方,可以在=後面加上路徑。
第二行表示用來生成靜態庫的源文件。
第三行AUTOMAKE_OPTIONS 是Automake 的選項。 AUTOMAKE_OPTIONS=foreign
lib_LTLIBRARIES=libhello.la
libhello_la_SOURCES=test.c 這裡用la就表示是生成動態庫了 AUTOMAKE_OPTIONS=foreign
INCLUDES= -I../include
bin_PROGRAMS=hello
hello_SOURCES=hello.c
hello_LDADD=../lib/libhello.a

第二行指定頭文件的位置,-I 是idirafter 的縮寫。
第三行指定生成可執行文件名hello,在這裡可執行文件生成在src 下,如需要把可執行文件生成到/root/test 目錄下。
寫法為:bin_PROGRAMS=/root/test/hello,後面的第四、五行也相對應地變為:
_root_test_hello_SOURCES=hello.c
_root_test_hello_LDADD=../lib/libhello.a
第四行指定生成可執行文件hello 的源代碼文件
第五行指定需要使用靜態庫的位置。

5、產生的Makefile結構

利用 configure 所產生的 Makefile 檔有幾個預設的目標可供使用,我們只拿其中幾個簡述如下:
make all
產生我們設定的目標,即此范例中的執行檔。只打 make 也可以,此時會開始編譯原始碼,然後連結,並且產生執行檔。
make clean
清除之前所編譯的執行檔及目的檔 (object file, *.o)。
make distclean
除了清除執行檔和目的檔外,也把 configure 所產生的 Makefile 也清除掉。
make install
將程序安裝至系統中。如果原始碼編譯無誤,且執行結果正確,便可以把程序安裝至系統預設的執行檔存放路徑。如果我們用bin_PROGRAMS 巨集的話,程序會被安裝至 /usr/local/bin 這個目錄。
make dist
將程序和相關的檔案包裝成一個壓縮檔以供散播 (distribution) 。執行完在目錄下會產生一個以 PACKAGE-VERSION.tar.gz 為名稱的檔案。PACKAGE 和 VERSION 這兩個變數是根據 configure.in 檔中AM_INIT_AUTOMAKE(PACKAGE, VERSION) 的定義。在此范例中會產生'hello-1.0.tar.gz' 的檔案。
make distcheck
和 make dist 類似,但是加入檢查包裝後的壓縮檔是否正常。這個目標除了把程序和相關檔案包裝成 tar.gz 檔外,還會自動把這個壓縮檔解開,執行 configure,並且進行 make all 的動作,確認編譯無誤後,會顯示這個 tar.gz 檔已經准備好可供散播了。這個檢查非常有用,檢查過關的套件,基本上可以給任何一個具備 GNU 發展環境的人去重新編譯。

6、其他
其它有關開發 GNU 程序或 C 程序設計及 Makefile 的詳細運用及技巧,建議從 GNU Coding Standards3 (GNU 編碼標准規定) 讀起,裡面包含了 GNU Makefile 慣例,還有發展 GNU 軟體套件的標准程序和慣例。這些 GNU 軟體的線上說明文件可以在 http://www.gnu.org/ 這個網站上找到。

7、我的經驗

(1)config.status: WARNING: 'Makefile.in' seems to ignore the --datarootdir setting;基本上是操作順序的錯誤
(2)編譯錯誤:libtool: line 813: X--tag=CC: command not found
google了半天,終於找到這個:
../libtool: line 763: X–tag=CC: command not found
The libtool on your host computer is causing the problem (using $(echo) when it is not defined). Either install an older libtool version (1.5.26) or define the echo environment variable.
只需要:export echo=echo
(3)configure.in:56: warning: AC_RUN_IFELSE was called before AC_USE_SYSTEM_EXTENSIONS
刪除掉自動的檢測配置,刪除掉臨時文件。

Copyright © Linux教程網 All Rights Reserved