【问题标题】:How to force autoconf to not define a macro?如何强制 autoconf 不定义宏?
【发布时间】:2021-05-28 09:07:51
【问题描述】:

我在构建使用 autoconf 的 C 项目时经常遇到此问题,因此我正在寻找一种可重复的方法来执行此操作。我经常有一个库,我想在其中 undef 一个由 autoheader 在 config.h 文件中生成的宏。例如 - 现在我想确保 #define CLOCK_GETTIME 1 生成为 #undef CLOCK_GETTIME

假设在这个例子中 clock_gettime 是这样检查的。

AC_CHECK_FUNCS([clock_gettime])

过去我手动编辑文件以删除定义。但我不敢相信没有什么我不能传递给./configure 来覆盖AC_CHECK_FUNCS 的默认行为。

如何更改 autoconf 决定在我的 config.h 中定义的内容?

【问题讨论】:

  • 删除定义有什么要求?
  • 它是一个标准的config.h autoheader 样式文件。要求只是让 autoconf 生成一个#undef MACRO,其中通常会出现#define MACRO 1为什么这是必要的,因为有时我想使用一些开源库,但想要或需要自定义。代码支持它 - 但我不能让 autoconf 做我想做的事。

标签: c autoconf


【解决方案1】:

./configure 'ac_cv_func_clock_gettime=no' 应该可以工作。例如:

mkdir foo
cd foo
printf '%s\n' \
    'AC_INIT([foo], [0.1])' \
    'AC_CONFIG_HEADERS([config.h])' \
    'AC_CHECK_FUNCS([clock_gettime])' \
    'AC_OUTPUT' \
    > configure.ac
autoheader
autoconf
./configure >/dev/null 2>&1 \
    && grep CLOCK_GETTIME config.h
./configure 'ac_cv_func_clock_gettime=no' >/dev/null 2>&1 \
    && grep CLOCK_GETTIME config.h

我的系统上的输出:

#define HAVE_CLOCK_GETTIME 1
/* #undef HAVE_CLOCK_GETTIME */

AC_CHECK_FUNCAC_CHECK_FUNCSAC_CHECK_FUNCS_ONCE 创建的所有缓存变量都具有the official documentation 中描述的一般形式:

此宏将其结果缓存在 ac_cv_func_<em>function</em> 变量中。

这里还有一些例子:

ac_cv_func_strcasecmp        # AC_CHECK_FUNC([strcasecmp])
ac_cv_func_mempcpy           # AC_CHECK_FUNC([mempcpy])
ac_cv_func_pthread_create    # AC_CHECK_FUNC([pthread_create])

【讨论】:

    猜你喜欢
    • 2014-04-19
    • 2019-10-29
    • 2010-09-14
    • 1970-01-01
    • 2014-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-18
    相关资源
    最近更新 更多