2017-04-04 114 views
1

假设我想使用特定的Linux/POSIX功能,该功能是根据feature test macros有条件地提供的。例如,类型cpu_set_t,宏CPU_SET_ZERO和功能sched_setaffinityCMake是否支持glibc功能测试宏

理想情况下,我只是想告诉CMake我需要这些,它应该找出哪些额外的功能测试宏设置或失败,如果不能在当前系统上提供一个漂亮的错误消息。那可能吗?

我知道我可以在themanpages查找和手动使用add_definitions(-D_GNU_SOURCE),但是一旦进行了介绍,并弃用不同版本的POSIX标准的多个功能组合,可以成为乏味。根据我的经验,在不同版本的glibc实现中保持可移植性会变得很困难。

CMake platform checks,但他们似乎只是帮助检查。所以我在cmake而不是make中得到错误,但我仍然需要手动计算出正确的功能测试宏。

cmake-compile-features似乎只提供与编译器直接相关的功能,而不是库。

回答

0

如果您只是想确定函数或变量是否存在,您可以使用CheckSymbolExists模块。同样,结构体有CheckStructHasMember(假设有一个可以检查的标准成员)。所以:

include (CheckSymbolExists) 
include (CheckStructHasMember) 

CHECK_SYMBOL_EXISTS(CPU_SET_ZERO sched.h CPU_SET_ZERO_exists) 
CHECK_SYMBOL_EXISTS(sched_setaffinity sched.h sched_setaffinity_exists) 
CHECK_STRUCT_HAS_MEMBER(cpu_set_t <member?> sched.h cpu_set_t_exists) 

看来,cpu_set_t是一个不透明的类型,这样反而可以使用CheckCXXSourceCompiles模块,这对于try_compile命令前端。这是确定是否编译了特定代码的通用方法。 'base'CMake广泛使用try_compile来确定特征(在Modules目录中尝试搜索!)。本质上,你将它传递给一个最小的源文件,如果你的特性不存在,它将会失败编译,并且它会向你的CMake脚本报告结果。