1
+ set (CPPCHECK_PROJECTS "" )
2
+ set (CPPCHECK_ARGUMENTS "" )
3
+ set (CPPCHECK_PLATFORM "" )
4
+ set (CPPCHECK_LIBRARIES "" )
5
+
6
+ include (CMakeParseArguments)
7
+
8
+ function (cppcheck)
9
+ set (CPPCHECK_PATH "" CACHE PATH "Path to cppcheck binary" )
10
+ set (CPPCHECK_BIN "cppcheck.exe" CACHE STRING "CPPCheck Binary File" )
11
+ set (CPPCHECK_ENABLE_INCONCLUSIVE ON CACHE BOOL "Enable inconclusive checks?" )
12
+ set (CPPCHECK_ENABLE_MISSING_INCLUDE ON CACHE BOOL "Check for missing includes?" )
13
+ set (CPPCHECK_ENABLE_UNUSED_FUNCTION OFF CACHE BOOL "Check for unused functions?" )
14
+ set (CPPCHECK_ENABLE_INFORMATION ON CACHE BOOL "Enable information messages?" )
15
+ set (CPPCHECK_ENABLE_PORTABILITY ON CACHE BOOL "Enable portability messages?" )
16
+ set (CPPCHECK_ENABLE_PERFORMANCE ON CACHE BOOL "Enable performance messages?" )
17
+ set (CPPCHECK_ENABLE_WARNING ON CACHE BOOL "Enable warning messages?" )
18
+ set (CPPCHECK_STD_POSIX OFF CACHE BOOL "POSIX Standard Compatibility Checks" )
19
+ set (CPPCHECK_STD_C89 OFF CACHE BOOL "C89 Standard Compatibility Checks" )
20
+ set (CPPCHECK_STD_C99 OFF CACHE BOOL "C99 Standard Compatibility Checks" )
21
+ set (CPPCHECK_STD_C11 ON CACHE BOOL "C11 Standard Compatibility Checks" )
22
+ set (CPPCHECK_STD_CPP03 OFF CACHE BOOL "C++03 Standard Compatibility Checks" )
23
+ set (CPPCHECK_STD_CPP11 OFF CACHE BOOL "C++11 Standard Compatibility Checks" )
24
+ set (CPPCHECK_STD_CPP14 ON CACHE BOOL "C++14 Standard Compatibility Checks" )
25
+ set (CPPCHECK_FORCE_C OFF CACHE BOOL "Force checking with C language" )
26
+ set (CPPCHECK_FORCE_CPP OFF CACHE BOOL "Force checking with C++ language (overrides CPPCHECK_FORCE_C)" )
27
+ set (CPPCHECK_VERBOSE ON CACHE BOOL "Show more detailed error reports" )
28
+ set (CPPCHECK_QUIET ON CACHE BOOL "Hide progress reports" )
29
+ set (CPPCHECK_PROGRESS OFF CACHE BOOL "Report checking progress " )
30
+ set (CPPCHECK_LIBRARIES "" CACHE STRING "List of Libraries to load separated by semicolon" )
31
+ set (CPPCHECK_EXCLUDE_DIRECTORIES "" CACHE STRING "List of directories to exclude separated by semicolon" )
32
+ set (CPPCHECK_PARALLEL_TASKS "4" CACHE STRING "Number of threads to use for cppcheck" )
33
+ set (CPPCHECK_CHECK_CONFIG OFF CACHE BOOL "Run cppcheck to check only its config" )
34
+
35
+ if (WIN32 )
36
+ set (CPPCHECK_WIN32_UNICODE ON CACHE BOOL "Use Unicode character encoding for Win32" )
37
+ endif ()
38
+
39
+ mark_as_advanced (CPPCHECK_BIN CPPCHECK_QUIET CPPCHECK_VERBOSE CPPCHECK_LIBRARIES CPPCHECK_PROGRESS CPPCHECK_ENABLE_INCONCLUSIVE CPPCHECK_PARALLEL_TASKS CPPCHECK_CHECK_CONFIG)
40
+
41
+ # Parse arguments
42
+ set (cppcheck_options )
43
+ set (cppcheck_oneval )
44
+ set (cppcheck_mulval EXCLUDE )
45
+ cmake_parse_arguments (
46
+ CPPCHECKP
47
+ "${cppcheck_options} "
48
+ "${cppcheck_oneval} "
49
+ "${cppcheck_mulval} "
50
+ ${ARGN}
51
+ )
52
+
53
+ # Detect Architecture (Bitness)
54
+ math (EXPR BITS "8*${CMAKE_SIZEOF_VOID_P} " )
55
+
56
+ # Detect Platform
57
+ if (WIN32 )
58
+ if (BITS EQUAL "32" )
59
+ if (CPPCHECK_WIN32_UNICODE)
60
+ set (CPPCHECK_PLATFORM "win32U" )
61
+ else ()
62
+ set (CPPCHECK_PLATFORM "win32A" )
63
+ endif ()
64
+ else ()
65
+ set (CPPCHECK_PLATFORM "win64" )
66
+ endif ()
67
+ elseif (("${CMAKE_SYSTEM_NAME} " MATCHES "Linux" ) OR ("${CMAKE_SYSTEM_NAME} " MATCHES "FreeBSD" ) OR APPLE )
68
+ if (BITS EQUAL "32" )
69
+ set (CPPCHECK_PLATFORM "unix32" )
70
+ else ()
71
+ set (CPPCHECK_PLATFORM "unix64" )
72
+ endif ()
73
+ else ()
74
+ set (CPPCHECK_PLATFORM "unspecified" )
75
+ endif ()
76
+ if (WIN32 )
77
+ list (APPEND CPPCHECK_LIBRARIES "windows" )
78
+ elseif ("${CMAKE_SYSTEM_NAME} " MATCHES "FreeBSD" )
79
+ list (APPEND CPPCHECK_LIBRARIES "bsd" )
80
+ elseif ("${CMAKE_SYSTEM_NAME} " MATCHES "Linux" )
81
+ list (APPEND CPPCHECK_LIBRARIES "gnu" )
82
+ endif ()
83
+
84
+ # Arguments
85
+ set (CPPCHECK_ARGUMENTS "" )
86
+
87
+ # Compiler
88
+ if (MSVC )
89
+ #set(CPPCHECK_TEMPLATE_FORMAT "\{id\}:\{file\}:\{line\}") #format for suppressions list file generation
90
+ set (CPPCHECK_TEMPLATE_FORMAT "vs" ) #visual studio output format usefull to run from IDE
91
+ list (APPEND CPPCHECK_ARGUMENTS --template=${CPPCHECK_TEMPLATE_FORMAT} )
92
+ endif ()
93
+
94
+ # Flags
95
+ if (CPPCHECK_ENABLE_INCONCLUSIVE)
96
+ list (APPEND CPPCHECK_ARGUMENTS --inconclusive)
97
+ endif ()
98
+ if (CPPCHECK_VERBOSE)
99
+ list (APPEND CPPCHECK_ARGUMENTS -v)
100
+ endif ()
101
+ if (CPPCHECK_QUIET)
102
+ list (APPEND CPPCHECK_ARGUMENTS -q)
103
+ endif ()
104
+ if (CPPCHECK_PROGRESS)
105
+ list (APPEND CPPCHECK_ARGUMENTS --report-progress)
106
+ endif ()
107
+
108
+ if (CPPCHECK_PLATFORM)
109
+ list (APPEND CPPCHECK_ARGUMENTS --platform=${CPPCHECK_PLATFORM} )
110
+ endif ()
111
+ if (CPPCHECK_PARALLEL_TASKS)
112
+ list (APPEND CPPCHECK_ARGUMENTS -j ${CPPCHECK_PARALLEL_TASKS} )
113
+ endif ()
114
+ if (CPPCHECK_CHECK_CONFIG)
115
+ list (APPEND CPPCHECK_ARGUMENTS --check-config )
116
+ endif ()
117
+
118
+
119
+ # Libraries
120
+ foreach (_library ${CPPCHECK_LIBRARIES} )
121
+ list (APPEND CPPCHECK_ARGUMENTS --library=${_library} )
122
+ endforeach ()
123
+
124
+ # Exclusion
125
+ foreach (_path ${CPPCHECK_EXCLUDE_DIRECTORIES} )
126
+ file (TO_NATIVE_PATH "${_path} " _npath)
127
+ if (MSVC )
128
+ list (APPEND CPPCHECK_ARGUMENTS --suppress=*:${_npath} \\*)
129
+ else ()
130
+ list (APPEND CPPCHECK_ARGUMENTS -i${_npath} )
131
+ endif ()
132
+ endforeach ()
133
+ if (CPPCHECKP_EXCLUDE)
134
+ foreach (_path ${CPPCHECKP_EXCLUDE} )
135
+ file (TO_NATIVE_PATH "${_path} " _npath)
136
+ if (MSVC )
137
+ list (APPEND CPPCHECK_ARGUMENTS --suppress=*:${_npath} \\*)
138
+ else ()
139
+ list (APPEND CPPCHECK_ARGUMENTS -i${_npath} )
140
+ endif ()
141
+ endforeach ()
142
+ endif ()
143
+
144
+ # Checks
145
+ if (CPPCHECK_ENABLE_MISSING_INCLUDE)
146
+ list (APPEND CPPCHECK_ARGUMENTS --enable=missingInclude)
147
+ endif ()
148
+ if (CPPCHECK_ENABLE_UNUSED_FUNCTION)
149
+ list (APPEND CPPCHECK_ARGUMENTS --enable=unusedFunction)
150
+ endif ()
151
+ if (CPPCHECK_ENABLE_INFORMATION)
152
+ list (APPEND CPPCHECK_ARGUMENTS --enable=information)
153
+ endif ()
154
+ if (CPPCHECK_ENABLE_PORTABILITY)
155
+ list (APPEND CPPCHECK_ARGUMENTS --enable=portability)
156
+ endif ()
157
+ if (CPPCHECK_ENABLE_PERFORMANCE)
158
+ list (APPEND CPPCHECK_ARGUMENTS --enable=performance)
159
+ endif ()
160
+ if (CPPCHECK_ENABLE_WARNING)
161
+ list (APPEND CPPCHECK_ARGUMENTS --enable=warning)
162
+ endif ()
163
+
164
+ # Std
165
+ if (CPPCHECK_STD_POSIX)
166
+ list (APPEND CPPCHECK_ARGUMENTS --std=posix)
167
+ endif ()
168
+ if (CPPCHECK_STD_C89)
169
+ list (APPEND CPPCHECK_ARGUMENTS --std=c89)
170
+ endif ()
171
+ if (CPPCHECK_STD_C99)
172
+ list (APPEND CPPCHECK_ARGUMENTS --std=c99)
173
+ endif ()
174
+ if (CPPCHECK_STD_C11)
175
+ list (APPEND CPPCHECK_ARGUMENTS --std=c11)
176
+ endif ()
177
+ if (CPPCHECK_STD_CPP03)
178
+ list (APPEND CPPCHECK_ARGUMENTS --std=c++03)
179
+ endif ()
180
+ if (CPPCHECK_STD_CPP11)
181
+ list (APPEND CPPCHECK_ARGUMENTS --std=c++11)
182
+ endif ()
183
+ if (CPPCHECK_STD_CPP14)
184
+ list (APPEND CPPCHECK_ARGUMENTS --std=c++14)
185
+ endif ()
186
+
187
+ # Force Language
188
+ if (CPPCHECK_FORCE_CPP)
189
+ list (APPEND CPPCHECK_ARGUMENTS --language =c++)
190
+ elseif (CPPCHECK_FORCE_C)
191
+ list (APPEND CPPCHECK_ARGUMENTS --language =c)
192
+ endif ()
193
+
194
+ find_program (CPPCHECK_EXIST ${CPPCHECK_BIN} )
195
+ IF (CPPCHECK_EXIST)
196
+ add_custom_target (
197
+ CPPCHECK
198
+ )
199
+ ENDIF ()
200
+
201
+ # Propagate to parent scope
202
+ set (CPPCHECK_PROJECTS "${CPPCHECK_PROJECTS} " PARENT_SCOPE)
203
+ set (CPPCHECK_ARGUMENTS "${CPPCHECK_ARGUMENTS} " PARENT_SCOPE)
204
+ set (CPPCHECK_PLATFORM "${CPPCHECK_PLATFORM} " PARENT_SCOPE)
205
+ set (CPPCHECK_LIBRARIES "${CPPCHECK_LIBRARIES} " PARENT_SCOPE)
206
+ endfunction ()
207
+
208
+ function (cppcheck_add_project u_project)
209
+ list (APPEND CPPCHECK_PROJECTS ${u_project} )
210
+
211
+ # Include Directories
212
+ get_target_property (_INCLUDE_DIRECTORIES ${u_project} INCLUDE_DIRECTORIES )
213
+ foreach (_path ${_INCLUDE_DIRECTORIES} )
214
+ file (TO_NATIVE_PATH "${_path} " _npath)
215
+ list (APPEND CPPCHECK_ARGUMENTS -I${_npath} )
216
+ endforeach ()
217
+
218
+ list (APPEND CPPCHECK_ARGUMENTS --suppressions-list=${PROJECT_SOURCE_DIR} /cppcheck_suppressions_list.txt )
219
+
220
+ if (MSVC )
221
+ IF (CPPCHECK_EXIST)
222
+ add_custom_target (
223
+ CPPCHECK_${u_project}
224
+ COMMAND "${CPPCHECK_BIN} " ${CPPCHECK_ARGUMENTS} --project=${${u_project} _BINARY_DIR}/${u_project} .sln
225
+ COMMAND_EXPAND_LISTS
226
+ VERBATIM
227
+ )
228
+ ENDIF ()
229
+ else ()
230
+ # Non-MSVC and Unix (Linux, FreeBSD, APPLE) need to have -I, -i, -D and -U specified manually.
231
+ # Each file can be added to --file-list= as a comma separated list.
232
+
233
+ # Defines
234
+ get_target_property (_COMPILE_DEFINITIONS ${u_project} COMPILE_DEFINITIONS )
235
+ foreach (_def ${_COMPILE_DEFINITIONS} )
236
+ list (APPEND CPPCHECK_ARGUMENTS -D${_def} )
237
+ endforeach ()
238
+
239
+ # Source Files
240
+ get_target_property (_SOURCES ${u_project} SOURCES )
241
+ foreach (_path ${_SOURCES} )
242
+ file (TO_NATIVE_PATH "${_path} " _npath)
243
+ list (APPEND CPPCHECK_ARGUMENTS ${_npath} )
244
+ endforeach ()
245
+
246
+ IF (CPPCHECK_EXIST)
247
+ add_custom_target (
248
+ CPPCHECK_${u_project}
249
+ COMMAND "${CPPCHECK_BIN} " ${CPPCHECK_ARGUMENTS}
250
+ COMMAND_EXPAND_LISTS
251
+ VERBATIM
252
+ )
253
+ ENDIF ()
254
+ endif ()
255
+ IF (CPPCHECK_EXIST)
256
+ add_dependencies (CPPCHECK CPPCHECK_${u_project} )
257
+ ENDIF ()
258
+ endfunction ()
0 commit comments