diff options
-rw-r--r-- | CMakeLists.txt | 2 | ||||
-rw-r--r-- | cmake/modules/FindCppcheck.cmake | 32 | ||||
-rw-r--r-- | cmake/scripts/common/ProjectMacros.cmake | 8 | ||||
-rw-r--r-- | lib/libUPnP/CMakeLists.txt | 1 |
4 files changed, 39 insertions, 4 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index da01c9f2c5..c5cb79d62a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -43,6 +43,7 @@ include(ExternalProject) # general option(VERBOSE "Enable verbose output?" OFF) option(ENABLE_CLANGTIDY "Enable clang-tidy support?" OFF) +option(ENABLE_CPPCHECK "Enable cppcheck support?" OFF) option(ENABLE_DVDCSS "Enable libdvdcss support?" ON) option(ENABLE_UPNP "Enable UPnP support?" ON) option(ENABLE_AIRTUNES "Enable AirTunes support?" ON) @@ -148,6 +149,7 @@ set(optional_deps Alsa CEC ClangFormat ClangTidy + Cppcheck Dav1d DBus Iso9660pp diff --git a/cmake/modules/FindCppcheck.cmake b/cmake/modules/FindCppcheck.cmake new file mode 100644 index 0000000000..d3b6e84e4b --- /dev/null +++ b/cmake/modules/FindCppcheck.cmake @@ -0,0 +1,32 @@ +#.rst: +# FindCppcheck +# ------------ +# Finds cppcheck and sets it up to run along with the compiler for C and CXX. + +find_program(CPPCHECK_EXECUTABLE cppcheck) + +if(CPPCHECK_EXECUTABLE) + execute_process(COMMAND "${CPPCHECK_EXECUTABLE}" --version + OUTPUT_VARIABLE CPPCHECK_VERSION + OUTPUT_STRIP_TRAILING_WHITESPACE) + string(REGEX REPLACE "Cppcheck (.*)" "\\1" CPPCHECK_VERSION "${CPPCHECK_VERSION}") +endif() + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(Cppcheck REQUIRED_VARS CPPCHECK_EXECUTABLE + VERSION_VAR CPPCHECK_VERSION) + +if(CPPCHECK_FOUND) + # CMake < 3.16 treats Objective-C (OBJC) files as C files and Objective-C++ (OBJCXX) files as C++ files, + # but cppcheck doesn't support Objective-C and Objective-C++. + # CMake >= 3.16 added support for Objective-C and Objective-C++ language, + # but doesn't support OBJC and OBJCXX for <LANG>_CLANG_TIDY. + file(WRITE "${CMAKE_BINARY_DIR}/cppcheck" "case \"$@\" in *.m|*.mm) exit 0; esac\nexec \"${CPPCHECK_EXECUTABLE}\" --quiet --relative-paths=\"${CMAKE_SOURCE_DIR}\" \"$@\"\n") + execute_process(COMMAND chmod +x "${CMAKE_BINARY_DIR}/cppcheck") + + # Supports Unix Makefiles and Ninja + set(CMAKE_C_CPPCHECK "${CMAKE_BINARY_DIR}/cppcheck" PARENT_SCOPE) + set(CMAKE_CXX_CPPCHECK "${CMAKE_BINARY_DIR}/cppcheck" PARENT_SCOPE) +endif() + +mark_as_advanced(CPPCHECK_EXECUTABLE) diff --git a/cmake/scripts/common/ProjectMacros.cmake b/cmake/scripts/common/ProjectMacros.cmake index fba5252a9b..67d65b24bd 100644 --- a/cmake/scripts/common/ProjectMacros.cmake +++ b/cmake/scripts/common/ProjectMacros.cmake @@ -77,12 +77,12 @@ endfunction() function(sca_add_tests) find_program(CLANGCHECK_COMMAND clang-check) - find_program(CPPCHECK_COMMAND cppcheck) + find_program(CPPCHECK_EXECUTABLE cppcheck) if(CLANGCHECK_COMMAND AND CMAKE_EXPORT_COMPILE_COMMANDS) configure_file(${PROJECT_SOURCE_DIR}/cmake/scripts/linux/clang-check-test.sh.in ${CORE_BUILD_DIR}/clang-check-test.sh) endif() - if(CPPCHECK_COMMAND) + if(CPPCHECK_EXECUTABLE) configure_file(${PROJECT_SOURCE_DIR}/cmake/scripts/linux/cppcheck-test.sh.in ${CORE_BUILD_DIR}/cppcheck-test.sh) set(CPPCHECK_INCLUDES) @@ -99,9 +99,9 @@ function(sca_add_tests) COMMAND ${CORE_BUILD_DIR}/clang-check-test.sh ${CLANGCHECK_COMMAND} ${src} CONFIGURATIONS analyze clang-check) endif() - if(CPPCHECK_COMMAND) + if(CPPCHECK_EXECUTABLE) add_test(NAME cppcheck+${name} - COMMAND ${CORE_BUILD_DIR}/cppcheck-test.sh ${CPPCHECK_COMMAND} ${src} ${CPPCHECK_INCLUDES} + COMMAND ${CORE_BUILD_DIR}/cppcheck-test.sh ${CPPCHECK_EXECUTABLE} ${src} ${CPPCHECK_INCLUDES} CONFIGURATIONS analyze cppcheck) endif() endif() diff --git a/lib/libUPnP/CMakeLists.txt b/lib/libUPnP/CMakeLists.txt index 7a039fb8ef..92b3732e3f 100644 --- a/lib/libUPnP/CMakeLists.txt +++ b/lib/libUPnP/CMakeLists.txt @@ -121,6 +121,7 @@ if(CORE_SYSTEM_NAME STREQUAL windows OR CORE_SYSTEM_NAME STREQUAL windowsstore) target_include_directories(upnp PRIVATE Neptune/Source/System/Win32) endif() set_target_properties(upnp PROPERTIES CXX_CLANG_TIDY "") +set_target_properties(upnp PROPERTIES CXX_CPPCHECK "") set_target_properties(upnp PROPERTIES FOLDER lib) source_group_by_folder(upnp) set(core_DEPENDS upnp ${core_DEPENDS} CACHE STRING "" FORCE) |