有很多使用cmake
设置预处理器值的示例。我遇到了相反的问题 - 我想找到__GLIBCXX__
的值,然后根据结果有条件地执行其他cmake命令。
到目前为止,我一直在使用GCC版本作为libstdc++
功能的代理,如下所示:
if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.6)
....
# other gcc versions
....
endif()
elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
# and so on
endif()
我现在遇到的问题是libstdc++ and gcc-4.8 c++11 regex support已知问题的影响,许多设置clang
上的事实会重用系统libstdc++
,因此继承了该问题问题。在这种情况下,clang
没有版本测试可以提供帮助,因为它与libstdc++
具体相关,而且我使用编译器版本的代理方法不再有效。
如果Boost.Regex
或PCRE
使用clang
分发的gcc
或更早版本,则为libstdc++
或gcc-4.8
后退,我能想到的最好的方法是检查是否__GLIBCXX__ <= 20140404
,但我无法看到如何让cmake
以直接的方式完成,因为clang
可能并不总是使用libstdc++
,例如大多数OS X系统。
CheckVariableExists似乎没有帮助,我想至少有两个原因;首先,预处理器宏不是变量,其次,它没有给出值,只表示它的存在。
答案 0 :(得分:1)
您可以使用CHECK_CXX_SOURCE_COMPILES编译特定的测试,该测试在您的条件不符合时失败:
INCLUDE (CheckCXXSourceCompiles)
CHECK_CXX_SOURCE_COMPILES(
"
#include <cstdio>
#ifdef __GLIBCXX__
#if __GLIBCXX__ <= 20140404
#error test failed
#endif
#endif
int main() { return 0;}
" GLIBCXX_TEST)
IF(NOT GLIBCXX_TEST)
MESSAGE(STATUS "__GLIBCXX__ test failed")
ENDIF()
答案 1 :(得分:1)
基于ms的想法并且考虑到Marc Glisse关于__GLIBCXX__
不是一种可靠的测试方法的观察,我写了一个CMake模块来测试正则表达式支持的破坏实现。为了使这个测试通过,编译器需要针对C ++ 11或更高版本。
要点在这里:https://gist.github.com/anonymous/7520ce6f64c63e2f8e79
样品使用:
include(CheckForRegex)
check_cxx_native_regex_works(USE_NATIVE_REGEX)
add_definitions("-DUSE_NATIVE_REGEX=${USE_NATIVE_REGEX}")
if (NOT USE_NATIVE_REGEX)
find_package(Boost REQUIRED COMPONENTS regex)
endif()