GNU Autotools 會從專案中繼資料產生可攜式建置介面。Autoconf 探測建置環境並產生 configure;Automake 從 Makefile.am 產生可攜式的 Makefile.in 範本;Libtool 抽象化平台特定的函式庫連結。產生的檔案是為來源發布設計,而維護者編輯 .ac、.am 與 m4 輸入。
輸入與產生的檔案 #
專案通常包含以下輸入:
configure.ac是宣告套件中繼資料、探測、替換、輸出檔案與選用標頭的 m4 程式。Makefile.am使用bin_PROGRAMS、lib_LTLIBRARIES與program_SOURCES等 Automake 變數描述建置目標。m4/包含專案或第三方 m4 巨集,慣例上由aclocal匯入。config.h.in是組態巨集的autoheader範本。
維護者執行 autoreconf -fi 以呼叫所需產生器。該命令會執行 aclocal、autoconf、標頭有宣告時的 autoheader,以及使用 Automake 時的 automake --add-missing。結果包括 configure、aclocal.m4、Makefile.in、build-aux/ 下的輔助指令碼,以及適用時的 config.h.in。
接著,使用者會在樹外執行產生的設定指令碼:
mkdir build
cd build
../configure --prefix=/usr/local
make
make check
make install指令碼會寫入 config.status,記錄選取的替換內容,並可在不重複每次探測的情況下重新產生已設定的輸出。config.log 會記錄編譯器測試與診斷,因此設定失敗後應先檢查它。
Autoconf #
autoconf 透過 GNU m4 展開 configure.ac,並產生 shell configure 指令碼。AC_PROG_CC 等巨集會尋找並測試編譯器;AC_CHECK_HEADERS 與 AC_CHECK_FUNCS 會測試介面;AC_SUBST 會匯出要替換至範本的變數。AC_CONFIG_FILES 列出 config.status 轉換成輸出檔案的範本,而 AC_OUTPUT 完成設定宣告。
AC_INIT([example], [1.0])
AC_CONFIG_SRCDIR([src/main.c])
AC_PROG_CC
AC_CHECK_HEADERS([sys/epoll.h])
AC_CONFIG_HEADERS([config.h])
AC_CONFIG_FILES([Makefile src/Makefile])
AC_OUTPUT成功的探測必須回答特定的建置問題。交叉編譯會使執行期探測不安全,因為建置主機無法執行目標二進位檔。Autoconf 提供 --build、--host、快取變數與 AC_CACHE_CHECK,讓專案能區分編譯測試與執行測試。
autoheader 會掃描設定巨集並產生 config.h.in。configure 會將每個發現的 #undef 替換為適當的 #define,或在 config.h 中保持未定義。AC_CONFIG_HEADERS 列出多個名稱時支援多個標頭;每個列出的標頭都有自己的 .in 範本與已設定輸出。
Automake #
Automake 將 Makefile.am 轉換為可攜式 Makefile.in;configure 會將編譯器路徑、安裝目錄與功能結果替換至最終的 Makefile。例如:
bin_PROGRAMS = tool
tool_SOURCES = main.c parse.c parse.h
AM_CPPFLAGS = -I$(top_srcdir)/include
Automake 提供 all、check、install、installcheck、clean、distclean 與 dist 等慣例目標。make distcheck 會在全新的樹中建置發布封存、執行已設定的測試套件、驗證安裝與解除安裝,並確認 distclean 移除產生的檔案。
Automake primary 定義輸出類別:PROGRAMS、LIBRARIES、LTLIBRARIES、HEADERS、SCRIPTS、DATA 與相關形式。bin_、lib_、include_、noinst_ 與 check_ 等前綴會選取安裝或建置行為。Automake 會為宣告的來源衍生物件相依項,而 BUILT_SOURCES、EXTRA_DIST 與 dist_ 變數則處理產生的先決條件,以及自動發布探索會遺漏的檔案。
aclocal 會收集 configure.ac 所需的巨集來建立 aclocal.m4,包括透過 AC_CONFIG_MACRO_DIRS 找到的巨集。受版本控制的專案通常會在發布封存中包含產生的 configure 與 Makefile.in,因為終端使用者只需要 shell 與 Make,不需要每個 Autotools 產生器。
範本與替換 #
.in 檔案包含由 AC_SUBST 建立的純文字與 @VARIABLE@ 替換。Automake 產生的 Makefile.in 也會從這些替換定義 Make 變數,因此配方可以使用 $(VARIABLE)。範本僅因通過 configure 就不會執行 shell 語法;請在 configure.ac 中引述 shell 值,並驗證產生指令碼所使用的值。
Libtool #
Libtool 提供 libtool,這是 Automake 的 *_LTLIBRARIES 目標使用的產生封裝器。它會將 libexample.la 等可攜式函式庫名稱,與共用物件、匯入函式庫或靜態封存等平台輸出分開。libtoolize 會安裝專案所需的巨集與輔助檔案。函式庫版本資訊應依照 Libtool 目前/年齡/修訂版本介面規則放在 -version-info;發布編號則使用 -release。兩者都不是套件版本的直接複製。
發布前,維護者會執行 autoreconf -fi、樹外的 ../configure、make、make check 與 make distcheck。發布使用者解開封存後只需要 ./configure、Make 與宣告的建置工具;DESTDIR 可以為套件化暫存 make install。產生的 configure --help、config.log、config.status --recheck 與 make -n 會公開具體行為。
評論
在 GitHub 上閱讀或評論(發表評論需要登入)