【问题标题】:Check value of C #define with autoconf使用 autoconf 检查 C#define 的值
【发布时间】:2017-10-12 08:20:08
【问题描述】:

我知道我可以使用AC_CHECK_DECL / AC_CHECK_DECLS 来检查一组标头是否提供了对指定标识符的声明,但是如何不仅检查是否声明了宏,而且检查其扩展是否符合我的标准?具体来说,我想检查一下numa.h是否包含与此等价的宏定义...

#define LIBNUMA_API_VERSION 2

...包括特定值“2”。

更新<numa.h> 标头包含一个定义,例如 #define LIBNUMA_API_VERSION 2 来声明它的版本。使用此标头的 C 代码通常像这样使用它:

#if defined(LIBNUMA_API_VERSION) && LIBNUMA_API_VERSION >= 2
....
#endif

我想用autoconf 确定NUMA 标头版本,并定义一个简洁地传达是否提供NUMA 版本2 的宏。即:

if test "$have_numa_v2" = "yes" ; then
    AC_DEFINE(NUMA_VERSION_2, 1, [Determine whether NUMA v2 available)
fi

可以这样使用:

#ifdef NUMA_VERSION_2
....
#endif

有可能吗?我无法确定如何在我的 Autoconf 文件中设置变量 have_numa_v2 变量的值。

【问题讨论】:

  • 从哪里检查?从makefile?外壳脚本? C 代码?
  • OP 来自 numa.h
  • 据我了解,这个定义是 numa.h 的一部分。但也许不是。
  • @dbrank0 啊你是对的:)
  • 也许 AC_CHECK_HEADER()AC_DEFINE() 的组合可以满足您的需求。

标签: c autotools autoconf


【解决方案1】:

您可以将AC_COMPILE_IFELSEAC_RUN_IFELSE 与结构适当的测试程序一起使用,以确定宏是否定义为您指定的特定值。例如,假设当前语言是 C:

have_numa_v2=no
AC_RUN_IFELSE([AC_LANG_PROGRAM([
#include <numa.h>
],[
#if LIBNUMA_API_VERSION != 2
exit(1);
#endif
])], [have_numa_v2=yes])

构造一个程序,其返回值取决于LIBNUMA_API_VERSION是否定义为宏,如果是,则它是否扩展为2。如果 Autoconf 无法编译它(例如,因为它找不到 numa.h)或者如果它以 0 以外的状态退出,则不会发生其他任何事情($have_numa_v2 保留其分配的 "no" 值)。否则,将执行第二个参数中的赋值,$have_numa_v2 以值 "yes" 结束。

不管怎样,该宏生成和使用的特定测试程序的源代码包含一些 Autoconf 标准的宏定义,以及以下内容:

#include <numa.h>

int
main ()
{

#if LIBNUMA_API_VERSION != 2
exit(1);
#endif

  ;
  return 0;
}

使用 AC_COMPILE_IFELSE 的版本类似,但使用 #error 预处理器指令构建,如果宏未定义为指定值,则编译失败。如果您预计您的程序可能会针对外部架构进行交叉编译,那么这种变体可能是更好的选择。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-26
    • 1970-01-01
    • 1970-01-01
    • 2013-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-30
    相关资源
    最近更新 更多