使用 autoconf 检查 C #define 的值

Check value of C #define with autoconf

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

#define LIBNUMA_API_VERSION 2

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

更新<numa.h> header 包含诸如 #define LIBNUMA_API_VERSION 2 之类的定义来声明它的版本。使用此 header 的 C 代码通常像这样使用它:

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

我想用 autoconf 确定 NUMA header 版本,并定义一个宏来简洁地传达是否提供 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 的值。

您可以将 AC_COMPILE_IFELSE or AC_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])

即构造一个程序,其return值取决于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 预处理器指令构建,如果宏未定义为指定值,编译将失败。如果您预计您的程序可能会针对外国体系结构进行交叉编译,那么该变体可能是更好的选择。