[英]Check value of C #define with autoconf
我知道我可以使用AC_CHECK_DECL / AC_CHECK_DECLS来检查一组标头是否为指定的标识符提供了声明,但是如何不仅检查是否声明了宏,还检查其扩展是否符合我的条件? 具体来说,我想检查numa.h
是否包含与此等效的宏定义...
#define LIBNUMA_API_VERSION 2
...包括特定值“ 2”。
UPDATE : <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
变量的值时遇到了麻烦。
您可以将AC_COMPILE_IFELSE
或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])
这将构造一个程序,其返回值取决于是否将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
预处理程序指令进行编译,以使编译失败。 如果您预料到程序可能会针对外国体系结构交叉编译,那么这种变化可能是更好的选择。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.