如何在autotools项目中有条件地编译?

时间:2012-08-10 09:23:08

标签: autotools autoconf automake

我有一个autotools项目。如果用户在构建期间进行配置,我希望从项目中排除一些文件。例如,如果使用--no-gui配置构建,则与GUI相关的文件不会包含在构建中。

  1. autoconf中这种标志的标准宏是什么?可以用--disable-gui配置的东西吗?

  2. 如何在此配置选项和automake输入文件之间建立链接?

  3. 我在这里有Calcote的入门书Autotools。如果您可以指出所涉及的宏,我可以在书中或网上查找。

    谢谢,

    Elan公司。

1 个答案:

答案 0 :(得分:13)

根据the autoconf manual,执行此操作的正确方法是使用--enable-FEATURE configure参数。这是使用宏AC_ARG_ENABLE完成的。 AC_ARG_ENABLE的四个参数依次为FEATUREHELP-STRINGACTION-IF-GIVENACTION-IF-NOT-GIVEN。所以在configure.ac

AC_ARG_ENABLE([gui],
  [AS_HELP_STRING([--disable-gui], [Enable GUI support @<:@check@:>@])],
  [:],
  [enable_gui=check])

AS_HELP_STRING很好地包装了帮助字符串,@<:@@:>@quadrigraphs,在输出中扩展为[] ./configure --help。即使我已指定空的ACTION-IF-GIVENconfigure仍会将enable_gui设置为yesno,具体取决于--enable-gui还是--disable-gui {1}}(这是--enable-gui=no的别名)已通过。

所以shell变量$enable_gui将是yesnocheck。这是为了制作分发包的不良包装商的利益,因为仅基于支票构建可选支持的形式不佳。请参阅automagic dependencies上的gentoo文章,但是打包者希望构建失败而不是默认不包含想要的功能。

现在,如果$enable_guiyescheck,我们想检查依赖关系,如果我们手动启用该功能,则会失败。由于我不知道您的gui所依赖的库,我只是使用pkg-config来检查gtk+-2.0PKG_CHECK_MODULES(由pkg-config包提供)的四个参数按顺序排列为VARIABLEMODULESACTION-IF-FOUNDACTION-IF-NOT-FOUND:< / p>

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 - 表达式的原因是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。它的参数依次是CONDITIONALMakefile.am中使用的名称)和CONDITION(设置CONDITIONAL的shell测试):

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