Automake 設置說明

參考:http://www.gnu.org/software/automake/#documentation

本文中提到的章節及頁碼,請自行下載automake.pdf查看。

1. configure.ac 設置說明

讓我們從configure.ac的內容開始吧。

AC_INIT([amhello], [1.0], [[email protected]])
AM_INIT_AUTOMAKE([-Wall -Werror foreign])
AC_PROG_CC
AC_CONFIG_HEADERS([config.h])
AC_CONFIG_FILES([
Makefile
src/Makefile
])
AC_OUTPUT
        此文件由autoconf(創建配置)和automake(創建各種Makefile.ins)讀取。 它包含一系列M4宏,將擴展爲shell代碼,最終形成配置腳本。 我們不會詳細說明這個文件的語法,因爲Autoconf手冊有關於它的整個部分(參見“Autoconf手冊”中的“編寫configure.ac”一節)。
        前綴爲AC_的宏是Autoconf宏,記錄在Autoconf手冊中(參見“Autoconf手冊”中的“Autoconf宏索引”)。 以AM_開頭的宏是Automake宏,在本手冊後面將會介紹(見第B.1節[宏指數],第166頁)。

        configure.ac的前兩行初始化Autoconf和Automake。 AC_INIT接收包的名稱,其版本號和關於包的錯誤報告的聯繫人地址(該地址例如在./configure --help結尾處輸出)。 當您將此設置適用於您自己的軟件包時,請勿盲目複製Automake的地址:使用您的軟件包的郵件列表或您自己的郵箱地址。

        AM_INIT_AUTOMAKE的參數是automake的選項列表(請參見第17章[選項],第118頁)。 -Wall和-Werror要求automake打開所有警告並將其報告爲錯誤。 我們在這裏講Automake的警告,比如Makefile.am中的可疑指令。 這與編譯器的調用絕對無關,即使它可能支持類似名稱的選項。 使用-Wall -Werror是開始在包上工作時的安全設置:您不想錯過任何問題。 後來你可能會決定放鬆一下。 外部選項告訴Automake該包不會遵循GNU標準。 GNU軟件包應該總是分發更多的文件,如ChangeLog,AUTHORS等。我們不希望automake在這個小例子中抱怨這些丟失的文件。

        AC_PROG_CC行使配置腳本搜索C編譯器並使用其名稱定義變量CC。 Automake生成的src / Makefile.in文件使用變量CC構建hello,所以當configure從src / Makefile.in創建src / Makefile時,它將使用它找到的值來定義CC。 如果Automake被要求創建一個使用CC的Makefile.in,但是configure.ac沒有定義它,它會建議您添加一個到AC_PROG_CC的調用。

        AC_CONFIG_HEADERS([config.h])調用會導致configure腳本創建一個config.h文件,它們是由configure.ac中的其他宏定義的。 在我們的例子中,AC_INIT宏已經定義了其中的一些。 配置運行後,以下是config.h的摘錄:

...
/* Define to the address where bug reports for this package should be sent. */
#define PACKAGE_BUGREPORT "[email protected]"
/* Define to the full name and version of this package. */
#define PACKAGE_STRING "amhello 1.0"
...
        您可能注意到,src / main.c包含config.h,因此可以使用ACKAGE_STRING。 在一個真實世界的項目中,config.h可以變得非常大,每個功能在系統上都有一個“#define”。
        AC_CONFIG_FILES宏聲明配置應該從* .in模板創建的文件列表。 Automake還掃描此列表以找到它必須處理的Makefile.am文件。 (這很重要,要記住:當向項目添加新目錄時,應該將其Makefile添加到此列表中,否則Automake將永遠不會處理您在該目錄中寫入的新Makefile.am。)

        最後,AC_OUTPUT行是一個關閉命令,實際上產生腳本的一部分,負責創建使用AC_CONFIG_HEADERSAC_CONFIG_FILES註冊的文件。

        開始一個新項目時,我們建議您從這樣一個簡單的configure.ac開始,並逐漸添加其它需要的測試。 命令autoscan還可以建議您的軟件包可能需要的幾個測試(參見“Autoconf手冊”中的“使用autoscan創建configure.ac”)。

2. Makefile.am 設置說明

        我們現在轉到src / Makefile.am。 此文件包含用於構建和安裝hello的Automake指令。

bin_PROGRAMS = hello
hello_SOURCES = main.c
        Makefile.am具有與普通Makefile相同的語法。 當automake處理一個Makefile.am時,它會將整個文件複製到輸出Makefile.in中(後來將通過configure轉換爲Makefile),但會通過生成一些構建規則和其他變量來響應某些變量定義。 通常,Makefile.ams只包含上述變量定義的列表,但是它們也可以包含其他可以在沒有解釋的情況下傳遞的變量和規則定義。
        以_PROGRAMS結尾的變量是列出生成的Makefile應該構建的程序的特殊變量。 在Automake說話時,這個_PROGRAMS後綴叫做主; Automake可識別與不同類型文件對應的其他原色,如_SCRIPTS,_DATA,_LIBRARIES等。

        bin_PROGRAMS的“bin”部分告訴automake所生成的程序應該安裝在bindir中。 回想一下,GNU構建系統使用一組變量來表示目標目錄,並允許用戶自定義這些位置(請參見第2.2.3節[標準目錄變量],第4頁)。 任何這樣的目錄變量可以放在一個主要的前面(省略dir後綴)來告訴automake在哪裏安裝列出的文件。

        程序需要從源文件構建,因此對於_PROGRAMS變量中列出的每個程序,automake將會根據另一個名爲prog_SOURCES的變量查找,列出其源文件。 可能有多個源文件:它們都將被編譯並鏈接在一起。
        Automake還知道在創建tarball時需要分發源文件(與構建的程序不同)。 所以這個hello_SOURCES聲明的副作用是main.c將是由make dist創建的tarball的一部分。
        最後,這裏有一些關於頂級Makefile.am的解釋。

SUBDIRS = src
dist_doc_DATA = README
        SUBDIRS是一個特殊變量,列出在處理當前目錄之前應該遞歸的所有目錄。 所以這一行是負責構建src / hello,即使我們從頂層運行它。 在安裝README之前,此行還會導致make install安裝src / hello(不是這個順序很重要)。
        行dist_doc_DATA = README導致README被分發並安裝在docdir中。 使用_DATA主文件列出的文件不會自動使用make dist構建的tarball的一部分,因此我們添加dist_前綴,以便它們分發。 但是,對於README來說,這不是必要的:automake自動分配它遇到的任何README文件(自動分發的其他文件的列表由automake --help提供)。 因此,第二行的唯一重要作用是在安裝過程中安裝README。

        此示例中未涉及的一件事是從程序代碼訪問安裝目錄值(請參見第2.2.3節[標準目錄變量],第4頁),即將其轉換爲定義的宏。 爲此,請參閱“Autoconf手冊”中的“定義目錄”一節。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章