我有一個autotools項目。我希望從項目中排除一些文件,如果用戶在構建期間進行配置。例如,如果構建版本配置了--no-gui,則與GUI相關的文件將不包含在版本中。如何在autotools項目中有條件編譯?
autoconf中這樣一個標誌的標準宏是什麼?可以用類似--disable-gui配置的東西?
如何建立此配置選項和automake輸入文件之間的鏈接?
我在這裏有Calcote的介紹性書籍Autotools。如果你能指出所涉及的宏,我可以在書或網上查找它。
謝謝,
Elan。
我有一個autotools項目。我希望從項目中排除一些文件,如果用戶在構建期間進行配置。例如,如果構建版本配置了--no-gui,則與GUI相關的文件將不包含在版本中。如何在autotools項目中有條件編譯?
autoconf中這樣一個標誌的標準宏是什麼?可以用類似--disable-gui配置的東西?
如何建立此配置選項和automake輸入文件之間的鏈接?
我在這裏有Calcote的介紹性書籍Autotools。如果你能指出所涉及的宏,我可以在書或網上查找它。
謝謝,
Elan。
根據the autoconf manual,正確的方法是使用--enable-FEATURE
參數configure
。這是使用宏AC_ARG_ENABLE
完成的。 AC_ARG_ENABLE
的四個參數依次爲FEATURE
,HELP-STRING
,ACTION-IF-GIVEN
,ACTION-IF-NOT-GIVEN
。因此,在configure.ac
:
AC_ARG_ENABLE([gui],
[AS_HELP_STRING([--disable-gui], [Enable GUI support @<:@[email protected]:>@])],
[:],
[enable_gui=check])
AS_HELP_STRING
包裹幫助字符串很好,和@<:@
和@:>@
是quadrigraphs其擴大到[
和]
在./configure --help
輸出。即使我指定一個空ACTION-IF-GIVEN
,configure
仍然將設置enable_gui
到yes
或no
,取決於--enable-gui
或--disable-gui
(這是--enable-gui=no
的別名)是否獲得通過。
因此,殼變量$enable_gui
將是yes
,no
或check
。這對於製作分發包的差包裝商是有好處的,因爲它僅僅基於支票來構建可選支持被認爲是差的形式。請參閱automagic dependencies上的gentoo文章,但打包程序寧願構建失敗,而不要默默不包含所需功能。
現在,如果$enable_gui
是yes
或check
,我們希望檢查依賴性並在我們手動啓用該功能時失敗。由於我不知道你的gui依賴於什麼庫,因此我只是使用pkg-config
來檢查gtk+-2.0
。這四個參數PKG_CHECK_MODULES
(由pkg-config
包提供),按順序,VARIABLE
,MODULES
,ACTION-IF-FOUND
和ACTION-IF-NOT-FOUND
:
AS_IF([test "$enable_gui" != "no"],
[PKG_CHECK_MODULES([GTK],
[gtk+-2.0],
[enable_gui=yes],
[AS_IF([test "$enable_gui" = "yes"],
[AC_MSG_ERROR([gtk+-2.0 required, but not found.])],
[enable_gui=no])])])
我們使用AS_IF
,而不是僅僅寫一個普通的shell的原因if
-expression是使autoconf
可擴展封閉宏可能需要的任何內容(這裏PKG_CHECK_MODULES
在內部取決於宏,如PKG_PROG_PKG_CONFIG
)。你可以測試一下,在所有的情況下,這樣做是正確的做法,就像./configure --enable-gui PKG_CONFIG=/bin/false
一樣。
無論如何,我們現在已將enable_gui=check
分辨爲enable_gui=yes
或enable_gui=no
。現在我們必須將其傳遞給automake
。要使用的宏是AM_CONDITIONAL。它的參數是,爲了和CONDITION
(在Makefile.am
使用的名稱)CONDITIONAL
(殼測試設置CONDITIONAL
):
AM_CONDITIONAL([ENABLE_GUI], [test "$enable_gui" = "yes"])
現在,我們搬過來給Makefile.am
,我要去承擔一個簡單的程序與幾個可選來源:
# You probably have something real for these.
AM_CFLAGS =
LDADD =
bin_PROGRAMS = elanprog
elanprog_SOURCES = elanprog.c elanfile.c
if ENABLE_GUI
AM_CFLAGS += $(GTK_CFLAGS)
LDADD += $(GTK_LIBS)
elanprog_SOURCES += elangui.c
endif