|
@@ -0,0 +1,122 @@
|
|
|
+# Locate cppcheck
|
|
|
+#
|
|
|
+# This module defines
|
|
|
+# CPPCHECK_BIN, where to find cppcheck
|
|
|
+#
|
|
|
+# To help find the binary you can set CPPCHECK_ROOT_DIR to search a custom path
|
|
|
+# Exported argumets include
|
|
|
+# CPPCHECK_FOUND, if false, do not try to link to cppcheck --- if (CPPCHECK_FOUND)
|
|
|
+#
|
|
|
+# CPPCHECK_THREADS_ARG - Number of threads to use (e.g. -j 3)
|
|
|
+# CPPCHECK_PROJECT_ARG - The project to use (compile_comands.json)
|
|
|
+# CPPCHECK_BUILD_DIR_ARG - The build output directory
|
|
|
+# CPPCHECK_ERROR_EXITCODE_ARG - The exit code if an error is found
|
|
|
+# CPPCHECK_SUPPRESSIONS - A suppressiosn file to use
|
|
|
+# CPPCHECK_CHECKS_ARGS - The checks to run
|
|
|
+# CPPCHECK_OTHER_ARGS - Any other arguments
|
|
|
+# CPPCHECK_COMMAND - The full command to run the default cppcheck configuration
|
|
|
+# CPPCHECK_EXCLUDES - A list of files or folders to exclude from the scan. Must be the full path
|
|
|
+#
|
|
|
+# if CPPCHECK_XML_OUTPUT is set before calling this. CppCheck will create an xml file with that name
|
|
|
+# find the cppcheck binary
|
|
|
+
|
|
|
+# if custom path check there first
|
|
|
+if(CPPCHECK_ROOT_DIR)
|
|
|
+ find_program(CPPCHECK_BIN
|
|
|
+ NAMES
|
|
|
+ cppcheck
|
|
|
+ PATHS
|
|
|
+ "${CPPCHECK_ROOT_DIR}"
|
|
|
+ NO_DEFAULT_PATH)
|
|
|
+endif()
|
|
|
+
|
|
|
+find_program(CPPCHECK_BIN NAMES cppcheck)
|
|
|
+
|
|
|
+if(CPPCHECK_BIN)
|
|
|
+ execute_process(COMMAND ${CPPCHECK_BIN} --version
|
|
|
+ OUTPUT_VARIABLE CPPCHECK_VERSION
|
|
|
+ ERROR_QUIET
|
|
|
+ OUTPUT_STRIP_TRAILING_WHITESPACE)
|
|
|
+ message("cppcheck version: ${CPPCHECK_VERSION}")
|
|
|
+ set(CPPCHECK_THREADS_ARG "-j4" CACHE STRING "The number of threads to use")
|
|
|
+ set(CPPCHECK_PROJECT_ARG "--project=${PROJECT_BINARY_DIR}/compile_commands.json")
|
|
|
+ set(CPPCHECK_BUILD_DIR_ARG "--cppcheck-build-dir=${PROJECT_BINARY_DIR}/analysis/cppcheck" CACHE STRING "The build directory to use")
|
|
|
+ # Don't show these errors
|
|
|
+ if(EXISTS "${CMAKE_SOURCE_DIR}/.cppcheck_suppressions")
|
|
|
+ set(CPPCHECK_SUPPRESSIONS "--suppressions-list=${CMAKE_SOURCE_DIR}/.cppcheck_suppressions" CACHE STRING "The suppressions file to use")
|
|
|
+ else()
|
|
|
+ set(CPPCHECK_SUPPRESSIONS "" CACHE STRING "The suppressions file to use")
|
|
|
+ endif()
|
|
|
+
|
|
|
+ # Show these errors but don't fail the build
|
|
|
+ # These are mainly going to be from the "warning" category that is enabled by default later
|
|
|
+ if(EXISTS "${CMAKE_SOURCE_DIR}/.cppcheck_exitcode_suppressions")
|
|
|
+ set(CPPCHECK_EXITCODE_SUPPRESSIONS "--exitcode-suppressions=${CMAKE_SOURCE_DIR}/.cppcheck_exitcode_suppressions" CACHE STRING "The exitcode suppressions file to use")
|
|
|
+ else()
|
|
|
+ set(CPPCHECK_EXITCODE_SUPPRESSIONS "" CACHE STRING "The exitcode suppressions file to use")
|
|
|
+ endif()
|
|
|
+
|
|
|
+ set(CPPCHECK_ERROR_EXITCODE_ARG "--error-exitcode=1" CACHE STRING "The exitcode to use if an error is found")
|
|
|
+ set(CPPCHECK_CHECKS_ARGS "--enable=warning" CACHE STRING "Arguments for the checks to run")
|
|
|
+ set(CPPCHECK_OTHER_ARGS "" CACHE STRING "Other arguments")
|
|
|
+ set(_CPPCHECK_EXCLUDES)
|
|
|
+
|
|
|
+ foreach(ex ${CPPCHECK_EXCLUDES})
|
|
|
+ list(APPEND _CPPCHECK_EXCLUDES "-i${ex}")
|
|
|
+ endforeach(ex)
|
|
|
+
|
|
|
+ set(CPPCHECK_ALL_ARGS
|
|
|
+ ${CPPCHECK_THREADS_ARG}
|
|
|
+ ${CPPCHECK_PROJECT_ARG}
|
|
|
+ ${CPPCHECK_BUILD_DIR_ARG}
|
|
|
+ ${CPPCHECK_ERROR_EXITCODE_ARG}
|
|
|
+ ${CPPCHECK_SUPPRESSIONS}
|
|
|
+ ${CPPCHECK_EXITCODE_SUPPRESSIONS}
|
|
|
+ ${CPPCHECK_CHECKS_ARGS}
|
|
|
+ ${CPPCHECK_OTHER_ARGS}
|
|
|
+ ${_CPPCHECK_EXCLUDES}
|
|
|
+ )
|
|
|
+
|
|
|
+ if(NOT CPPCHECK_XML_OUTPUT)
|
|
|
+ set(CPPCHECK_COMMAND
|
|
|
+ ${CPPCHECK_BIN}
|
|
|
+ ${CPPCHECK_ALL_ARGS}
|
|
|
+ )
|
|
|
+ else()
|
|
|
+ set(CPPCHECK_COMMAND
|
|
|
+ ${CPPCHECK_BIN}
|
|
|
+ ${CPPCHECK_ALL_ARGS}
|
|
|
+ --xml
|
|
|
+ --xml-version=2
|
|
|
+ 2> ${CPPCHECK_XML_OUTPUT})
|
|
|
+ endif()
|
|
|
+
|
|
|
+endif()
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+# handle the QUIETLY and REQUIRED arguments and set YAMLCPP_FOUND to TRUE if all listed variables are TRUE
|
|
|
+include(FindPackageHandleStandardArgs)
|
|
|
+FIND_PACKAGE_HANDLE_STANDARD_ARGS(
|
|
|
+ CPPCHECK
|
|
|
+ DEFAULT_MSG
|
|
|
+ CPPCHECK_BIN)
|
|
|
+
|
|
|
+mark_as_advanced(
|
|
|
+ CPPCHECK_BIN
|
|
|
+ CPPCHECK_THREADS_ARG
|
|
|
+ CPPCHECK_PROJECT_ARG
|
|
|
+ CPPCHECK_BUILD_DIR_ARG
|
|
|
+ CPPCHECK_ERROR_EXITCODE_ARG
|
|
|
+ CPPCHECK_SUPPRESSIONS
|
|
|
+ CPPCHECK_CHECKS_ARGS
|
|
|
+ CPPCHECK_OTHER_ARGS)
|
|
|
+
|
|
|
+if(CPPCHECK_FOUND)
|
|
|
+ file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/analysis/cppcheck)
|
|
|
+ add_custom_target(cppcheck-analysis
|
|
|
+ COMMAND ${CPPCHECK_COMMAND})
|
|
|
+ message("cppcheck found. Use cppcheck-analysis targets to run it ${CPPCHECK_COMMAND}")
|
|
|
+else()
|
|
|
+ message("cppcheck not found. No cppcheck-analysis targets")
|
|
|
+endif()
|