diff --git a/CMake/CMakeLists_root.txt b/CMake/CMakeLists_root.txt index 4b450dc2468b125541625d9889fb71085f8d0c7f..8f5815ae842ddb6d3accf27981cbdaa424a29f72 100644 --- a/CMake/CMakeLists_root.txt +++ b/CMake/CMakeLists_root.txt @@ -53,6 +53,9 @@ endif () # Flags according to Debug/Release decision # - CMake uses -g on Debug implicitly # - fPIC for libraries will be enabled explicitly +# - add sanitizer? -DSANITIZE=<sanitizer> +include(sanitizer) + set(ALIB_BUILD_FLAGS_COMMON -Wall -pedantic -pipe -Wextra -Werror -Wshadow -Wpointer-arith -Wcast-qual -Wdelete-non-virtual-dtor -Wredundant-decls) set(ALIB_BUILD_FLAGS_DEBUG ${{ALIB_BUILD_FLAGS_COMMON}} -Og) set(ALIB_BUILD_FLAGS_RELEASE ${{ALIB_BUILD_FLAGS_COMMON}} -O3) diff --git a/CMake/sanitizer.cmake b/CMake/sanitizer.cmake new file mode 100644 index 0000000000000000000000000000000000000000..8168607dccd11a694fa3a3aeada5600e61b7061b --- /dev/null +++ b/CMake/sanitizer.cmake @@ -0,0 +1,36 @@ +# 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()