[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