-
Notifications
You must be signed in to change notification settings - Fork 0
/
sanitize.cmake
131 lines (106 loc) · 4.31 KB
/
sanitize.cmake
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
# From https://github.com/pedrolmcastro/cppmake
function(cppmake_sanitize)
cmake_parse_arguments(CPPMAKE "LEAK;STACK;MEMORY;THREAD;ADDRESS;UNDEFINED" "TARGET" "" ${ARGN})
if(NOT CPPMAKE_TARGET)
message(FATAL_ERROR "Missing target")
endif()
if(
NOT CPPMAKE_LEAK
AND NOT CPPMAKE_STACK
AND NOT CPPMAKE_MEMORY
AND NOT CPPMAKE_THREAD
AND NOT CPPMAKE_ADDRESS
AND NOT CPPMAKE_UNDEFINED
)
message(FATAL_ERROR "No sanitizers specified")
endif()
if(CPPMAKE_UNPARSED_ARGUMENTS)
message(FATAL_ERROR "Invalid arguments: ${CPPMAKE_UNPARSED_ARGUMENTS}")
endif()
set(COMPILING "")
set(LINKING "")
if(MSVC)
if(CPPMAKE_LEAK)
message(AUTHOR_WARNING "Leak sanitizer isn't supported on MSVC")
endif()
if(CPPMAKE_STACK)
message(AUTHOR_WARNING "Safe stack sanitizer isn't supported on MSVC")
endif()
if(CPPMAKE_MEMORY)
message(AUTHOR_WARNING "Memory sanitizer isn't supported on MSVC")
endif()
if(CPPMAKE_THREAD)
message(AUTHOR_WARNING "Thread sanitizer isn't supported on MSVC")
endif()
if(CPPMAKE_ADDRESS)
list(APPEND COMPILING /fsanitize=address /Zi /INCREMENTAL:NO)
list(APPEND LINKING /INCREMENTAL:NO)
endif()
if(CPPMAKE_UNDEFINED)
message(AUTHOR_WARNING "Undefined behavior sanitizer isn't supported on MSVC")
endif()
elseif(CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang|IntelLLVM")
set(SANITIZERS "")
if(CPPMAKE_LEAK)
if(WIN32)
message(AUTHOR_WARNING "Leak sanitizer isn't supported on Windows")
else()
list(APPEND SANITIZERS "leak")
endif()
endif()
if(CPPMAKE_STACK)
if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
message(AUTHOR_WARNING "Safe stack sanitizer isn't supported on GCC")
elseif(CMAKE_CXX_COMPILER_ID STREQUAL "IntelLLVM")
message(AUTHOR_WARNING "Safe stack sanitizer isn't supported on ICC")
else()
list(APPEND SANITIZERS "safe-stack")
endif()
endif()
if(CPPMAKE_MEMORY)
if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
message(AUTHOR_WARNING "Memory sanitizer isn't supported on GCC")
elseif(WIN32)
message(AUTHOR_WARNING "Memory sanitizer isn't supported on Windows")
elseif(CPPMAKE_LEAK)
message(AUTHOR_WARNING "Memory sanitizer is incompatible with leak sanitizer")
elseif(CPPMAKE_THREAD)
message(AUTHOR_WARNING "Memory sanitizer is incompatible with thread sanitizer")
elseif(CPPMAKE_ADDRESS)
message(AUTHOR_WARNING "Memory sanitizer is incompatible with address sanitizer")
else()
list(APPEND SANITIZERS "memory")
endif()
endif()
if(CPPMAKE_THREAD)
if(WIN32)
message(AUTHOR_WARNING "Thread sanitizer isn't supported on Windows")
elseif(CPPMAKE_LEAK)
message(AUTHOR_WARNING "Thread sanitizer is incompatible with leak sanitizer")
elseif(CPPMAKE_MEMORY)
message(AUTHOR_WARNING "Thread sanitizer is incompatible with memory sanitizer")
elseif(CPPMAKE_ADDRESS)
message(AUTHOR_WARNING "Thread sanitizer is incompatible with address sanitizer")
else()
list(APPEND SANITIZERS "thread")
endif()
endif()
if(CPPMAKE_ADDRESS)
list(APPEND SANITIZERS "address")
endif()
if(CPPMAKE_UNDEFINED)
list(APPEND SANITIZERS "undefined")
endif()
list(JOIN SANITIZERS "," SANITIZERS)
if(SANITIZERS)
list(APPEND COMPILING -fsanitize=${SANITIZERS})
list(APPEND LINKING -fsanitize=${SANITIZERS})
endif()
else()
message(AUTHOR_WARNING "Compiler not supported: ${CMAKE_CXX_COMPILER_ID}")
endif()
if(COMPILING AND LINKING)
target_compile_options(${CPPMAKE_TARGET} PRIVATE $<$<COMPILE_LANGUAGE:CXX>:${COMPILING}>)
target_link_options(${CPPMAKE_TARGET} PRIVATE $<$<COMPILE_LANGUAGE:CXX>:${LINKING}>)
endif()
endfunction()