如何在configure.ac中取消定义宏

时间:2015-08-12 01:31:39

标签: autoconf

我正在编写我的configure.ac脚本,并且有一些自定义启用参数,如果启用,它们会在我的C代码中定义宏。一个例子:

AC_ARG_ENABLE([example],
    AS_HELP_STRING([--enable-example], [This is an example]))
AS_IF([test "x$enable_example" = "xyes"], [
      AC_DEFINE(EXAMPLE_MACRO, 1, [This is a definition example])
      ])

现在说我有一个启用选项,如果启用,必须禁用--enable-example选项的效果。我有正常的设置:

AC_ARG_ENABLE([another-feature],
    AS_HELP_STRING([--another-feature], [This is a feature which enables something, but disables --enable-example]))
AS_IF([test "x$enable_another_feature" = "xyes"], [
      AC_DEFINE(ANOTHER_FEATURE_MACRO, 1, [This is another feature definition])
      ])

现在我需要能够取消定义EXAMPLE_MACRO宏,但我找不到任何撤消AC_DEFINE的内容。我错过了什么吗?

2 个答案:

答案 0 :(得分:1)

为什么不简单地延迟AC_DEFINE函数调用?请注意,我不是AS_IF宏的忠实拥护者。

if test "x$enable_another_feature" = xyes ; then
  # enable_example="no" # (optional)
  AC_DEFINE([ANOTHER_FEATURE_MACRO], [1])
elif test "x$enable_example" = xyes ; then
  AC_DEFINE([EXAMPLE_MACRO], [1])
fi

如果未执行AC_DEFINE,则在配置标头中未实例化相应的#define ...。讨论过here

答案 1 :(得分:0)

如果您的示例中使用的是布尔型符号,则只需启用标志或禁用即可,您需要做的就是再次调用AC_DEFINE来禁用该符号:

AC_DEFINE(EXAMPLE_MACRO, 0)

该符号将仍然存在,但新值为0(布尔值false)。

更新: 为了完成答案,如果指定了冲突的选项,通常的做法是在编译过程中以错误终止。当您定义符号时,并且config.h.in包含#undef EXAMPLE_MACRO,AC_DEFINE会将其转为#define EXAMPLE_MACRO。因此,您可以使用两个选项来处理这样的宏,检查其值是否设置为1/0,或者检查两个宏的设置并断言它们是否为真。