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