testing: tsan
[m6w6/libmemcached] / CMake / CheckDebug.cmake
index 32fbf26d1ddb1dcd7caf576d4a2fdb13a487e164..4b63db66fa5cde7ec79caddcb76516973259838f 100644 (file)
@@ -12,59 +12,65 @@ function(check_flag FLAG 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")
-        check_flag(-Og -O0)
-        check_flag(-ggdb -g)
         add_definitions(-DDEBUG=1)
-        foreach(FLAG IN ITEMS
-                -fno-inline
-                -fno-omit-frame-pointer
-                -fno-eliminate-unused-debug-types
-                -funsafe-loop-optimizations
-
-                -Wall
-                -Wextra
+        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
 
-                -Wdouble-promotion
-                -Wduplicated-cond
-                -Wduplicated-branches
-                -Wformat=2
-                -Wlogical-op
-                -Wnull-dereference
-                -Wrestrict
-                -Wshadow
-                -Wunknown-pragmas
-                -Wunsafe-loop-optimizations
-                )
-            check_flag(${FLAG} IGNORE)
-        endforeach()
+                    -Wall
+                    -Wextra
 
-        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)
-                    link_libraries(-fsanitize=address)
-                    check_flag(-fsanitize-recover=address IGNORE)
-                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_definitions(HAVE_UBSAN)
-                    add_compile_options(-fsanitize=undefined)
-                    link_libraries(-fsanitize=undefined)
-                    check_flag(-fsanitize-recover=undefined IGNORE)
-                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()