There are plenty of examples of using cmake
to set a preprocessor value. I'm having the reverse problem -- I want to find the value of __GLIBCXX__
and then perform other cmake commands conditionally based on the result.
Up until now, I had been using the GCC version as a surrogate for libstdc++
functionality, like this:
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()
The problem I'm now having is the fallout from a known issue with libstdc++ and gcc-4.8 c++11 regex support, and the fact on many setups clang
reuses the system libstdc++
, therefore inheriting the same problem. Under these circumstances, there's no version test for clang
that will help, since it's specifically related to libstdc++
, and my surrogate method of using the compiler version no longer works.
In order to fallback on Boost.Regex
or PCRE
if either clang
or gcc
are using the libstdc++
distributed with gcc-4.8
or earlier, the best way I can think of is to check if __GLIBCXX__ <= 20140404
, but I can't see how to get cmake
to do it in a straight-forward way, since clang
might not always be using libstdc++
, e.g. most OS X systems.
CheckVariableExists doesn't seem to help, I suppose for at least two reasons; firstly, a preprocessor macro isn't a variable, and secondly, it doesn't give the value, only indicates its presence.