]> git.sven.stormbind.net Git - sven/vym.git/blob - cmake/Findcppcheck.cmake
7cfdc74f891840f0615b668ab375c58ecd490256
[sven/vym.git] / cmake / Findcppcheck.cmake
1 # - try to find cppcheck tool
2 #
3 # Cache Variables:
4 #  CPPCHECK_EXECUTABLE
5 #
6 # Non-cache variables you might use in your CMakeLists.txt:
7 #  CPPCHECK_FOUND
8 #  CPPCHECK_POSSIBLEERROR_ARG
9 #  CPPCHECK_UNUSEDFUNC_ARG
10 #  CPPCHECK_STYLE_ARG
11 #  CPPCHECK_QUIET_ARG
12 #  CPPCHECK_INCLUDEPATH_ARG
13 #  CPPCHECK_FAIL_REGULAR_EXPRESSION
14 #  CPPCHECK_WARN_REGULAR_EXPRESSION
15 #  CPPCHECK_MARK_AS_ADVANCED - whether to mark our vars as advanced even
16 #    if we don't find this program.
17 #
18 # Requires these CMake modules:
19 #  FindPackageHandleStandardArgs (known included with CMake >=2.6.2)
20 #
21 # Original Author:
22 # 2009-2010 Ryan Pavlik <rpavlik@iastate.edu> <abiryan@ryand.net>
23 # http://academic.cleardefinition.com
24 # Iowa State University HCI Graduate Program/VRAC
25 #
26 # Copyright Iowa State University 2009-2010.
27 # Distributed under the Boost Software License, Version 1.0.
28 # (See accompanying file LICENSE_1_0.txt or copy at
29 # http://www.boost.org/LICENSE_1_0.txt)
30
31 file(TO_CMAKE_PATH "${CPPCHECK_ROOT_DIR}" CPPCHECK_ROOT_DIR)
32 set(CPPCHECK_ROOT_DIR
33         "${CPPCHECK_ROOT_DIR}"
34         CACHE
35         PATH
36         "Path to search for cppcheck")
37
38 # cppcheck app bundles on Mac OS X are GUI, we want command line only
39 set(_oldappbundlesetting ${CMAKE_FIND_APPBUNDLE})
40 set(CMAKE_FIND_APPBUNDLE NEVER)
41
42 if(CPPCHECK_EXECUTABLE AND NOT EXISTS "${CPPCHECK_EXECUTABLE}")
43         set(CPPCHECK_EXECUTABLE "notfound" CACHE PATH FORCE "")
44 endif()
45
46 # If we have a custom path, look there first.
47 if(CPPCHECK_ROOT_DIR)
48         find_program(CPPCHECK_EXECUTABLE
49                 NAMES
50                 cppcheck
51                 cli
52                 PATHS
53                 "${CPPCHECK_ROOT_DIR}"
54                 PATH_SUFFIXES
55                 cli
56                 NO_DEFAULT_PATH)
57 endif()
58
59 find_program(CPPCHECK_EXECUTABLE NAMES cppcheck)
60
61 # Restore original setting for appbundle finding
62 set(CMAKE_FIND_APPBUNDLE ${_oldappbundlesetting})
63
64 # Find out where our test file is
65 get_filename_component(_cppcheckmoddir ${CMAKE_CURRENT_LIST_FILE} PATH)
66 set(_cppcheckdummyfile "${_cppcheckmoddir}/Findcppcheck.cpp")
67
68 function(_cppcheck_test_arg _resultvar _arg)
69         if(NOT CPPCHECK_EXECUTABLE)
70                 set(${_resultvar} NO)
71                 return()
72         endif()
73         execute_process(COMMAND
74                 "${CPPCHECK_EXECUTABLE}"
75                 "${_arg}"
76                 "--quiet"
77                 "${_cppcheckdummyfile}"
78                 RESULT_VARIABLE
79                 _cppcheck_result
80                 OUTPUT_QUIET
81                 ERROR_QUIET)
82         if("${_cppcheck_result}" EQUAL 0)
83                 set(${_resultvar} YES PARENT_SCOPE)
84         else()
85                 set(${_resultvar} NO PARENT_SCOPE)
86         endif()
87 endfunction()
88
89 function(_cppcheck_set_arg_var _argvar _arg)
90         if("${${_argvar}}" STREQUAL "")
91                 _cppcheck_test_arg(_cppcheck_arg "${_arg}")
92                 if(_cppcheck_arg)
93                         set(${_argvar} "${_arg}" PARENT_SCOPE)
94                 endif()
95         endif()
96 endfunction()
97
98 if(CPPCHECK_EXECUTABLE)
99
100         # Check for the two types of command line arguments by just trying them
101         _cppcheck_set_arg_var(CPPCHECK_STYLE_ARG "--enable=style")
102         _cppcheck_set_arg_var(CPPCHECK_STYLE_ARG "--style")
103         if("${CPPCHECK_STYLE_ARG}" STREQUAL "--enable=style")
104
105                _cppcheck_set_arg_var(CPPCHECK_UNUSEDFUNC_ARG "--enable=unusedFunction")
106                 _cppcheck_set_arg_var(CPPCHECK_INFORMATION_ARG "--enable=information")
107                _cppcheck_set_arg_var(CPPCHECK_INCLUDE_ARG "--enable=missingInclude")
108                 _cppcheck_set_arg_var(CPPCHECK_POSIX_ARG "--enable=posix")
109                 _cppcheck_set_arg_var(CPPCHECK_POSSIBLEERROR_ARG "--enable=possibleError")
110                 _cppcheck_set_arg_var(CPPCHECK_POSSIBLEERROR_ARG "--enable=all")
111
112                 if(MSVC)
113                         set(CPPCHECK_TEMPLATE_ARG --template vs)
114                         set(CPPCHECK_FAIL_REGULAR_EXPRESSION "[(]error[)]")
115                         set(CPPCHECK_WARN_REGULAR_EXPRESSION "[(]style[)]")
116                 elseif(CMAKE_COMPILER_IS_GNUCXX)
117                         set(CPPCHECK_TEMPLATE_ARG --template gcc)
118                         set(CPPCHECK_FAIL_REGULAR_EXPRESSION " error: ")
119                         set(CPPCHECK_WARN_REGULAR_EXPRESSION " style: ")
120                 else()
121                         set(CPPCHECK_TEMPLATE_ARG --template gcc)
122                         set(CPPCHECK_FAIL_REGULAR_EXPRESSION " error: ")
123                         set(CPPCHECK_WARN_REGULAR_EXPRESSION " style: ")
124                 endif()
125         elseif("${CPPCHECK_STYLE_ARG}" STREQUAL "--style")
126                 # Old arguments
127                 _cppcheck_set_arg_var(CPPCHECK_UNUSEDFUNC_ARG "--unused-functions")
128                 _cppcheck_set_arg_var(CPPCHECK_POSSIBLEERROR_ARG "--all")
129                 set(CPPCHECK_FAIL_REGULAR_EXPRESSION "error:")
130                 set(CPPCHECK_WARN_REGULAR_EXPRESSION "[(]style[)]")
131         else()
132                 # No idea - some other issue must be getting in the way
133                 message(STATUS
134                         "WARNING: Can't detect whether CPPCHECK wants new or old-style arguments!")
135         endif()
136
137         set(CPPCHECK_QUIET_ARG "--quiet")
138         set(CPPCHECK_INCLUDEPATH_ARG "-I")
139
140 endif()
141
142 set(CPPCHECK_ALL
143         "${CPPCHECK_EXECUTABLE} ${CPPCHECK_POSSIBLEERROR_ARG} ${CPPCHECK_UNUSEDFUNC_ARG} ${CPPCHECK_STYLE_ARG} ${CPPCHECK_QUIET_ARG} ${CPPCHECK_INCLUDEPATH_ARG} some/include/path")
144
145 include(FindPackageHandleStandardArgs)
146 find_package_handle_standard_args(cppcheck
147         DEFAULT_MSG
148         CPPCHECK_ALL
149         CPPCHECK_EXECUTABLE
150         CPPCHECK_POSSIBLEERROR_ARG
151         CPPCHECK_UNUSEDFUNC_ARG
152         CPPCHECK_STYLE_ARG
153         CPPCHECK_INCLUDEPATH_ARG
154         CPPCHECK_QUIET_ARG)
155
156 if(CPPCHECK_FOUND OR CPPCHECK_MARK_AS_ADVANCED)
157         mark_as_advanced(CPPCHECK_ROOT_DIR)
158 endif()
159
160 mark_as_advanced(CPPCHECK_EXECUTABLE)