configure.ac (configure.in)詳解

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

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

我們在生成的過程中會用autoconf命令來處理configure.ac/configure.in文件,生成一個configure的腳本。生成后的configure文件是一個可以移植的shell腳本,運行的時候它檢查編譯環境,來決定哪些庫是可以用的,所用到的平臺有哪些個特征,那些個頭文件和庫是已經找到的等等, 然后收集到的這些信息,它修改編譯標記,生成一個Makefile文件,同時生成一個包含已定義的預處理符號的config.h文件。configure并不需要運行autoconf,所以我們在發布應用程序之前生成這個文件,如此我們就不必有autoconf的軟件包了。

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

下面我們就來通過一個簡單的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中的標準宏一般放在/usr/share/aclocal 目錄下。

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

AM_CONFIG_HEADER指定了要創建的頭文件,差不多總是config.h。創建的頭文件包含由configure定義的C預處理符號。最低限度應該定義PACKAGE和VERSION符號,這樣可以將應用程序名稱和版本傳送到代碼中,而無須對它們硬編碼(非公用的源文件應該包含 config.h(#include)以利用這些定義。然而,不要將config.h文件安裝到系統中,因為它有可能與其他的軟件包沖突)。

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

AM_MAINTAINER_MODE關閉缺省時僅供程序維護者使用的makefile目標,并修改以使configure能理解 –enable-maintainer-mode選項。–enable-maintainer-mode將maintaineronly目標重新打開。僅供維護者使用的makefile目標允許最終用戶清除自動生成的文件,比如configure,這意味著要修復編譯故障,必須安裝有autoconf和automake軟件。注意,因為autogen.sh腳本主要是給開發人員用的,autogen.sh會自動傳遞一個–enable- maintainer-mode選項給configure。

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

GNOME_INIT給configure添加一個與Gnome相關的命令行參數個數,并為Gnome程序定義一些makefile變量,這些變量中包含了必要的預處理程序和鏈接程序標志。這些標志是由gnome-config腳本取得的。安裝gnome-libs時會安裝gnome- config腳本。

AC_PROG_CC定位C編譯器。

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

LIBS是link的一個選項,程序中使用了讀寫鎖,所以要測試pthread庫中是否存在pthread_rwlock_init函數。

AC_PROG_RANLIB如果是多線程的程序的話要加入這句話,要不運行automake命令時會出錯。

AC_ISC_POSIX添加一些在某些平臺上實現POSIX兼容需要的標志。

AC_HEADER_STDC檢查當前平臺上是否有標準的ANSI頭文件,如果有,則定義STDC_HEADERS。

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

AM_PROG_LIBTOOL是由automake用來設置libtool的用途的。只在計劃編譯共享庫或動態可加載模塊時才需要設置這個值。

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

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

AM_GNU_GETTEXT由automake使用,但是這個宏會隨gettext軟件包發布。它讓 automake執行一些與國際化相關的任務。

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

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

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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容