testing: tsan
[m6w6/libmemcached] / CMake / CheckDebug.cmake
1 include(CMakePushCheckState)
2 include(CheckCXXCompilerFlag)
3
4 function(check_flag FLAG DEFAULT)
5 unset(FLAG_CONSTANT)
6 string(MAKE_C_IDENTIFIER CXX${FLAG} FLAG_CONSTANT)
7 check_cxx_compiler_flag(${FLAG} ${FLAG_CONSTANT})
8 if(${FLAG_CONSTANT})
9 add_compile_options(${FLAG})
10 elseif(DEFAULT)
11 add_compile_options(${DEFAULT})
12 endif()
13 endfunction()
14
15 macro(check_sanitizer VAR NAME LIB)
16 message(STATUS "Checking for sanitizer: ${NAME} (-l${LIB})")
17 if(${NAME} IN_LIST ${VAR} OR ${LIB} IN_LIST ${VAR})
18 safe_string(${LIB} ID)
19 cmake_push_check_state(RESET)
20 set(CMAKE_REQUIRED_LIBRARIES ${LIB})
21 check_cxx_compiler_flag(-fsanitize=${NAME} HAVE_${ID})
22 cmake_pop_check_state()
23 if(HAVE_${ID})
24 add_compile_definitions(HAVE_${ID})
25 add_compile_options(-fsanitize=${NAME})
26 link_libraries(-fsanitize=${NAME})
27 check_flag(-fsanitize-recover=${NAME} IGNORE)
28 message(STATUS " OK: sanitizer ${NAME}")
29 else()
30 message(STATUS " NO: not supported")
31 endif()
32 else()
33 message(STATUS " NO: not requested")
34 endif()
35 endmacro()
36
37 function(check_debug)
38 if(CMAKE_BUILD_TYPE STREQUAL "Debug")
39 add_definitions(-DDEBUG=1)
40 if(CMAKE_CXX_FLAGS MATCHES --coverage)
41 message("-- Coverage build detected!")
42 message("-- Skipping debug and sanitizer flag checks.")
43 else()
44 check_flag(-Og -O0)
45 check_flag(-ggdb -g)
46 foreach(FLAG IN ITEMS
47 -fno-inline
48 -fno-omit-frame-pointer
49 -fno-eliminate-unused-debug-types
50 -funsafe-loop-optimizations
51
52 -Wall
53 -Wextra
54
55 -Wdouble-promotion
56 -Wduplicated-cond
57 -Wduplicated-branches
58 -Wformat=2
59 -Wlogical-op
60 -Wnull-dereference
61 -Wrestrict
62 -Wshadow
63 -Wunknown-pragmas
64 -Wunsafe-loop-optimizations
65 )
66 check_flag(${FLAG} IGNORE)
67 endforeach()
68
69 if(ENABLE_SANITIZERS)
70 check_sanitizer(ENABLE_SANITIZERS address asan)
71 check_sanitizer(ENABLE_SANITIZERS undefined ubsan)
72 check_sanitizer(ENABLE_SANITIZERS thread tsan)
73 check_sanitizer(ENABLE_SANITIZERS leak lsan)
74 endif()
75 endif()
76 else()
77 add_definitions(-DDEBUG=0)
78 endif()
79 endfunction()