【问题标题】:How to conditionally compile in a autotools project?如何有条件地在 autotools 项目中编译?
【发布时间】:2012-08-07 14:03:16
【问题描述】:

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

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

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

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

谢谢,

伊兰。

【问题讨论】:

    标签: autotools autoconf automake


    【解决方案1】:

    根据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 很好地包装了帮助字符串,@&lt;:@@:&gt;@quadrigraphs,在 ./configure --help 的输出中扩展为 []。即使我指定了一个空的ACTION-IF-GIVENconfigure 仍会将enable_gui 设置为yesno,具体取决于--enable-gui 还是--disable-gui(这是--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

    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
    

    【讨论】:

      猜你喜欢
      • 2015-03-28
      • 2018-04-14
      • 1970-01-01
      • 2017-10-06
      • 1970-01-01
      • 2019-12-11
      • 1970-01-01
      • 2023-03-16
      • 1970-01-01
      相关资源
      最近更新 更多