-
Notifications
You must be signed in to change notification settings - Fork 122
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
These are taken, verbatim from http://github.com/rpavlik/cmake-modules
- Loading branch information
1 parent
e0376f3
commit 4c5b38b
Showing
2 changed files
with
373 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,213 @@ | ||
# - Run cppcheck on c++ source files as a custom target and a test | ||
# | ||
# include(CppcheckTargets) | ||
# add_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 | ||
# add_cppcheck_sources(<target-name> [UNUSED_FUNCTIONS] [STYLE] [POSSIBLE_ERROR] [FAIL_ON_WARNINGS]) - | ||
# Create a target to check standalone sources with cppcheck and the indicated options | ||
# | ||
# Requires these CMake modules: | ||
# Findcppcheck | ||
# | ||
# Requires CMake 2.6 or newer (uses the 'function' command) | ||
# | ||
# 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) | ||
|
||
if(NOT CPPCHECK_FOUND) | ||
find_package(cppcheck QUIET) | ||
endif() | ||
|
||
if(CPPCHECK_FOUND) | ||
if(NOT TARGET all_cppcheck) | ||
add_custom_target(all_cppcheck) | ||
set_target_properties(all_cppcheck PROPERTIES EXCLUDE_FROM_ALL TRUE) | ||
endif() | ||
endif() | ||
|
||
function(add_cppcheck_sources _targetname) | ||
if(CPPCHECK_FOUND) | ||
set(_cppcheck_args) | ||
set(_input ${ARGN}) | ||
list(FIND _input UNUSED_FUNCTIONS _unused_func) | ||
if("${_unused_func}" GREATER "-1") | ||
list(APPEND _cppcheck_args ${CPPCHECK_UNUSEDFUNC_ARG}) | ||
list(REMOVE_AT _input ${_unused_func}) | ||
endif() | ||
|
||
list(FIND _input STYLE _style) | ||
if("${_style}" GREATER "-1") | ||
list(APPEND _cppcheck_args ${CPPCHECK_STYLE_ARG}) | ||
list(REMOVE_AT _input ${_style}) | ||
endif() | ||
|
||
list(FIND _input POSSIBLE_ERROR _poss_err) | ||
if("${_poss_err}" GREATER "-1") | ||
list(APPEND _cppcheck_args ${CPPCHECK_POSSIBLEERROR_ARG}) | ||
list(REMOVE_AT _input ${_poss_err}) | ||
endif() | ||
|
||
list(FIND _input FAIL_ON_WARNINGS _fail_on_warn) | ||
if("${_fail_on_warn}" GREATER "-1") | ||
list(APPEND | ||
CPPCHECK_FAIL_REGULAR_EXPRESSION | ||
${CPPCHECK_WARN_REGULAR_EXPRESSION}) | ||
list(REMOVE_AT _input ${_fail_on_warn}) | ||
endif() | ||
|
||
set(_files) | ||
foreach(_source ${_input}) | ||
get_source_file_property(_cppcheck_loc "${_source}" LOCATION) | ||
if(_cppcheck_loc) | ||
# This file has a source file property, carry on. | ||
get_source_file_property(_cppcheck_lang "${_source}" LANGUAGE) | ||
if("${_cppcheck_lang}" MATCHES "CXX") | ||
list(APPEND _files "${_cppcheck_loc}") | ||
endif() | ||
else() | ||
# This file doesn't have source file properties - figure it out. | ||
get_filename_component(_cppcheck_loc "${_source}" ABSOLUTE) | ||
if(EXISTS "${_cppcheck_loc}") | ||
list(APPEND _files "${_cppcheck_loc}") | ||
else() | ||
message(FATAL_ERROR | ||
"Adding CPPCHECK for file target ${_targetname}: " | ||
"File ${_source} does not exist or needs a corrected path location " | ||
"since we think its absolute path is ${_cppcheck_loc}") | ||
endif() | ||
endif() | ||
endforeach() | ||
|
||
if("1.${CMAKE_VERSION}" VERSION_LESS "1.2.8.0") | ||
# Older than CMake 2.8.0 | ||
add_test(${_targetname}_cppcheck_test | ||
"${CPPCHECK_EXECUTABLE}" | ||
${CPPCHECK_TEMPLATE_ARG} | ||
${_cppcheck_args} | ||
${_files}) | ||
else() | ||
# CMake 2.8.0 and newer | ||
add_test(NAME | ||
${_targetname}_cppcheck_test | ||
COMMAND | ||
"${CPPCHECK_EXECUTABLE}" | ||
${CPPCHECK_TEMPLATE_ARG} | ||
${_cppcheck_args} | ||
${_files}) | ||
endif() | ||
|
||
set_tests_properties(${_targetname}_cppcheck_test | ||
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} | ||
${_files} | ||
WORKING_DIRECTORY | ||
"${CMAKE_CURRENT_SOURCE_DIR}" | ||
COMMENT | ||
"${_targetname}_cppcheck: Running cppcheck on target ${_targetname}..." | ||
VERBATIM) | ||
endif() | ||
endfunction() | ||
|
||
function(add_cppcheck _name) | ||
if(NOT TARGET ${_name}) | ||
message(FATAL_ERROR | ||
"add_cppcheck given a target name that does not exist: '${_name}' !") | ||
endif() | ||
if(CPPCHECK_FOUND) | ||
set(_cppcheck_args) | ||
|
||
list(FIND ARGN UNUSED_FUNCTIONS _unused_func) | ||
if("${_unused_func}" GREATER "-1") | ||
list(APPEND _cppcheck_args ${CPPCHECK_UNUSEDFUNC_ARG}) | ||
endif() | ||
|
||
list(FIND ARGN STYLE _style) | ||
if("${_style}" GREATER "-1") | ||
list(APPEND _cppcheck_args ${CPPCHECK_STYLE_ARG}) | ||
endif() | ||
|
||
list(FIND ARGN POSSIBLE_ERROR _poss_err) | ||
if("${_poss_err}" GREATER "-1") | ||
list(APPEND _cppcheck_args ${CPPCHECK_POSSIBLEERROR_ARG}) | ||
endif() | ||
|
||
list(FIND _input FAIL_ON_WARNINGS _fail_on_warn) | ||
if("${_fail_on_warn}" GREATER "-1") | ||
list(APPEND | ||
CPPCHECK_FAIL_REGULAR_EXPRESSION | ||
${CPPCHECK_WARN_REGULAR_EXPRESSION}) | ||
list(REMOVE_AT _input ${_unused_func}) | ||
endif() | ||
|
||
get_target_property(_cppcheck_sources "${_name}" SOURCES) | ||
set(_files) | ||
foreach(_source ${_cppcheck_sources}) | ||
get_source_file_property(_cppcheck_lang "${_source}" LANGUAGE) | ||
get_source_file_property(_cppcheck_loc "${_source}" LOCATION) | ||
if("${_cppcheck_lang}" MATCHES "CXX") | ||
list(APPEND _files "${_cppcheck_loc}") | ||
endif() | ||
endforeach() | ||
|
||
if("1.${CMAKE_VERSION}" VERSION_LESS "1.2.8.0") | ||
# Older than CMake 2.8.0 | ||
add_test(${_name}_cppcheck_test | ||
"${CPPCHECK_EXECUTABLE}" | ||
${CPPCHECK_TEMPLATE_ARG} | ||
${_cppcheck_args} | ||
${_files}) | ||
else() | ||
# CMake 2.8.0 and newer | ||
add_test(NAME | ||
${_name}_cppcheck_test | ||
COMMAND | ||
"${CPPCHECK_EXECUTABLE}" | ||
${CPPCHECK_TEMPLATE_ARG} | ||
${_cppcheck_args} | ||
${_files}) | ||
endif() | ||
|
||
set_tests_properties(${_name}_cppcheck_test | ||
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} | ||
${_files} | ||
WORKING_DIRECTORY | ||
"${CMAKE_CURRENT_SOURCE_DIR}" | ||
COMMENT | ||
"${_name}_cppcheck: Running cppcheck on target ${_name}..." | ||
VERBATIM) | ||
endif() | ||
|
||
endfunction() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,160 @@ | ||
# - try to find cppcheck tool | ||
# | ||
# Cache Variables: | ||
# CPPCHECK_EXECUTABLE | ||
# | ||
# Non-cache variables you might use in your CMakeLists.txt: | ||
# CPPCHECK_FOUND | ||
# CPPCHECK_POSSIBLEERROR_ARG | ||
# CPPCHECK_UNUSEDFUNC_ARG | ||
# CPPCHECK_STYLE_ARG | ||
# CPPCHECK_QUIET_ARG | ||
# CPPCHECK_INCLUDEPATH_ARG | ||
# CPPCHECK_FAIL_REGULAR_EXPRESSION | ||
# CPPCHECK_WARN_REGULAR_EXPRESSION | ||
# CPPCHECK_MARK_AS_ADVANCED - whether to mark our vars as advanced even | ||
# if we don't find this program. | ||
# | ||
# Requires these CMake modules: | ||
# FindPackageHandleStandardArgs (known included with CMake >=2.6.2) | ||
# | ||
# 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) | ||
|
||
file(TO_CMAKE_PATH "${CPPCHECK_ROOT_DIR}" CPPCHECK_ROOT_DIR) | ||
set(CPPCHECK_ROOT_DIR | ||
"${CPPCHECK_ROOT_DIR}" | ||
CACHE | ||
PATH | ||
"Path to search for cppcheck") | ||
|
||
# cppcheck app bundles on Mac OS X are GUI, we want command line only | ||
set(_oldappbundlesetting ${CMAKE_FIND_APPBUNDLE}) | ||
set(CMAKE_FIND_APPBUNDLE NEVER) | ||
|
||
if(CPPCHECK_EXECUTABLE AND NOT EXISTS "${CPPCHECK_EXECUTABLE}") | ||
set(CPPCHECK_EXECUTABLE "notfound" CACHE PATH FORCE "") | ||
endif() | ||
|
||
# If we have a custom path, look there first. | ||
if(CPPCHECK_ROOT_DIR) | ||
find_program(CPPCHECK_EXECUTABLE | ||
NAMES | ||
cppcheck | ||
cli | ||
PATHS | ||
"${CPPCHECK_ROOT_DIR}" | ||
PATH_SUFFIXES | ||
cli | ||
NO_DEFAULT_PATH) | ||
endif() | ||
|
||
find_program(CPPCHECK_EXECUTABLE NAMES cppcheck) | ||
|
||
# Restore original setting for appbundle finding | ||
set(CMAKE_FIND_APPBUNDLE ${_oldappbundlesetting}) | ||
|
||
# Find out where our test file is | ||
get_filename_component(_cppcheckmoddir ${CMAKE_CURRENT_LIST_FILE} PATH) | ||
set(_cppcheckdummyfile "${_cppcheckmoddir}/Findcppcheck.cpp") | ||
|
||
function(_cppcheck_test_arg _resultvar _arg) | ||
if(NOT CPPCHECK_EXECUTABLE) | ||
set(${_resultvar} NO) | ||
return() | ||
endif() | ||
execute_process(COMMAND | ||
"${CPPCHECK_EXECUTABLE}" | ||
"${_arg}" | ||
"--quiet" | ||
"${_cppcheckdummyfile}" | ||
RESULT_VARIABLE | ||
_cppcheck_result | ||
OUTPUT_QUIET | ||
ERROR_QUIET) | ||
if("${_cppcheck_result}" EQUAL 0) | ||
set(${_resultvar} YES PARENT_SCOPE) | ||
else() | ||
set(${_resultvar} NO PARENT_SCOPE) | ||
endif() | ||
endfunction() | ||
|
||
function(_cppcheck_set_arg_var _argvar _arg) | ||
if("${${_argvar}}" STREQUAL "") | ||
_cppcheck_test_arg(_cppcheck_arg "${_arg}") | ||
if(_cppcheck_arg) | ||
set(${_argvar} "${_arg}" PARENT_SCOPE) | ||
endif() | ||
endif() | ||
endfunction() | ||
|
||
if(CPPCHECK_EXECUTABLE) | ||
|
||
# Check for the two types of command line arguments by just trying them | ||
_cppcheck_set_arg_var(CPPCHECK_STYLE_ARG "--enable=style") | ||
_cppcheck_set_arg_var(CPPCHECK_STYLE_ARG "--style") | ||
if("${CPPCHECK_STYLE_ARG}" STREQUAL "--enable=style") | ||
|
||
_cppcheck_set_arg_var(CPPCHECK_UNUSEDFUNC_ARG "--enable=unusedFunctions") | ||
_cppcheck_set_arg_var(CPPCHECK_INFORMATION_ARG "--enable=information") | ||
_cppcheck_set_arg_var(CPPCHECK_MISSINGINCLUDE_ARG "--enable=missingInclude") | ||
_cppcheck_set_arg_var(CPPCHECK_POSIX_ARG "--enable=posix") | ||
_cppcheck_set_arg_var(CPPCHECK_POSSIBLEERROR_ARG "--enable=possibleError") | ||
_cppcheck_set_arg_var(CPPCHECK_POSSIBLEERROR_ARG "--enable=all") | ||
|
||
if(MSVC) | ||
set(CPPCHECK_TEMPLATE_ARG --template vs) | ||
set(CPPCHECK_FAIL_REGULAR_EXPRESSION "[(]error[)]") | ||
set(CPPCHECK_WARN_REGULAR_EXPRESSION "[(]style[)]") | ||
elseif(CMAKE_COMPILER_IS_GNUCXX) | ||
set(CPPCHECK_TEMPLATE_ARG --template gcc) | ||
set(CPPCHECK_FAIL_REGULAR_EXPRESSION " error: ") | ||
set(CPPCHECK_WARN_REGULAR_EXPRESSION " style: ") | ||
else() | ||
set(CPPCHECK_TEMPLATE_ARG --template gcc) | ||
set(CPPCHECK_FAIL_REGULAR_EXPRESSION " error: ") | ||
set(CPPCHECK_WARN_REGULAR_EXPRESSION " style: ") | ||
endif() | ||
elseif("${CPPCHECK_STYLE_ARG}" STREQUAL "--style") | ||
# Old arguments | ||
_cppcheck_set_arg_var(CPPCHECK_UNUSEDFUNC_ARG "--unused-functions") | ||
_cppcheck_set_arg_var(CPPCHECK_POSSIBLEERROR_ARG "--all") | ||
set(CPPCHECK_FAIL_REGULAR_EXPRESSION "error:") | ||
set(CPPCHECK_WARN_REGULAR_EXPRESSION "[(]style[)]") | ||
else() | ||
# No idea - some other issue must be getting in the way | ||
message(STATUS | ||
"WARNING: Can't detect whether CPPCHECK wants new or old-style arguments!") | ||
endif() | ||
|
||
set(CPPCHECK_QUIET_ARG "--quiet") | ||
set(CPPCHECK_INCLUDEPATH_ARG "-I") | ||
|
||
endif() | ||
|
||
set(CPPCHECK_ALL | ||
"${CPPCHECK_EXECUTABLE} ${CPPCHECK_POSSIBLEERROR_ARG} ${CPPCHECK_UNUSEDFUNC_ARG} ${CPPCHECK_STYLE_ARG} ${CPPCHECK_QUIET_ARG} ${CPPCHECK_INCLUDEPATH_ARG} some/include/path") | ||
|
||
include(FindPackageHandleStandardArgs) | ||
find_package_handle_standard_args(cppcheck | ||
DEFAULT_MSG | ||
CPPCHECK_ALL | ||
CPPCHECK_EXECUTABLE | ||
CPPCHECK_POSSIBLEERROR_ARG | ||
CPPCHECK_UNUSEDFUNC_ARG | ||
CPPCHECK_STYLE_ARG | ||
CPPCHECK_INCLUDEPATH_ARG | ||
CPPCHECK_QUIET_ARG) | ||
|
||
if(CPPCHECK_FOUND OR CPPCHECK_MARK_AS_ADVANCED) | ||
mark_as_advanced(CPPCHECK_ROOT_DIR) | ||
endif() | ||
|
||
mark_as_advanced(CPPCHECK_EXECUTABLE) |