[sword-svn] r3323 - in trunk: . cmake
greg.hellings at crosswire.org
greg.hellings at crosswire.org
Mon Feb 16 15:13:08 MST 2015
Author: greg.hellings
Date: 2015-02-16 15:13:08 -0700 (Mon, 16 Feb 2015)
New Revision: 3323
Added:
trunk/cmake/CppcheckTargets.cmake
trunk/cmake/Findcppcheck.cmake
trunk/cmake/Findcppcheck.cpp
Modified:
trunk/CMakeLists.txt
Log:
Added support for cppcheck
Modified: trunk/CMakeLists.txt
===================================================================
--- trunk/CMakeLists.txt 2015-02-16 21:27:19 UTC (rev 3322)
+++ trunk/CMakeLists.txt 2015-02-16 22:13:08 UTC (rev 3323)
@@ -32,6 +32,8 @@
INCLUDE("${CMAKE_CURRENT_SOURCE_DIR}/cmake/options.cmake")
# Source variables
INCLUDE("${CMAKE_CURRENT_SOURCE_DIR}/cmake/sources.cmake")
+# Cppcheck
+INCLUDE("${CMAKE_CURRENT_SOURCE_DIR}/cmake/CppcheckTargets.cmake")
# Our local includes
INCLUDE_DIRECTORIES("${CMAKE_CURRENT_BINARY_DIR}/include") # For swversion.h
INCLUDE_DIRECTORIES("${CMAKE_CURRENT_SOURCE_DIR}/include") # For everything else
@@ -79,6 +81,8 @@
# I want to do this manually, there might be reason in the future
IF(LIBSWORD_LIBRARY_TYPE MATCHES ".*Shared.*" OR NOT LIBSWORD_LIBRARY_TYPE)
ADD_LIBRARY(sword SHARED ${sword_SOURCES})
+ ADD_CPPCHECK(sword
+ FORCE TRUE)
MESSAGE(STATUS "Building Shared library.")
SET(BUILDING_SHARED 1)
SET(SWORD_LINK_NAME sword)
@@ -86,6 +90,8 @@
IF(LIBSWORD_LIBRARY_TYPE MATCHES ".*Static.*" OR NOT LIBSWORD_LIBRARY_TYPE)
ADD_LIBRARY(sword_static STATIC ${sword_SOURCES})
+ ADD_CPPCHECK(sword_static
+ FORCE TRUE)
SET_TARGET_PROPERTIES(sword_static PROPERTIES COMPILE_FLAGS "-fPIC")
SET(BUILDING_STATIC 1)
# Defaults to linking against the shared if it is also being built
Added: trunk/cmake/CppcheckTargets.cmake
===================================================================
--- trunk/cmake/CppcheckTargets.cmake (rev 0)
+++ trunk/cmake/CppcheckTargets.cmake 2015-02-16 22:13:08 UTC (rev 3323)
@@ -0,0 +1,231 @@
+# - Run cppcheck on c++ source files as a custom target and a test
+#
+# include(CppcheckTargets)
+# add_cppcheck(<target-name> [UNUSED_FUNCTIONS] [STYLE] [POSSIBLE_ERROR] [FORCE] [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] [FORCE] [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 at iastate.edu> <abiryan at 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 FORCE _force)
+ if("${_force}" GREATER "-1")
+ list(APPEND _cppcheck_args "--force")
+ list(REMOVE_AT _input ${_force})
+ 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 ARGN FORCE _force)
+ if("${_force}" GREATER "-1")
+ list(APPEND _cppcheck_args "--force")
+ 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_includes "${_name}" INCLUDE_DIRECTORIES)
+ set(_includes)
+ foreach(_include ${_cppcheck_includes})
+ list(APPEND _includes "-I${_include}")
+ endforeach()
+
+ 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}
+ ${_includes}
+ ${_files}
+ WORKING_DIRECTORY
+ "${CMAKE_CURRENT_SOURCE_DIR}"
+ COMMENT
+ "${_name}_cppcheck: Running cppcheck on target ${_name}..."
+ VERBATIM)
+ endif()
+
+endfunction()
Added: trunk/cmake/Findcppcheck.cmake
===================================================================
--- trunk/cmake/Findcppcheck.cmake (rev 0)
+++ trunk/cmake/Findcppcheck.cmake 2015-02-16 22:13:08 UTC (rev 3323)
@@ -0,0 +1,167 @@
+# - 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 at iastate.edu> <abiryan at 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")
+if(NOT EXISTS "${_cppcheckdummyfile}")
+ message(FATAL_ERROR
+ "Missing file ${_cppcheckdummyfile} - should be alongside Findcppcheck.cmake, can be found at https://github.com/rpavlik/cmake-modules")
+endif()
+
+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=unusedFunction")
+ _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)
Added: trunk/cmake/Findcppcheck.cpp
===================================================================
--- trunk/cmake/Findcppcheck.cpp (rev 0)
+++ trunk/cmake/Findcppcheck.cpp 2015-02-16 22:13:08 UTC (rev 3323)
@@ -0,0 +1,16 @@
+/**
+ * \file Findcppcheck.cpp
+ * \brief Dummy C++ source file used by CMake module Findcppcheck.cmake
+ *
+ * \author
+ * Ryan Pavlik, 2009-2010
+ * <rpavlik at iastate.edu>
+ * http://academic.cleardefinition.com/
+ *
+ */
+
+
+
+int main(int argc, char* argv[]) {
+ return 0;
+}
More information about the sword-cvs
mailing list