Files
openvehicle-api/cppcheck.cmake
tompzf 6ed4b1534e Precommit (#1)
* first commit

* cleanup
2025-11-04 13:28:06 +01:00

147 lines
9.9 KiB
CMake

# CppCheck include file.
# Author: Erik Verhoeven
# Checkj whether
if (CMAKE_ENABLE_CPPCHECK)
# Create a string with platform specific defines
# NOTE: Windows MSVC and GCC as well as Linux GCC are supported. Windows only on x64. Linux on x64 and aarch64 (ARM)
set (CPPCHECK_DEFINES)
if (WIN32)
set (CPPCHECK_DEFINES ${CPPCHECK_DEFINES} _WIN32)
endif()
if (CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
set (CPPCHECK_DEFINES ${CPPCHECK_DEFINES} _MSC_VER=1929 _WIN64)
if (CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64")
set (CPPCHECK_DEFINES ${CPPCHECK_DEFINES} _M_ARM64)
else()
set (CPPCHECK_DEFINES ${CPPCHECK_DEFINES} _M_X64)
endif()
elseif (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
set (CPPCHECK_DEFINES ${CPPCHECK_DEFINES} __GNUC__=15 __GNUC_MINOR___=1 __GNUC_PATCHLEVEL__=0 __linux__ __unix__)
if (CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64")
set (CPPCHECK_DEFINES ${CPPCHECK_DEFINES} __aarch64__)
else()
set (CPPCHECK_DEFINES ${CPPCHECK_DEFINES} __x86_64__)
endif()
if (WIN32)
set (CPPCHECK_DEFINES ${CPPCHECK_DEFINES} __MINGW64__)
else()
set (CPPCHECK_DEFINES ${CPPCHECK_DEFINES} _POSIX_C_SOURCE=200809L)
endif()
else()
message(FATAL_ERROR "Only Windows and Linux are currently supported for x64 and aarch64 platforms using MSVC or GCC.")
endif()
# Convert CPPCHECK_DEFINES (space-separated) to a list
string(REPLACE " " ";" CPPCHECK_DEFINES_LIST "${CPPCHECK_DEFINES}")
# Prefix each define with -D
set(CPPCHECK_ARGS "")
foreach(DEF IN LISTS CPPCHECK_DEFINES_LIST)
list(APPEND CPPCHECK_ARGS "-D${DEF}")
endforeach()
message ("CPPCHECK_ARGS = ${CPPCHECK_ARGS}")
# Use generator expression for target definitions
set(CPPCHECK_TARGET_DEFINES "$<JOIN:$<TARGET_PROPERTY:cppcheck,COMPILE_DEFINITIONS>,;-D>")
# Execute CppCheck
find_program(CPPCHECK_EXECUTABLE NAMES cppcheck)
if (CPPCHECK_EXECUTABLE)
message("CppCheck was found at ${CPPCHECK_EXECUTABLE}...")
# Determine the version of CppCheck
execute_process(
COMMAND "${CPPCHECK_EXECUTABLE}" --version
OUTPUT_VARIABLE CPPCHECK_VERSION_RAW
OUTPUT_STRIP_TRAILING_WHITESPACE
)
# Extract major and minor version
string(REGEX MATCH "([0-9]+)\\.([0-9]+)" CPPCHECK_VERSION "${CPPCHECK_VERSION_RAW}")
string(REGEX REPLACE "([0-9]+)\\.([0-9]+)" "\\1" CPPCHECK_VERSION_MAJOR "${CPPCHECK_VERSION}")
string(REGEX REPLACE "([0-9]+)\\.([0-9]+)" "\\2" CPPCHECK_VERSION_MINOR "${CPPCHECK_VERSION}")
# CppCheck before 2.10 reports a false positive warning of uninitialized member variables when declared as inline static
# const. Furthermore, variables which are initialized, assigned to an object during binding, updated by the object and then
# used, are not identified to have been changed. Suppress the warnings for files using these variables.
if (CPPCHECK_VERSION_MAJOR GREATER 2 OR (CPPCHECK_VERSION_MAJOR EQUAL 2 AND CPPCHECK_VERSION_MINOR LESS 10))
list (APPEND CPPCHECK_ARGS "--suppress=uninitvar:${CMAKE_SOURCE_DIR}/export/support/pointer.inl")
list (APPEND CPPCHECK_ARGS "--suppress=uninitvar:${CMAKE_SOURCE_DIR}/export/support/string.inl")
list (APPEND CPPCHECK_ARGS "--suppress=uninitvar:${CMAKE_SOURCE_DIR}/export/support/sequence.inl")
list (APPEND CPPCHECK_ARGS "--suppress=uninitvar:${CMAKE_SOURCE_DIR}/export/support/mem_access.h")
list (APPEND CPPCHECK_ARGS "--suppress=uninitvar:${CMAKE_SOURCE_DIR}/export/support/serdes.inl")
list (APPEND CPPCHECK_ARGS "--suppress=uninitvar:${CMAKE_SOURCE_DIR}/sdv_services/core/installation_composer.cpp")
list (APPEND CPPCHECK_ARGS "--suppress=uninitvar:${CMAKE_SOURCE_DIR}/export/interfaces/ps/proxystub.cpp")
list (APPEND CPPCHECK_ARGS "--suppress=uninitvar:${CMAKE_SOURCE_DIR}/export/interfaces/ps/module_proxy.cpp")
list (APPEND CPPCHECK_ARGS "--suppress=uninitvar:${CMAKE_SOURCE_DIR}/export/interfaces/ps/app_proxy.cpp")
list (APPEND CPPCHECK_ARGS "--suppress=uninitvar:${CMAKE_SOURCE_DIR}/export/interfaces/ps/com_proxy.cpp")
list (APPEND CPPCHECK_ARGS "--suppress=uninitvar:${CMAKE_SOURCE_DIR}/export/interfaces/ps/core_idl_proxy.cpp")
list (APPEND CPPCHECK_ARGS "--suppress=uninitvar:${CMAKE_SOURCE_DIR}/export/interfaces/ps/config_proxy.cpp")
list (APPEND CPPCHECK_ARGS "--suppress=uninitvar:${CMAKE_SOURCE_DIR}/export/interfaces/ps/core_proxy.cpp")
list (APPEND CPPCHECK_ARGS "--suppress=uninitvar:${CMAKE_SOURCE_DIR}/export/interfaces/ps/timer_proxy.cpp")
list (APPEND CPPCHECK_ARGS "--suppress=uninitvar:${CMAKE_SOURCE_DIR}/export/interfaces/ps/toml_proxy.cpp")
list (APPEND CPPCHECK_ARGS "--suppress=uninitvar:${CMAKE_SOURCE_DIR}/export/interfaces/ps/repository_proxy.cpp")
list (APPEND CPPCHECK_ARGS "--suppress=knownConditionTrueFalse:${CMAKE_SOURCE_DIR}/sdv_executables/sdv_dbc_util/main.cpp")
list (APPEND CPPCHECK_ARGS "--suppress=knownConditionTrueFalse:${CMAKE_SOURCE_DIR}/sdv_executables/sdv_vss_util/main.cpp")
list (APPEND CPPCHECK_ARGS "--suppress=knownConditionTrueFalse:${CMAKE_SOURCE_DIR}/sdv_executables/sdv_core/main.cpp")
list (APPEND CPPCHECK_ARGS "--suppress=knownConditionTrueFalse:${CMAKE_SOURCE_DIR}/sdv_executables/sdv_iso/main.cpp")
list (APPEND CPPCHECK_ARGS "--suppress=knownConditionTrueFalse:${CMAKE_SOURCE_DIR}/sdv_executables/sdv_local_shutdown/main.cpp")
list (APPEND CPPCHECK_ARGS "--suppress=knownConditionTrueFalse:${CMAKE_SOURCE_DIR}/sdv_executables/sdv_trace_mon/main.cpp")
endif()
# Check for version 2.11 to add the exhaustive checking
if (CPPCHECK_VERSION_MAJOR GREATER 2 OR (CPPCHECK_VERSION_MAJOR EQUAL 2 AND CPPCHECK_VERSION_MINOR GREATER_EQUAL 11))
list (APPEND CPPCHECK_ARGS "--check-level=exhaustive") # Do exhaustive checking
list (APPEND CPPCHECK_ARGS "--suppress=missingIncludeSystem") # The system include files might not be accessable at all times and should not be used.
endif()
# Check for version 2.12 to add the checker report
if (CPPCHECK_VERSION_MAJOR GREATER 2 OR (CPPCHECK_VERSION_MAJOR EQUAL 2 AND CPPCHECK_VERSION_MINOR GREATER_EQUAL 12))
list (APPEND CPPCHECK_ARGS "--checkers-report=${CMAKE_BINARY_DIR}/cppcheck-checkers-report.txt")
endif()
# Execute CppCheck
add_custom_target(cppcheck ALL
COMMAND "${CPPCHECK_EXECUTABLE}"
-j8
--enable=all
--quiet
--std=c++17
--language=c++
--project=${CMAKE_BINARY_DIR}/compile_commands.json
--suppress=unmatchedSuppression # Every CppCheck version checks differently and suppressions might not fit for evey version.
--suppress=cppcheckError # Internal errors of CppCheck should not be reported.
--suppress=unusedFunction # In a framework there might be many functions which are not used.
--suppress=useStlAlgorithm # STL doesn't always provide an easier iteration than the raw for loop (readability).
--suppress=noExplicitConstructor # Most constructors use implicit construction.
--suppress=duplInheritedMember # The generated code reuses common function and variable names. Also template specialization does this.
--suppress=dangerousTypeCast:${CMAKE_BINARY_DIR}/_deps/xxhash-src/xxhash.h # Suppress warning in 3rd party library
--suppress=cstyleCast:${CMAKE_BINARY_DIR}/_deps/xxhash-src/xxhash.h # Suppress warning in 3rd party library
--suppress=nullPointerRedundantCheck:${CMAKE_BINARY_DIR}/_deps/xxhash-src/xxhash.h # Suppress warning in 3rd party library
--suppress=nullPointerArithmeticRedundantCheck:${CMAKE_BINARY_DIR}/_deps/xxhash-src/xxhash.h # Suppress warning in 3rd party library
--suppress=shiftNegative:${CMAKE_BINARY_DIR}/_deps/xxhash-src/xxhash.h # Suppress warning in 3rd party library
--suppress=shiftTooManyBits:${CMAKE_BINARY_DIR}/_deps/xxhash-src/xxhash.h # Suppress warning in 3rd party library
--suppress=signConversionCond:${CMAKE_BINARY_DIR}/_deps/xxhash-src/xxhash.h # Suppress warning in 3rd party library
--suppress=uninitDerivedMemberVar:${CMAKE_BINARY_DIR}/_deps/silkit-src/SilKit/include/silkit/services/flexray/FlexrayDatatypes.hpp # Suppress warning in 3rd party library
--suppress=constVariableReference:${CMAKE_BINARY_DIR}/_deps/silkit-src/SilKit/include/silkit/detail/impl/SilKit.ipp # Suppress warning in 3rd party library
--suppress=passedByValue:${CMAKE_BINARY_DIR}/_deps/silkit-src/SilKit/include/silkit/detail/impl/services/lin/LinController.hpp # Suppress warning in 3rd party library
--suppress=passedByValue:${CMAKE_BINARY_DIR}/_deps/silkit-src/SilKit/include/silkit/detail/impl/services/orchestration/LifecycleService.hpp # Suppress warning in 3rd party library
--inline-suppr
--xml
--xml-version=2
${CPPCHECK_ARGS}
2> ${CMAKE_BINARY_DIR}/cppcheck-results.xml
COMMAND echo "cppcheck finished..."
COMMAND echo "See ${CMAKE_BINARY_DIR}/cppcheck-results.xml for results."
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
VERBATIM
DEPENDS dependency_sdv_components
)
else()
message(FATAL_ERROR "CppCheck program was not found...")
endif()
endif()