2017-10-12 71 views
0

我知道我可以使用AC_CHECK_DECL/AC_CHECK_DECLS来检查一组头是否提供了指定标识符的声明,但我怎样才能检查是否声明了宏,以及它是否扩展符合我的标准?具体来说,我想检查numa.h是否包含宏定义等同于这个...使用autoconf检查C#define的值

#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 

我想确定NUMA头版本与autoconf,并定义简洁地传达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变量的值。

+3

检查从哪里?从makefile? Shell脚本? C代码? – dbrank0

+0

OP说numa.h – Fredrik

+0

据我所知,这个定义是numa.h的一部分。但也许不是。 – dbrank0

回答

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预处理器指令来编译失败。如果您预计您的程序将针对外部架构进行交叉编译,那么这种差异可能是更好的选择。