我们研究组的部分程序具有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 都不熟悉;我采取了一种非常幼稚的第一种方法来解决这个问题。如果您在这方面有经验,我非常感谢您的更正和您可以提供的任何解释。