轉(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ì)的地方希望大家能之出,希望大家能支持。