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