2012-08-10 36 views
3

我有一個autotools項目。我希望從項目中排除一些文件,如果用戶在構建期間進行配置。例如,如果構建版本配置了--no-gui,則與GUI相關的文件將不包含在版本中。如何在autotools項目中有條件編譯?

  1. autoconf中這樣一個標誌的標準宏是什麼?可以用類似--disable-gui配置的東西?

  2. 如何建立此配置選項和automake輸入文件之間的鏈接?

我在這裏有Calcote的介紹性書籍Autotools。如果你能指出所涉及的宏,我可以在書或網上查找它。

謝謝,

Elan。

回答

12

根據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-GIVENconfigure仍然將設置enable_guiyesno,取決於--enable-gui--disable-gui(這是--enable-gui=no的別名)是否獲得通過。

因此,殼變量$enable_gui將是yes,nocheck。這對於製作分發包的差包裝商是有好處的,因爲它僅僅基於支票來構建可選支持被認爲是差的形式。請參閱automagic dependencies上的gentoo文章,但打包程序寧願構建失敗,而不要默默不包含所需功能。

現在,如果$enable_guiyescheck,我們希望檢查依賴性並在我們手動啓用該功能時失敗。由於我不知道你的gui依賴於什麼庫,因此我只是使用pkg-config來檢查gtk+-2.0。這四個參數PKG_CHECK_MODULES(由pkg-config包提供),按順序,VARIABLEMODULESACTION-IF-FOUNDACTION-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=yesenable_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 
相關問題