X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=CMake%2FCheckDebug.cmake;h=4b63db66fa5cde7ec79caddcb76516973259838f;hb=6b7d2bf0319e0bd48bd6aa4ad8c56a935f98b0d2;hp=cc91da979171d09e23d5f375ecf7445808c00e13;hpb=b3a0a9fcac5ae592a4e74b734f27dc11533d3907;p=awesomized%2Flibmemcached diff --git a/CMake/CheckDebug.cmake b/CMake/CheckDebug.cmake index cc91da97..4b63db66 100644 --- a/CMake/CheckDebug.cmake +++ b/CMake/CheckDebug.cmake @@ -1,61 +1,76 @@ include(CMakePushCheckState) include(CheckCXXCompilerFlag) +function(check_flag FLAG DEFAULT) + unset(FLAG_CONSTANT) + string(MAKE_C_IDENTIFIER CXX${FLAG} FLAG_CONSTANT) + check_cxx_compiler_flag(${FLAG} ${FLAG_CONSTANT}) + if(${FLAG_CONSTANT}) + add_compile_options(${FLAG}) + elseif(DEFAULT) + add_compile_options(${DEFAULT}) + endif() +endfunction() + +macro(check_sanitizer VAR NAME LIB) + message(STATUS "Checking for sanitizer: ${NAME} (-l${LIB})") + if(${NAME} IN_LIST ${VAR} OR ${LIB} IN_LIST ${VAR}) + safe_string(${LIB} ID) + cmake_push_check_state(RESET) + set(CMAKE_REQUIRED_LIBRARIES ${LIB}) + check_cxx_compiler_flag(-fsanitize=${NAME} HAVE_${ID}) + cmake_pop_check_state() + if(HAVE_${ID}) + add_compile_definitions(HAVE_${ID}) + add_compile_options(-fsanitize=${NAME}) + link_libraries(-fsanitize=${NAME}) + check_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() + function(check_debug) if(CMAKE_BUILD_TYPE STREQUAL "Debug") - add_compile_options(-O1) add_definitions(-DDEBUG=1) - foreach(FLAG IN ITEMS - -fno-inline - -fno-omit-frame-pointer - -fno-eliminate-unused-debug-types - -funsafe-loop-optimizations - - -g3 + if(CMAKE_CXX_FLAGS MATCHES --coverage) + message("-- Coverage build detected!") + message("-- Skipping debug and sanitizer flag checks.") + else() + check_flag(-Og -O0) + check_flag(-ggdb -g) + foreach(FLAG IN ITEMS + -fno-inline + -fno-omit-frame-pointer + -fno-eliminate-unused-debug-types + -funsafe-loop-optimizations - -Wall - -Wextra + -Wall + -Wextra - -Wdouble-promotion - -Wduplicated-cond - -Wduplicated-branches - -Wformat=2 - -Wlogical-op - -Wnull-dereference - -Wrestrict - -Wshadow - -Wunknown-pragmas - -Wunsafe-loop-optimizations - ) - unset(FLAG_CONSTANT) - string(MAKE_C_IDENTIFIER CXX${FLAG} FLAG_CONSTANT) - check_cxx_compiler_flag(${FLAG} ${FLAG_CONSTANT}) - if(${FLAG_CONSTANT}) - add_compile_options(${FLAG}) - endif() - 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_options(-fsanitize=address) - add_link_options(-lasan) - endif() - endif() + -Wdouble-promotion + -Wduplicated-cond + -Wduplicated-branches + -Wformat=2 + -Wlogical-op + -Wnull-dereference + -Wrestrict + -Wshadow + -Wunknown-pragmas + -Wunsafe-loop-optimizations + ) + check_flag(${FLAG} IGNORE) + endforeach() - 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_options(-fsanitize=undefined) - add_link_options(-lubsan) - endif() + if(ENABLE_SANITIZERS) + 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() endif() else()