Newer
Older
# Adapted from: https://github.com/Eyescale/CMake/blob/master/Sanitizer.cmake
if(NOT SANITIZER)
return()
endif()
# According to: http://clang.llvm.org/docs/AddressSanitizer.html#usage
# the following compiler flags allow us to keep -O1 on, if desired, but
# still get pretty call stacks
# set(_SANITIZER_COMPILE_OPTIONS "-g -fno-omit-frame-pointer -fno-optimize-sibling-calls")
string(TOLOWER ${SANITIZER} SANITIZER)
set(AVAILABLE_SANITIZERS "")
if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 4.7)
set(AVAILABLE_SANITIZERS address thread)
endif()
elseif (CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 4.1)
set(AVAILABLE_SANITIZERS address thread undefined)
endif()
endif()
list(FIND AVAILABLE_SANITIZERS ${SANITIZER} _SANITIZER_FOUND)
if(${_SANITIZER_FOUND} GREATER -1)
set(_SANITIZER "-fsanitize=${SANITIZER}")
add_compile_options("-fno-omit-frame-pointer" ${_SANITIZER})
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${_SANITIZER}")
else()
message(WARNING "Sanitizer '${SANITIZER}' not set, check compiler support.")
endif()