Configuration 如何在自动工具中添加和实现配置标志?

Configuration 如何在自动工具中添加和实现配置标志?,configuration,build-process,autotools,Configuration,Build Process,Autotools,我们研究小组的一部分项目具有图书馆提供的辅助功能。在我们过时的集群上,由于编译的原因,我们无法构建软件,因此我想分离此功能,并通过配置标志(如--disable ctemplate)来控制是否包含此功能 软件,用C++编写,使用的是AutoTooCAD构建系统,我都不太熟悉。我的理解是,为了完成这项任务,我需要做以下几点: if WITH_CTEMPLATE MAYBE_CTEMPLATE = ctemplate endif SUBDIRS = boost libgsl $(MAYBE_C

我们研究小组的一部分项目具有图书馆提供的辅助功能。在我们过时的集群上,由于编译的原因,我们无法构建软件,因此我想分离此功能,并通过
配置
标志(如
--disable ctemplate
)来控制是否包含此功能

<>软件,用C++编写,使用的是AutoTooCAD构建系统,我都不太熟悉。我的理解是,为了完成这项任务,我需要做以下几点:

if WITH_CTEMPLATE
  MAYBE_CTEMPLATE = ctemplate
endif

SUBDIRS = boost libgsl $(MAYBE_CTEMPLATE) libutil ...
#ifdef HAVE_CONFIG_H
#    include "config.h"
#endif
  • 通过在
    configure.AC
    中创建新的
    AC\u ARG\u ENABLE
    条目,向配置脚本添加新标志

  • 在使用
    ctemplate
    库的代码和调用该代码的任何代码周围添加一些
    #ifdef
    (或可能的
    #ifndef
    )语句

  • 我认为第一步应该是这样的:

    AC_ARG_ENABLE(ctemplate,
    [  --disable-ctemplate    Disable HTML output],
    [case "${enableval}" in
      yes) ctemplate=false ;;
      no)  ctemplate=true ;;
      *) AC_MSG_ERROR(bad value ${enableval} for --disable-ctemplate) ;;
    esac],[ctemplate=true])
    AM_CONDITIONAL(NOCTEMPLATE, test x$ctemplate = xfalse)
    
    虽然我不知道逻辑是否正确,因为我已经根据使用
    --enable FLAG
    而不是
    --disable FLAG
    的示例改编了这个示例

    对于第二步,我将使用预处理器标志包装部分,例如

    #ifndef NOCTEMPLATE
    void Class::MethodUsingCtemplate(...)
    {
        ...
    }
    #endif
    
    如果我执行了
    配置--禁用ctemplate
    ,这是否正确地“连接”了所有内容

    此外,这是否可以确保程序不会进入
    ctemplate
    库进行编译?如果不是,那么这一切都是徒劳的;我必须防止编译
    ctemplate
    库和相关组件


    <>我将重申我不熟悉C++和AutoTooCAD;在解决这个问题时,我采取了一种非常幼稚的第一种方法。如果您在这方面有经验,我将非常感谢您的更正和您能提供的任何解释。

    您肯定走对了方向。“自动工具”一开始看起来可能非常复杂,但其优点之一是有成千上万的项目已经完成了您想要做的事情。你所需要做的就是找到他们


    。发疯。

    为了防止构建尝试在ctemplate子目录中编译,您需要执行以下操作:

    if CTEMPLATE SUBDIRS += ctemplate endif 如果CTEMPLATE 细分曲面+=ctemplate 恩迪夫
    在Makefile.am

    中,这是我在阅读了文档、教程、帮助线程、邮件列表等之后整理的解决方案,我可以简单地尝试一些东西,直到它们奏效为止,我可以解释它们为什么奏效

    configure.ac
    中,我放置了以下代码行

    # This adds the option of compiling without using the ctemplate library,
    # which has proved troublesome for compilation on some platforms
    AC_ARG_ENABLE(ctemplate,
      [ --disable-ctemplate   Disable compilation with ctemplate and HTML output],
      [case "${enableval}" in
         yes | no ) WITH_CTEMPLATE="${enableval}" ;;
         *) AC_MSG_ERROR(bad value ${enableval} for --disable-ctemplate) ;;
       esac],
      [WITH_CTEMPLATE="yes"]
    )
    
    dnl Make sure we register this option with Automake, so we know whether to
    dnl descend into ctemplate for more configuration or not
    AM_CONDITIONAL([WITH_CTEMPLATE], [test "x$WITH_CTEMPLATE" = "xyes"])
    
    # Define CTEMPLATE in config.h if we're going to compile against it
    if test "x$WITH_CTEMPLATE" = "xyes"; then
        AC_DEFINE([CTEMPLATE], [], ["build using ctemplate library"])
        AC_MSG_NOTICE([ctemplate will be used, HTML output enabled])
    else
        AC_MSG_NOTICE([ctemplate will not be used, HTML output disabled])
    fi
    
    在下一步中,我将顶层的
    Makefile.am
    更改为以下内容:

    if WITH_CTEMPLATE
      MAYBE_CTEMPLATE = ctemplate
    endif
    
    SUBDIRS = boost libgsl $(MAYBE_CTEMPLATE) libutil ...
    
    #ifdef HAVE_CONFIG_H
    #    include "config.h"
    #endif
    
    在较低级别的
    Makefile.am
    s中,我添加了

    if WITH_CTEMPLATE
        # some change to the configuration
    else
        # some other change to the configuration
    endif
    
    最后,我必须确保一个关键的C++头文件(包括代码的其他部分)有以下内容:

    if WITH_CTEMPLATE
      MAYBE_CTEMPLATE = ctemplate
    endif
    
    SUBDIRS = boost libgsl $(MAYBE_CTEMPLATE) libutil ...
    
    #ifdef HAVE_CONFIG_H
    #    include "config.h"
    #endif
    
    config.h
    包含使用
    AC_DEFINE
    创建的任何新定义,因此此文件必须包含在检查此路由创建的宏定义是否已定义(或未定义)的部分中


    这花了我很多时间,让我度过了挫折;我只希望在这里记录这一解释能让其他人免于同样的命运。

    标准自动工具中是否禁用了AC_ARG_?我没有找到谷歌提供的文档。与谷歌代码搜索中的AC_ARG_ENABLE相比,它的点击率也很低。(与相比)。其中一些项目具有宏定义
    AC\u ARG\u DISABLE
    。为什么他们不把它包括在标准包中?+1。这应该在Autotools手册中,而不是要求人们将其拼凑起来,在邮件列表或堆栈溢出中查找。