configure.ac (configure.in)詳解

轉(zhuǎn)載自:configure.ac (configure.in)詳解--鵬博客(http://www.ivpeng.com/pblog/configure-ac.html)

用自動(dòng)生成Makefile的工具來生成Makefile的過程中,需要用autoscan命令來生成configure.scan文件,然后將它改名字為configure.ac或者configure.in,然后就來更改其中的一些相關(guān)信息來完成下面需要完成的配置,那么這個(gè)configure.ac怎么來寫?今天我們就將這個(gè)過程分開來和大家共同研究和探討下。

我們?cè)谏傻倪^程中會(huì)用autoconf命令來處理configure.ac/configure.in文件,生成一個(gè)configure的腳本。生成后的configure文件是一個(gè)可以移植的shell腳本,運(yùn)行的時(shí)候它檢查編譯環(huán)境,來決定哪些庫是可以用的,所用到的平臺(tái)有哪些個(gè)特征,那些個(gè)頭文件和庫是已經(jīng)找到的等等, 然后收集到的這些信息,它修改編譯標(biāo)記,生成一個(gè)Makefile文件,同時(shí)生成一個(gè)包含已定義的預(yù)處理符號(hào)的config.h文件。configure并不需要運(yùn)行autoconf,所以我們?cè)诎l(fā)布應(yīng)用程序之前生成這個(gè)文件,如此我們就不必有autoconf的軟件包了。

說了這么多現(xiàn)在應(yīng)該步入主題了,現(xiàn)在我們需要坐的就是寫一個(gè)configure.in文件。configure.in文件里基本的內(nèi)容就是一系列的m4宏,在運(yùn)行時(shí)根據(jù)傳遞給它們的參數(shù),定義的宏就會(huì)擴(kuò)展為shell的腳本代碼段。也可以手工書寫shell代碼。不過我們就不說這個(gè)了,要想完全的理解configure.in怎樣寫,其實(shí)是要求有一些m4的知識(shí),還要一些 Bourneshell的知識(shí)。要這么多知識(shí)做基礎(chǔ)好難,不過還好的的是,有省事的方法,就是可以找一個(gè)已有的configure.in文件,然后以此來修改它以適應(yīng)你所要完成的任務(wù)。如果想了解可以看看autoconf手冊(cè),其中介紹了很多預(yù)先寫好的宏。

下面我們就來通過一個(gè)簡(jiǎn)單的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

])

下面我們逐一對(duì)例子中的代碼進(jìn)行一下解釋,例子中以AC開頭的宏來自autoconf,以AM開頭的宏來自automake。可以從autoconf或 automake中尋求幫助,這一點(diǎn)很有用。以GNOME開頭的宏來自于Gnomemacros目錄。這些宏都是用m4宏語言寫的。如果將 autoconf和automake安裝在/usr目錄下,autoconf和automake中的標(biāo)準(zhǔn)宏一般放在/usr/share/aclocal 目錄下。

AC_INIT總是configure.in中的第一個(gè)宏。它擴(kuò)展為許多可由其他configure腳本共享的模板文件代碼。這些代碼解析傳到 configure中的命令行參數(shù)。這個(gè)宏的一個(gè)參數(shù)是一個(gè)文件名,這個(gè)文件應(yīng)該在源代碼目錄中,它用于健全性檢查,以保證configure腳本已正確定位源文件目錄。

AM_CONFIG_HEADER指定了要?jiǎng)?chuàng)建的頭文件,差不多總是config.h。創(chuàng)建的頭文件包含由configure定義的C預(yù)處理符號(hào)。最低限度應(yīng)該定義PACKAGE和VERSION符號(hào),這樣可以將應(yīng)用程序名稱和版本傳送到代碼中,而無須對(duì)它們硬編碼(非公用的源文件應(yīng)該包含 config.h(#include)以利用這些定義。然而,不要將config.h文件安裝到系統(tǒng)中,因?yàn)樗锌赡芘c其他的軟件包沖突)。

AM_INIT_AUTOMAKE初始化automake。傳到這個(gè)宏里的參數(shù)是要編譯的應(yīng)用程序的名稱和版本號(hào)(這些參數(shù)成為config.h中定義的PACKAGE和VERSION值)。

AM_MAINTAINER_MODE關(guān)閉缺省時(shí)僅供程序維護(hù)者使用的makefile目標(biāo),并修改以使configure能理解 –enable-maintainer-mode選項(xiàng)。–enable-maintainer-mode將maintaineronly目標(biāo)重新打開。僅供維護(hù)者使用的makefile目標(biāo)允許最終用戶清除自動(dòng)生成的文件,比如configure,這意味著要修復(fù)編譯故障,必須安裝有autoconf和automake軟件。注意,因?yàn)閍utogen.sh腳本主要是給開發(fā)人員用的,autogen.sh會(huì)自動(dòng)傳遞一個(gè)–enable- maintainer-mode選項(xiàng)給configure。

AM_ACLOCAL_INCLUDE指定一個(gè)附加的目錄,用于搜索m4宏。在這里,它指定為macros子目錄。在這個(gè)目錄中應(yīng)該有Gnome宏的拷貝。

GNOME_INIT給configure添加一個(gè)與Gnome相關(guān)的命令行參數(shù)個(gè)數(shù),并為Gnome程序定義一些makefile變量,這些變量中包含了必要的預(yù)處理程序和鏈接程序標(biāo)志。這些標(biāo)志是由gnome-config腳本取得的。安裝gnome-libs時(shí)會(huì)安裝gnome- config腳本。

AC_PROG_CC定位C編譯器。

AC_CHECK_LIB如果程序中加入了多線程用到的鎖的話就要加入像?AC_CHECK_LIB([pthread], [main])這樣的檢測(cè),這個(gè)宏的含義如下:

LIBS是link的一個(gè)選項(xiàng),程序中使用了讀寫鎖,所以要測(cè)試pthread庫中是否存在pthread_rwlock_init函數(shù)。

AC_PROG_RANLIB如果是多線程的程序的話要加入這句話,要不運(yùn)行automake命令時(shí)會(huì)出錯(cuò)。

AC_ISC_POSIX添加一些在某些平臺(tái)上實(shí)現(xiàn)POSIX兼容需要的標(biāo)志。

AC_HEADER_STDC檢查當(dāng)前平臺(tái)上是否有標(biāo)準(zhǔn)的ANSI頭文件,如果有,則定義STDC_HEADERS。

AC_ARG_PROGRAM添加一些選項(xiàng)到configure中,讓用戶能夠修改安裝程序的名稱(如果在用戶系統(tǒng)上碰巧有一個(gè)與要安裝的程序名稱相同的程序,這是很有用的)。

AM_PROG_LIBTOOL是由automake用來設(shè)置libtool的用途的。只在計(jì)劃編譯共享庫或動(dòng)態(tài)可加載模塊時(shí)才需要設(shè)置這個(gè)值。

GNOME_COMPILE_WARNINGS給gcc命令行添加許多警告選項(xiàng),但是在其他絕大多數(shù)的編譯器上什么也不做。

ALL_LINGUAS=“es”不是一個(gè)宏,只是一句shell代碼。它包含一個(gè)由空格分隔的語言種類縮寫表,對(duì)應(yīng)于po子目錄下的.po文件。.po文件包含翻譯成其他語言的文本,所以ALL_LINGUAS應(yīng)該列出程序已經(jīng)被翻譯成的所有語言。

AM_GNU_GETTEXT由automake使用,但是這個(gè)宏會(huì)隨gettext軟件包發(fā)布。它讓 automake執(zhí)行一些與國際化相關(guān)的任務(wù)。

AC_SUBST輸出一個(gè)變量到由configure生成的文件中。具體內(nèi)容將在后面說明。

AC_OUTPUT列出由configure腳本創(chuàng)建的文件。這些文件都是由帶.in后綴的同名文件生成的。例如,src/Makefile是由src/Makefile.in生成的,config.h是由config.h.in生成的。在執(zhí)行AC_OUTPUT宏時(shí),configure腳本處理包含有兩個(gè)@符號(hào)標(biāo)志的變量(例如@PACKAGE@)的文件。只有用AC_SUBST輸出了變量,它才能識(shí)別這些變量(許多在上面討論過的預(yù)先寫好的宏都用AC_SUBST定義變量)。這些特征用于將一個(gè)Makefile.in文件轉(zhuǎn)換成一個(gè)Makefile文件。典型情況下,Makefile.in 是由automake從Makefile.am(了解更多Makefile.am的寫法請(qǐng)閱讀《Makefile.am 規(guī)則和實(shí)例詳解》)生成的(不過,你可以只用autoconf,而不用automake,自己編寫一個(gè) Makefile.in)。

上面例子中提到的宏都是基本配置和常用的,還有一些可以用到的宏大家有興趣的話可以學(xué)習(xí)收集下,不過基本上上面所說的已經(jīng)可以完成一次配置,不過這里寫的一些配置大多數(shù)是收集于網(wǎng)絡(luò),希望大家和鵬博客共同學(xué)習(xí)提高,有不對(duì)的地方希望大家能之出,希望大家能支持。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,797評(píng)論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,179評(píng)論 3 414
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,628評(píng)論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,642評(píng)論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,444評(píng)論 6 405
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 54,948評(píng)論 1 321
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,040評(píng)論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,185評(píng)論 0 287
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,717評(píng)論 1 333
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,602評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,794評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,316評(píng)論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,045評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,418評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,671評(píng)論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,414評(píng)論 3 390
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,750評(píng)論 2 370

推薦閱讀更多精彩內(nèi)容