1 # - try to find cppcheck tool
6 # Non-cache variables you might use in your CMakeLists.txt:
8 # CPPCHECK_POSSIBLEERROR_ARG
9 # CPPCHECK_UNUSEDFUNC_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.
18 # Requires these CMake modules:
19 # FindPackageHandleStandardArgs (known included with CMake >=2.6.2)
22 # 2009-2010 Ryan Pavlik <rpavlik@iastate.edu> <abiryan@ryand.net>
23 # http://academic.cleardefinition.com
24 # Iowa State University HCI Graduate Program/VRAC
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)
31 file(TO_CMAKE_PATH "${CPPCHECK_ROOT_DIR}" CPPCHECK_ROOT_DIR)
33 "${CPPCHECK_ROOT_DIR}"
36 "Path to search for cppcheck")
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)
42 if(CPPCHECK_EXECUTABLE AND NOT EXISTS "${CPPCHECK_EXECUTABLE}")
43 set(CPPCHECK_EXECUTABLE "notfound" CACHE PATH FORCE "")
46 # If we have a custom path, look there first.
48 find_program(CPPCHECK_EXECUTABLE
53 "${CPPCHECK_ROOT_DIR}"
59 find_program(CPPCHECK_EXECUTABLE NAMES cppcheck)
61 # Restore original setting for appbundle finding
62 set(CMAKE_FIND_APPBUNDLE ${_oldappbundlesetting})
64 # Find out where our test file is
65 get_filename_component(_cppcheckmoddir ${CMAKE_CURRENT_LIST_FILE} PATH)
66 set(_cppcheckdummyfile "${_cppcheckmoddir}/Findcppcheck.cpp")
68 function(_cppcheck_test_arg _resultvar _arg)
69 if(NOT CPPCHECK_EXECUTABLE)
73 execute_process(COMMAND
74 "${CPPCHECK_EXECUTABLE}"
77 "${_cppcheckdummyfile}"
82 if("${_cppcheck_result}" EQUAL 0)
83 set(${_resultvar} YES PARENT_SCOPE)
85 set(${_resultvar} NO PARENT_SCOPE)
89 function(_cppcheck_set_arg_var _argvar _arg)
90 if("${${_argvar}}" STREQUAL "")
91 _cppcheck_test_arg(_cppcheck_arg "${_arg}")
93 set(${_argvar} "${_arg}" PARENT_SCOPE)
98 if(CPPCHECK_EXECUTABLE)
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")
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")
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: ")
121 set(CPPCHECK_TEMPLATE_ARG --template gcc)
122 set(CPPCHECK_FAIL_REGULAR_EXPRESSION " error: ")
123 set(CPPCHECK_WARN_REGULAR_EXPRESSION " style: ")
125 elseif("${CPPCHECK_STYLE_ARG}" STREQUAL "--style")
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[)]")
132 # No idea - some other issue must be getting in the way
134 "WARNING: Can't detect whether CPPCHECK wants new or old-style arguments!")
137 set(CPPCHECK_QUIET_ARG "--quiet")
138 set(CPPCHECK_INCLUDEPATH_ARG "-I")
143 "${CPPCHECK_EXECUTABLE} ${CPPCHECK_POSSIBLEERROR_ARG} ${CPPCHECK_UNUSEDFUNC_ARG} ${CPPCHECK_STYLE_ARG} ${CPPCHECK_QUIET_ARG} ${CPPCHECK_INCLUDEPATH_ARG} some/include/path")
145 include(FindPackageHandleStandardArgs)
146 find_package_handle_standard_args(cppcheck
150 CPPCHECK_POSSIBLEERROR_ARG
151 CPPCHECK_UNUSEDFUNC_ARG
153 CPPCHECK_INCLUDEPATH_ARG
156 if(CPPCHECK_FOUND OR CPPCHECK_MARK_AS_ADVANCED)
157 mark_as_advanced(CPPCHECK_ROOT_DIR)
160 mark_as_advanced(CPPCHECK_EXECUTABLE)