在cmake中使用__GLIBCXX__的值

时间:2015-04-17 15:51:40

标签: cmake g++ clang

有很多使用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.RegexPCRE使用clang分发的gcc或更早版本,则为libstdc++gcc-4.8后退,我能想到的最好的方法是检查是否__GLIBCXX__ <= 20140404,但我无法看到如何让cmake以直接的方式完成,因为clang可能并不总是使用libstdc++,例如大多数OS X系统。

CheckVariableExists似乎没有帮助,我想至少有两个原因;首先,预处理器宏不是变量,其次,它没有给出值,只表示它的存在。

2 个答案:

答案 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()