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)。

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



作者:id被吃
鏈接:https://www.jianshu.com/p/befa2fc2420c
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯系作者獲得授權並注明出處。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM