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手册中,而不是要求人们将其拼凑起来,在邮件列表或堆栈溢出中查找。