我们研究组的一部分程序具有ctemplate库提供的辅助功能。在我们过时的集群中,由于编译,我们无法构建软件,所以我想将此功能分开,并通过configure
标记(例如--disable-ctemplate
)控制是否包含该功能。
用C ++编写的软件使用Autotools构建系统 - 我都没有这方面的经验。我的理解是,要完成这项任务,我需要做以下事情:
通过在AC_ARG_ENABLE
中创建新的configure.ac
条目,在配置脚本中添加新标记。
在使用#ifdef
库的代码周围以及调用该代码的任何代码周围添加一些#ifndef
(或可能ctemplate
)语句。
我认为第一步看起来像这样:
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;我已经采取了一种非常天真的第一种方法来解决这个问题。如果您有这方面的经验,我将非常感谢您的更正和您提供的任何解释。
答案 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