Mercurial > trustbridge
diff cmake/GenerateCppcheck.cmake @ 1:524cd4908656
Build infrastructure
Add hardening flags
Add static_check target for flawfinder and cppcheck
author | Andre Heinecke <aheinecke@intevation.de> |
---|---|
date | Mon, 10 Feb 2014 16:14:55 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cmake/GenerateCppcheck.cmake Mon Feb 10 16:14:55 2014 +0000 @@ -0,0 +1,141 @@ +# - Generate a cppcheck documentation for a project. +# The function GENERATE_CPPCHECK is provided to create a "cppcheck" target that +# performs static code analysis using the cppcheck utility program. +# +# GENERATE_CPPCHECK(SOURCES <sources to check...> +# [SUPPRESSION_FILE <file>] +# [ENABLE_IDS <id...>] +# [TARGET_NAME <name>] +# [INCLUDES <dir...>]) +# +# Generates a target "cppcheck" that executes cppcheck on the specified sources. +# Sources may either be file names or directories containing files where all +# C++ files will be parsed automatically. Use directories whenever possible +# because there is a limitation in arguments to pass to the cppcheck binary. +# SUPPRESSION_FILE may be give additionally to specify suppressions for# +# cppcheck. The sources mentioned in the suppression file must be in the same +# format like given for SOURCES. This means if you specified them relative to +# CMAKE_CURRENT_SOURCE_DIR, then the same relative paths must be used in the +# suppression file. +# ENABLE_IDS allows to specify which additional cppcheck check ids to execute, +# e.g. all or style. They are combined with AND. +# With TARGET_NAME a different name for the generated check target can be +# specified. This is useful if several calles to this function are made in one +# CMake project, as otherwise the target names collide. +# Additional include directories for the cppcheck program can be given with +# INCLUDES. +# +# cppcheck will be executed with CMAKE_CURRENT_SOURCE_DIR as working directory. +# +# This function can always be called, even if no cppcheck was found. Then no +# target is created. +# +# Copyright (C) 2011 by Johannes Wienke <jwienke at techfak dot uni-bielefeld dot de> +# +# This program is free software; you can redistribute it +# and/or modify it under the terms of the GNU General +# Public License as published by the Free Software Foundation; +# either version 2, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# + +GET_FILENAME_COMPONENT(GENERATE_CPPCHECK_MODULE_DIR ${CMAKE_CURRENT_LIST_FILE} PATH) + +# FIND_PACKAGE(Cppcheck) +find_program(CPPCHECK_EXECUTABLE +cppcheck +) + +if(CPPCHECK_EXECUTABLE) + set(CPPCHECK_FOUND True) +endif() + +include(ParseArguments) + +FUNCTION(GENERATE_CPPCHECK) + + IF(CPPCHECK_FOUND) + + PARSE_ARGUMENTS(ARG "SOURCES;SUPPRESSION_FILE;ENABLE_IDS;TARGET_NAME;INCLUDES" "" ${ARGN}) + + SET(TARGET_NAME "cppcheck") + SET(TARGET_NAME_SUFFIX "") + # parse target name + LIST(LENGTH ARG_TARGET_NAME TARGET_NAME_LENGTH) + IF(${TARGET_NAME_LENGTH} EQUAL 1) + SET(TARGET_NAME ${ARG_TARGET_NAME}) + SET(TARGET_NAME_SUFFIX "-${ARG_TARGET_NAME}") + ENDIF() + + SET(CPPCHECK_CHECKFILE "${CMAKE_BINARY_DIR}/cppcheck-files${TARGET_NAME_SUFFIX}") + SET(CPPCHECK_REPORT_FILE "${CMAKE_BINARY_DIR}/cppcheck-report${TARGET_NAME_SUFFIX}.xml") + SET(CPPCHECK_WRAPPER_SCRIPT "${CMAKE_BINARY_DIR}/cppcheck${TARGET_NAME_SUFFIX}.cmake") + + # write a list file containing all sources to check for the call to + # cppcheck + SET(SOURCE_ARGS "") + FOREACH(SOURCE ${ARG_SOURCES}) + SET(SOURCE_ARGS "${SOURCE_ARGS} \"${SOURCE}\"") + ENDFOREACH() + + # prepare a cmake wrapper to write the stderr output of cppcheck to + # the result file + + # suppression argument + LIST(LENGTH ARG_SUPPRESSION_FILE SUPPRESSION_FILE_LENGTH) + IF(${SUPPRESSION_FILE_LENGTH} EQUAL 1) + GET_FILENAME_COMPONENT(ABS "${ARG_SUPPRESSION_FILE}" ABSOLUTE) + MESSAGE(STATUS "Using suppression file ${ABS}") + SET(SUPPRESSION_ARGUMENT --suppressions) + SET(SUPPRESSION_FILE "\"${ABS}\"") + ENDIF() + + # includes + SET(INCLUDE_ARGUMENTS "") + FOREACH(INCLUDE ${ARG_INCLUDES}) + SET(INCLUDE_ARGUMENTS "${INCLUDE_ARGUMENTS} \"-I${INCLUDE}\"") + ENDFOREACH() + + # enabled ids + SET(ID_LIST "") + FOREACH(ID ${ARG_ENABLE_IDS}) + SET(ID_LIST "${ID_LIST},${ID}") + ENDFOREACH() + IF(ID_LIST) + STRING(LENGTH ${ID_LIST} LIST_LENGTH) + MATH(EXPR FINAL_LIST_LENGTH "${LIST_LENGTH} - 1") + STRING(SUBSTRING ${ID_LIST} 1 ${FINAL_LIST_LENGTH} FINAL_ID_LIST) + SET(IDS_ARGUMENT "\"--enable=${FINAL_ID_LIST}\"") + ELSE() + SET(IDS_ARGUMENT "") + ENDIF() + + FILE(WRITE ${CPPCHECK_WRAPPER_SCRIPT} +" +EXECUTE_PROCESS(COMMAND \"${CPPCHECK_EXECUTABLE}\" ${INCLUDE_ARGUMENTS} ${SUPPRESSION_ARGUMENT} ${SUPPRESSION_FILE} ${IDS_ARGUMENT} --inline-suppr --xml ${SOURCE_ARGS} + RESULT_VARIABLE CPPCHECK_EXIT_CODE + ERROR_VARIABLE ERROR_OUT + WORKING_DIRECTORY \"${CMAKE_CURRENT_SOURCE_DIR}\") +IF(NOT CPPCHECK_EXIT_CODE EQUAL 0) + MESSAGE(FATAL_ERROR \"Error executing cppcheck for target ${TARGET}, return code: \${CPPCHECK_EXIT_CODE}\") +ENDIF() +IF(ERROR_OUT) + MESSAGE(\"Detected errors:\\n\${ERROR_OUT}\") +ENDIF() +FILE(WRITE \"${CPPCHECK_REPORT_FILE}\" \"\${ERROR_OUT}\") +" + ) + + ADD_CUSTOM_TARGET(${TARGET_NAME} ${CMAKE_COMMAND} -P "${CPPCHECK_WRAPPER_SCRIPT}" + COMMENT "Generating cppcheck result ${TARGET_NAME}") + + MESSAGE(STATUS "Generating cppcheck target with name ${TARGET_NAME}") + + ENDIF() + +ENDFUNCTION()