cppcheck.cmake
116 lines
| 3.6 KiB
| text/x-cmake
|
CMakeLexer
/ sparc / cppcheck.cmake
r309 | # - Run cppcheck on c++ source files as a custom target and a test | |||
# | ||||
# add_test_cppcheck(<target-name> [UNUSED_FUNCTIONS] [STYLE] [POSSIBLE_ERROR] [FAIL_ON_WARNINGS]) - | ||||
# Create a target to check a target's sources with cppcheck and the indicated options | ||||
# | ||||
# Requires these CMake modules: | ||||
# Findcppcheck | ||||
# | ||||
# Requires CMake 2.8 or newer | ||||
# | ||||
# Original Author: | ||||
# 2009-2010 Ryan Pavlik <rpavlik@iastate.edu> <abiryan@ryand.net> | ||||
# http://academic.cleardefinition.com | ||||
# Iowa State University HCI Graduate Program/VRAC | ||||
# | ||||
# Copyright Iowa State University 2009-2010. | ||||
# Distributed under the Boost Software License, Version 1.0. | ||||
# (See accompanying file LICENSE_1_0.txt or copy at | ||||
# http://www.boost.org/LICENSE_1_0.txt) | ||||
IF(__add_cppcheck) | ||||
RETURN() | ||||
ENDIF() | ||||
SET(__add_cppcheck YES) | ||||
FIND_PACKAGE(cppcheck) | ||||
IF(NOT TARGET all_cppcheck) | ||||
ADD_CUSTOM_TARGET(all_cppcheck) | ||||
ENDIF() | ||||
FUNCTION(add_test_cppcheck _target_name) | ||||
IF(NOT TARGET ${_target_name}) | ||||
MESSAGE(FATAL_ERROR "add_test_cppcheck given a target name that does not exist: '${_target_name}' !") | ||||
ENDIF() | ||||
SET(cppcheck_args) | ||||
LIST(FIND ARGN UNUSED_FUNCTIONS index) | ||||
IF("${index}" GREATER "-1") | ||||
LIST(APPEND cppcheck_args ${CPPCHECK_UNUSEDFUNC_ARG}) | ||||
ENDIF() | ||||
LIST(FIND ARGN STYLE index) | ||||
IF("${index}" GREATER "-1") | ||||
LIST(APPEND cppcheck_args ${CPPCHECK_STYLE_ARG}) | ||||
ENDIF() | ||||
LIST(FIND ARGN POSSIBLE_ERROR index) | ||||
IF("${index}" GREATER "-1") | ||||
LIST(APPEND cppcheck_args ${CPPCHECK_POSSIBLEERROR_ARG}) | ||||
ENDIF() | ||||
LIST(FIND ARGN MISSING_INCLUDE index) | ||||
IF("${index}" GREATER "-1") | ||||
LIST(APPEND cppcheck_args ${CPPCHECK_MISSINGINCLUDE_ARG}) | ||||
ENDIF() | ||||
LIST(FIND _input FAIL_ON_WARNINGS index) | ||||
IF("${index}" GREATER "-1") | ||||
LIST(APPEND CPPCHECK_FAIL_REGULAR_EXPRESSION ${CPPCHECK_WARN_REGULAR_EXPRESSION}) | ||||
LIST(REMOVE_AT _input ${_unused_func}) | ||||
ENDIF() | ||||
GET_TARGET_PROPERTY(target_sources "${_target_name}" SOURCES) | ||||
SET(cppcheck_sources) | ||||
FOREACH(source ${target_sources}) | ||||
GET_SOURCE_FILE_PROPERTY(path "${source}" LOCATION) | ||||
GET_SOURCE_FILE_PROPERTY(lang "${source}" LANGUAGE) | ||||
IF("${lang}" MATCHES "CXX") | ||||
LIST(APPEND cppcheck_sources "${path}") | ||||
ENDIF() | ||||
IF("${lang}" MATCHES "C") | ||||
LIST(APPEND cppcheck_sources "${path}") | ||||
ENDIF() | ||||
ENDFOREACH() | ||||
GET_TARGET_PROPERTY(target_definitions "${_target_name}" SOURCES) | ||||
GET_TARGET_PROPERTY(target_source_location "${_target_name}" SOURCES) | ||||
SET(test_target_name "${_target_name}_cppcheck_test") | ||||
GET_TARGET_PROPERTY(include_folders "${_target_name}" INCLUDE_DIRECTORIES) | ||||
SET(include_args) | ||||
FOREACH(folder ${include_folders}) | ||||
LIST(APPEND include_args "-I${folder}") | ||||
ENDFOREACH() | ||||
ADD_TEST(NAME "${test_target_name}" | ||||
COMMAND "${CPPCHECK_EXECUTABLE}" | ||||
${CPPCHECK_TEMPLATE_ARG} | ||||
${cppcheck_args} | ||||
${include_args} | ||||
${cppcheck_sources}) | ||||
SET_TESTS_PROPERTIES("${test_target_name}" | ||||
PROPERTIES | ||||
FAIL_REGULAR_EXPRESSION "${CPPCHECK_FAIL_REGULAR_EXPRESSION}") | ||||
ADD_CUSTOM_COMMAND(TARGET all_cppcheck | ||||
PRE_BUILD | ||||
COMMAND "${CPPCHECK_EXECUTABLE}" | ||||
${CPPCHECK_QUIET_ARG} | ||||
${CPPCHECK_TEMPLATE_ARG} | ||||
${cppcheck_args} | ||||
${include_args} | ||||
${cppcheck_sources} | ||||
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" | ||||
COMMENT "${test_target_name}: Running cppcheck on target ${_target_name}..." | ||||
VERBATIM) | ||||
ENDFUNCTION() | ||||