我想说我想使用特定的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似乎只提供与编译器直接相关的功能,而不是库。
答案 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脚本报告结果。