X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=CMake%2FCheckDebug.cmake;h=fb188529afed4551c3daa189a65159e1b81405e4;hb=aeac01630eed825d8a624e7fd7c107d47bb2e40c;hp=4ab87f259fa37806ec8fa16db97412d348f09e9c;hpb=cbaa9f46519f9b085e28db5f44247d23ca7ec5a4;p=awesomized%2Flibmemcached diff --git a/CMake/CheckDebug.cmake b/CMake/CheckDebug.cmake index 4ab87f25..fb188529 100644 --- a/CMake/CheckDebug.cmake +++ b/CMake/CheckDebug.cmake @@ -1,7 +1,5 @@ -include(CMakePushCheckState) -include(CheckCXXCompilerFlag) -function(check_flag FLAG DEFAULT) +function(set_flag FLAG DEFAULT) unset(FLAG_CONSTANT) string(MAKE_C_IDENTIFIER CXX${FLAG} FLAG_CONSTANT) check_cxx_compiler_flag(${FLAG} ${FLAG_CONSTANT}) @@ -12,11 +10,36 @@ function(check_flag FLAG DEFAULT) endif() endfunction() -function(check_debug) - if(CMAKE_BUILD_TYPE STREQUAL "Debug") - check_flag(-Og -O0) - check_flag(-ggdb -g) - add_definitions(-DDEBUG=1) +macro(check_sanitizer VAR NAME LIB) + message(STATUS "Checking for sanitizer: ${NAME} (-l${LIB})") + if(${NAME} IN_LIST ${VAR} OR ${LIB} IN_LIST ${VAR}) + make_have_identifier(${LIB} HAVE) + cmake_push_check_state(RESET) + set(CMAKE_REQUIRED_LIBRARIES ${LIB}) + check_cxx_compiler_flag(-fsanitize=${NAME} ${HAVE}) + cmake_pop_check_state() + if(${HAVE}) + add_compile_definitions(${HAVE}) + add_compile_options(-fsanitize=${NAME}) + link_libraries(-fsanitize=${NAME}) + set_flag(-fsanitize-recover=${NAME} IGNORE) + message(STATUS " OK: sanitizer ${NAME}") + else() + message(STATUS " NO: not supported") + endif() + else() + message(STATUS " NO: not requested") + endif() +endmacro() + +if(CMAKE_BUILD_TYPE STREQUAL "Debug" AND NOT MSVC) + add_definitions(-DDEBUG=1) + if(CMAKE_CXX_FLAGS MATCHES --coverage) + message("-- Coverage build detected!") + message("-- Skipping debug and sanitizer flag checks.") + else() + set_flag(-Og -O0) + set_flag(-ggdb -g) foreach(FLAG IN ITEMS -fno-inline -fno-omit-frame-pointer @@ -37,37 +60,16 @@ function(check_debug) -Wunknown-pragmas -Wunsafe-loop-optimizations ) - check_flag(${FLAG} IGNORE) + set_flag(${FLAG} IGNORE) endforeach() if(ENABLE_SANITIZERS) - if(address IN_LIST ENABLE_SANITIZERS OR asan IN_LIST ENABLE_SANITIZERS) - cmake_push_check_state(RESET) - set(CMAKE_REQUIRED_LIBRARIES asan) - check_cxx_compiler_flag(-fsanitize=address HAVE_ASAN) - cmake_pop_check_state() - if(HAVE_ASAN) - add_compile_definitions(HAVE_ASAN) - add_compile_options(-fsanitize=address) - add_link_options(-lasan) - check_flag(-fsanitize-recover=address IGNORE) - endif() - endif() - - if(undefined IN_LIST ENABLE_SANITIZERS OR ubsan IN_LIST ENABLE_SANITIZERS) - cmake_push_check_state(RESET) - set(CMAKE_REQUIRED_LIBRARIES ubsan) - check_cxx_compiler_flag(-fsanitize=undefined HAVE_UBSAN) - cmake_pop_check_state() - if(HAVE_UBSAN) - add_compile_definitions(HAVE_UBSAN) - add_compile_options(-fsanitize=undefined) - add_link_options(-lubsan) - check_flag(-fsanitize-recover=undefined IGNORE) - endif() - endif() + check_sanitizer(ENABLE_SANITIZERS address asan) + check_sanitizer(ENABLE_SANITIZERS undefined ubsan) + check_sanitizer(ENABLE_SANITIZERS thread tsan) + check_sanitizer(ENABLE_SANITIZERS leak lsan) endif() - else() - add_definitions(-DDEBUG=0) endif() -endfunction() +else() + add_definitions(-DDEBUG=0) +endif()