根据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 @<:@check@:>@])],
[:],
[enable_gui=check])
AS_HELP_STRING 很好地包装了帮助字符串,@<:@ 和 @:>@ 是 quadrigraphs,在 ./configure --help 的输出中扩展为 [ 和 ]。即使我指定了一个空的ACTION-IF-GIVEN,configure 仍会将enable_gui 设置为yes 或no,具体取决于--enable-gui 还是--disable-gui(这是--enable-gui=no 的别名)已通过。
因此,shell 变量 $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-表达式的原因是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。它的参数依次是CONDITIONAL(Makefile.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