使用 autoconf 检查 C #define 的值

pev*_*vik 1 c autoconf autotools

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

#define LIBNUMA_API_VERSION 2
Run Code Online (Sandbox Code Playgroud)

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

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

#if defined(LIBNUMA_API_VERSION) && LIBNUMA_API_VERSION >= 2
....
#endif
Run Code Online (Sandbox Code Playgroud)

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

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

可以像这样使用:

#ifdef NUMA_VERSION_2
....
#endif
Run Code Online (Sandbox Code Playgroud)

是否可以?我无法确定如何have_numa_v2在 Autoconf 文件中设置变量变量的值。

Joh*_*ger 6

您可以使用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])
Run Code Online (Sandbox Code Playgroud)

这会构造一个程序,其返回值取决于是否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;
}
Run Code Online (Sandbox Code Playgroud)

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