4

我有一个自动工具项目。如果用户在构建过程中进行了配置,我希望从项目中排除一些文件。例如,如果构建配置了 --no-gui ,则与 GUI 相关的文件不会包含在构建中。

  1. autoconf 中此类标志的标准宏是什么?可以使用--disable-gui 之类的配置?

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

我这里有 Calcote 的介绍性书籍 Autotools。如果你能指点所涉及的宏,我可以在书上或网上查到。

谢谢,

艾伦。

4

1 回答 1

14

根据autoconf 手册,正确的方法是--enable-FEATURE使用configure. 这是使用宏完成的AC_ARG_ENABLE。的四个参数AC_ARG_ENABLE依次是、FEATUREHELP-STRING、。所以在:ACTION-IF-GIVENACTION-IF-NOT-GIVENconfigure.ac

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

AS_HELP_STRING很好地包装了帮助字符串,并且@<:@@:>@是在. 即使我指定了一个空的,仍将设置为or ,这取决于是否传递了or (这是 的别名)。[]./configure --helpACTION-IF-GIVENconfigureenable_guiyesno--enable-gui--disable-gui--enable-gui=no

所以 shell 变量$enable_gui将是yes,nocheck。这是为了制作分发包的可怜的打包者的利益,因为仅基于检查构建可选支持被认为是一种糟糕的形式。请参阅有关automagic 依赖项的 gentoo 文章,但打包者宁愿构建失败,也不愿默默地不包含想要的功能。

现在,如果$enable_guiyescheck,我们要检查依赖关系,如果我们手动启用该功能则失败。由于我不知道您的 gui 依赖于哪个库,所以我将使用它pkg-config来检查gtk+-2.0. PKG_CHECK_MODULES(由包提供)的四个参数pkg-config依次是VARIABLEMODULES和:ACTION-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而不是仅仅编写一个普通的 shellif表达式的原因是为了autoconf扩展一个封闭的宏可能需要的任何东西(这里在PKG_CHECK_MODULES内部依赖于像这样的宏PKG_PROG_PKG_CONFIG)。您可以通过执行类似./configure --enable-gui PKG_CONFIG=/bin/false.

无论如何,我们现在已经解决enable_gui=checkenable_gui=yesor enable_gui=no。现在我们必须将它传递给automake. 要使用的宏是AM_CONDITIONAL。它的参数依次是CONDITIONAL(在 中使用的名称Makefile.am)和CONDITION(要设置的 shell 测试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
于 2012-08-10T13:40:36.800 回答