如何在Autotools中添加和实现配置标志?

时间:2009-08-18 18:53:11

标签: configuration build-process autotools

我们研究组的一部分程序具有ctemplate库提供的辅助功能。在我们过时的集群中,由于编译,我们无法构建软件,所以我想将此功能分开,并通过configure标记(例如--disable-ctemplate)控制是否包含该功能。

用C ++编写的软件使用Autotools构建系统 - 我都没有这方面的经验。我的理解是,要完成这项任务,我需要做以下事情:

  1. 通过在AC_ARG_ENABLE中创建新的configure.ac条目,在配置脚本中添加新标记。

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

    < / LI>

    我认为第一步看起来像这样:

    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
    

    如果我执行了configure --disable-ctemplate

    ,这会正确“连接”所有内容吗?

    另外,这是否会确保程序不会进入ctemplate库进行编译?如果没有,那么所有这一切都是徒劳的;我必须阻止编译ctemplate库和依赖组件。

    我会重复我不熟悉C ++和Autotools;我已经采取了一种非常天真的第一种方法来解决这个问题。如果您有这方面的经验,我将非常感谢您的更正和您提供的任何解释。

3 个答案:

答案 0 :(得分:6)

这是我在阅读完文档,教程,帮助主题,邮件列表等之后放在一起的解决方案,只是在他们工作之前简单地尝试我可以解释他们工作的原因。

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 ...

在较低级别Makefile.am中,我添加了

if WITH_CTEMPLATE
    # some change to the configuration
else
    # some other change to the configuration
endif

最后,我必须确保其中一个关键的C ++头文件(包含在代码的其他部分中)具有以下内容:

#ifdef HAVE_CONFIG_H
#    include "config.h"
#endif

config.h包含使用AC_DEFINE创建的任何新定义,因此该文件必须包含在检查此路由创建的宏定义是否已定义(或未定义)的部分中。

这耗费了大量时间,并在我的努力中挫败了;我只能希望在这里记录这个解释,从而使其他人免于同样的命运。

答案 1 :(得分:1)

你肯定是在正确的轨道上。一开始,Autotools看起来非常复杂,但其中一个优点是有数千个项目已经完成了您想要做的事情。你需要做的就是找到它们。

Here is a link to a Google code search for AC_ARG_DISABLE。坚果。

答案 2 :(得分:1)

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

if CTEMPLATE
SUBDIRS += ctemplate
endif
中的