轉(zhuǎn)載自:configure.ac (configure.in)詳解--鵬博客(http://www.ivpeng.com/pblog/configure-ac.html)
用自動生成Makefile的工具來生成Makefile的過程中表谊,需要用autoscan命令來生成configure.scan文件,然后將它改名字為configure.ac或者configure.in,然后就來更改其中的一些相關(guān)信息來完成下面需要完成的配置盖喷,那么這個configure.ac怎么來寫爆办?今天我們就將這個過程分開來和大家共同研究和探討下。
我們在生成的過程中會用autoconf命令來處理configure.ac/configure.in文件课梳,生成一個configure的腳本距辆。生成后的configure文件是一個可以移植的shell腳本,運行的時候它檢查編譯環(huán)境暮刃,來決定哪些庫是可以用的跨算,所用到的平臺有哪些個特征,那些個頭文件和庫是已經(jīng)找到的等等椭懊, 然后收集到的這些信息诸蚕,它修改編譯標(biāo)記,生成一個Makefile文件氧猬,同時生成一個包含已定義的預(yù)處理符號的config.h文件背犯。configure并不需要運行autoconf,所以我們在發(fā)布應(yīng)用程序之前生成這個文件盅抚,如此我們就不必有autoconf的軟件包了漠魏。
說了這么多現(xiàn)在應(yīng)該步入主題了,現(xiàn)在我們需要坐的就是寫一個configure.in文件泉哈。configure.in文件里基本的內(nèi)容就是一系列的m4宏蛉幸,在運行時根據(jù)傳遞給它們的參數(shù),定義的宏就會擴展為shell的腳本代碼段丛晦。也可以手工書寫shell代碼奕纫。不過我們就不說這個了,要想完全的理解configure.in怎樣寫烫沙,其實是要求有一些m4的知識匹层,還要一些 Bourneshell的知識。要這么多知識做基礎(chǔ)好難锌蓄,不過還好的的是升筏,有省事的方法,就是可以找一個已有的configure.in文件瘸爽,然后以此來修改它以適應(yīng)你所要完成的任務(wù)您访。如果想了解可以看看autoconf手冊,其中介紹了很多預(yù)先寫好的宏剪决。
下面我們就來通過一個簡單的configure.ac文件灵汪,來了解一些非常常用的宏和含義:
AC_INIT(src/hello.c)
AM_CONFIG_HEADER(config.h)
AM_INIT_AUTOMAKE(GnomeHello,0.1)
AM_MAINTAINER_MODE
AM_ACLOCAL_INCLUDE(macros)
GNOME_INIT
AC_PROG_CC
AC_ISC_POSIX
AC_HEADER_STDC
AC_ARG_PROGRAM
AM_PROG_LIBTOOL
GNOME_COMPILE_WARNINGS
ALL_LINGUAS=”es”
AM_GNU_GETTEXT
AC_SUBST(CFLAGS)
AC_SUBST(CPPFLAGS)
AC_SUBST(LDFLAGS)
AC_OUTPUT([
Makefile
macros/Makefile
src/Makefile
intl/Makefile
po/Makefile.in
pixmaps/Makefile
doc/Makefile
doc/C/Makefile
doc/es/Makefile
])
下面我們逐一對例子中的代碼進行一下解釋檀训,例子中以AC開頭的宏來自autoconf,以AM開頭的宏來自automake享言【欤可以從autoconf或 automake中尋求幫助,這一點很有用览露。以GNOME開頭的宏來自于Gnomemacros目錄荧琼。這些宏都是用m4宏語言寫的。如果將 autoconf和automake安裝在/usr目錄下差牛,autoconf和automake中的標(biāo)準(zhǔn)宏一般放在/usr/share/aclocal 目錄下命锄。
AC_INIT總是configure.in中的第一個宏。它擴展為許多可由其他configure腳本共享的模板文件代碼偏化。這些代碼解析傳到 configure中的命令行參數(shù)累舷。這個宏的一個參數(shù)是一個文件名,這個文件應(yīng)該在源代碼目錄中夹孔,它用于健全性檢查被盈,以保證configure腳本已正確定位源文件目錄。
AM_CONFIG_HEADER指定了要創(chuàng)建的頭文件搭伤,差不多總是config.h只怎。創(chuàng)建的頭文件包含由configure定義的C預(yù)處理符號。最低限度應(yīng)該定義PACKAGE和VERSION符號怜俐,這樣可以將應(yīng)用程序名稱和版本傳送到代碼中身堡,而無須對它們硬編碼(非公用的源文件應(yīng)該包含 config.h(#include)以利用這些定義。然而拍鲤,不要將config.h文件安裝到系統(tǒng)中贴谎,因為它有可能與其他的軟件包沖突)。
AM_INIT_AUTOMAKE初始化automake季稳。傳到這個宏里的參數(shù)是要編譯的應(yīng)用程序的名稱和版本號(這些參數(shù)成為config.h中定義的PACKAGE和VERSION值)擅这。
AM_MAINTAINER_MODE關(guān)閉缺省時僅供程序維護者使用的makefile目標(biāo),并修改以使configure能理解 –enable-maintainer-mode選項景鼠。–enable-maintainer-mode將maintaineronly目標(biāo)重新打開仲翎。僅供維護者使用的makefile目標(biāo)允許最終用戶清除自動生成的文件,比如configure铛漓,這意味著要修復(fù)編譯故障溯香,必須安裝有autoconf和automake軟件。注意浓恶,因為autogen.sh腳本主要是給開發(fā)人員用的玫坛,autogen.sh會自動傳遞一個–enable- maintainer-mode選項給configure。
AM_ACLOCAL_INCLUDE指定一個附加的目錄包晰,用于搜索m4宏湿镀。在這里禀梳,它指定為macros子目錄。在這個目錄中應(yīng)該有Gnome宏的拷貝肠骆。
GNOME_INIT給configure添加一個與Gnome相關(guān)的命令行參數(shù)個數(shù),并為Gnome程序定義一些makefile變量塞耕,這些變量中包含了必要的預(yù)處理程序和鏈接程序標(biāo)志蚀腿。這些標(biāo)志是由gnome-config腳本取得的。安裝gnome-libs時會安裝gnome- config腳本扫外。
AC_PROG_CC定位C編譯器莉钙。
AC_CHECK_LIB如果程序中加入了多線程用到的鎖的話就要加入像?AC_CHECK_LIB([pthread], [main])這樣的檢測,這個宏的含義如下:
LIBS是link的一個選項筛谚,程序中使用了讀寫鎖磁玉,所以要測試pthread庫中是否存在pthread_rwlock_init函數(shù)。
AC_PROG_RANLIB如果是多線程的程序的話要加入這句話驾讲,要不運行automake命令時會出錯蚊伞。
AC_ISC_POSIX添加一些在某些平臺上實現(xiàn)POSIX兼容需要的標(biāo)志。
AC_HEADER_STDC檢查當(dāng)前平臺上是否有標(biāo)準(zhǔn)的ANSI頭文件吮铭,如果有时迫,則定義STDC_HEADERS。
AC_ARG_PROGRAM添加一些選項到configure中谓晌,讓用戶能夠修改安裝程序的名稱(如果在用戶系統(tǒng)上碰巧有一個與要安裝的程序名稱相同的程序掠拳,這是很有用的)。
AM_PROG_LIBTOOL是由automake用來設(shè)置libtool的用途的纸肉。只在計劃編譯共享庫或動態(tài)可加載模塊時才需要設(shè)置這個值溺欧。
GNOME_COMPILE_WARNINGS給gcc命令行添加許多警告選項,但是在其他絕大多數(shù)的編譯器上什么也不做柏肪。
ALL_LINGUAS=“es”不是一個宏姐刁,只是一句shell代碼。它包含一個由空格分隔的語言種類縮寫表烦味,對應(yīng)于po子目錄下的.po文件龙填。.po文件包含翻譯成其他語言的文本,所以ALL_LINGUAS應(yīng)該列出程序已經(jīng)被翻譯成的所有語言拐叉。
AM_GNU_GETTEXT由automake使用岩遗,但是這個宏會隨gettext軟件包發(fā)布。它讓 automake執(zhí)行一些與國際化相關(guān)的任務(wù)凤瘦。
AC_SUBST輸出一個變量到由configure生成的文件中宿礁。具體內(nèi)容將在后面說明。
AC_OUTPUT列出由configure腳本創(chuàng)建的文件蔬芥。這些文件都是由帶.in后綴的同名文件生成的梆靖。例如控汉,src/Makefile是由src/Makefile.in生成的,config.h是由config.h.in生成的返吻。在執(zhí)行AC_OUTPUT宏時姑子,configure腳本處理包含有兩個@符號標(biāo)志的變量(例如@PACKAGE@)的文件。只有用AC_SUBST輸出了變量测僵,它才能識別這些變量(許多在上面討論過的預(yù)先寫好的宏都用AC_SUBST定義變量)街佑。這些特征用于將一個Makefile.in文件轉(zhuǎn)換成一個Makefile文件。典型情況下捍靠,Makefile.in 是由automake從Makefile.am(了解更多Makefile.am的寫法請閱讀《Makefile.am 規(guī)則和實例詳解》)生成的(不過沐旨,你可以只用autoconf,而不用automake榨婆,自己編寫一個 Makefile.in)磁携。
上面例子中提到的宏都是基本配置和常用的,還有一些可以用到的宏大家有興趣的話可以學(xué)習(xí)收集下良风,不過基本上上面所說的已經(jīng)可以完成一次配置谊迄,不過這里寫的一些配置大多數(shù)是收集于網(wǎng)絡(luò),希望大家和鵬博客共同學(xué)習(xí)提高烟央,有不對的地方希望大家能之出鳞上,希望大家能支持。