使用autoconf检查C #define的值

时间:2017-10-12 08:20:08

标签: c autotools autoconf

我知道我可以使用this post来检查一组标头是否为指定的标识符提供声明,但是我如何检查是否声明了宏,以及它的扩展是否符合我的标准?具体来说,我想检查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变量的值。

1 个答案:

答案 0 :(得分:3)

您可以使用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预处理程序指令构建,如果未将宏定义为指定值,则编译失败。如果您预计您的程序可能会针对外部架构进行交叉编译,那么这种变化可能是更好的选择。