CMake是否支持glibc功能测试宏

时间:2017-04-04 16:52:48

标签: linux cmake posix glibc portability

我想说我想使用特定的Linux / POSIX功能,该功能是基于https://github.com/xamarin/urho-samples/blob/master/FeatureSamples/Core/29_SoundSynthesis/SoundSynthesis.cs有条件提供的。例如,类型cpu_set_t,宏CPU_SET_ZERO和函数sched_setaffinity

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

我知道我可以在feature test macros the中查找并手动使用manpages,但是一旦在不同版本的POSIX标准中引入和弃用多个功能,这可能会变得乏味结合起来。根据我的经验,在不同版本的glibc实现中维护可移植性变得很困难。

add_definitions(-D_GNU_SOURCE),但它们似乎只是帮助检查。所以我在cmake而不是make期间收到错误,但我仍然需要手动找出正确的功能测试宏。

CMake platform checks似乎只提供与编译器直接相关的功能,而不是库。

1 个答案:

答案 0 :(得分:1)

如果您只想确定函数或变量是否存在,可以使用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似乎是一个opaque类型,因此您可以使用CheckCXXSourceCompiles模块,它是try_compile命令的前端。这是确定是否编译任何特定代码的通用方法。 {base'CMake广泛使用try_compile来确定功能(尝试在Modules目录中搜索!)。基本上,您将它传递到一个最小的源文件中,如果您的功能不存在,该文件将无法编译,并且会向您的CMake脚本报告结果。