aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLukas Rusak <lorusak@gmail.com>2021-12-31 11:24:16 -0800
committerGitHub <noreply@github.com>2021-12-31 11:24:16 -0800
commit8734320bc1785a6e23efedeb8c2040f5076bc0ce (patch)
tree187e6e957acd37bb60f2d13f799045d5989418b4
parent5b380ce240c1e8f8b29571d5b316a20ecd875647 (diff)
parentb93c915cfd875c6c0cdb53385a7eb19ab02b9bb8 (diff)
Merge pull request #17820 from lrusak/compiler-warnings
[cmake] add targets for cppcheck and clang-tidy
-rw-r--r--CMakeLists.txt6
-rw-r--r--cmake/scripts/common/Macros.cmake4
-rw-r--r--cmake/scripts/common/ProjectMacros.cmake33
-rw-r--r--cmake/scripts/common/StaticAnalysis.cmake41
-rwxr-xr-xcmake/scripts/linux/clang-check-test.sh.in24
-rwxr-xr-xcmake/scripts/linux/cppcheck-test.sh.in28
6 files changed, 43 insertions, 93 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 3abd1b6a63..d0b08b8551 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -274,7 +274,6 @@ add_compile_options(${ARCH_DEFINES} "${SYSTEM_DEFINES}" ${DEP_DEFINES} ${PATH_DE
set(core_DEPENDS "" CACHE STRING "" FORCE)
set(test_archives "" CACHE STRING "" FORCE)
set(test_sources "" CACHE STRING "" FORCE)
-set(sca_sources "" CACHE STRING "" FORCE)
mark_as_advanced(core_DEPENDS)
mark_as_advanced(test_archives)
mark_as_advanced(test_sources)
@@ -405,9 +404,6 @@ if(CORE_HOST_IS_TARGET AND ENABLE_TESTING)
# Enable unit-test related targets
enable_testing()
gtest_add_tests(${APP_NAME_LC}-test "" ${test_sources})
- if(NOT WIN32)
- sca_add_tests()
- endif()
add_custom_target(check ${CMAKE_CTEST_COMMAND} WORKING_DIRECTORY ${PROJECT_BINARY_DIR})
add_dependencies(check ${APP_NAME_LC}-test)
@@ -426,6 +422,8 @@ if(CORE_HOST_IS_TARGET AND ENABLE_TESTING)
-DCMAKE_BINARY_DIR=${CMAKE_BINARY_DIR})
set_target_properties(check-commits PROPERTIES FOLDER "Build Utilities")
+ include(${CMAKE_SOURCE_DIR}/cmake/scripts/common/StaticAnalysis.cmake)
+
# code coverage
if(CMAKE_BUILD_TYPE STREQUAL Coverage)
if(EXISTS ${CMAKE_SOURCE_DIR}/cmake/scripts/${CORE_SYSTEM_NAME}/CodeCoverage.cmake)
diff --git a/cmake/scripts/common/Macros.cmake b/cmake/scripts/common/Macros.cmake
index 27d7d40de7..4bbb03bf95 100644
--- a/cmake/scripts/common/Macros.cmake
+++ b/cmake/scripts/common/Macros.cmake
@@ -93,10 +93,6 @@ function(core_add_library name)
target_sources(lib${APP_NAME_LC} PRIVATE ${FILES})
set(CORE_LIBRARY lib${APP_NAME_LC} PARENT_SCOPE)
endif()
- foreach(src ${SOURCES})
- list(APPEND sca_sources ${CMAKE_CURRENT_SOURCE_DIR}/${src})
- endforeach()
- set(sca_sources ${sca_sources} CACHE STRING "" FORCE)
endfunction()
# Add a test library, and add sources to list for gtest integration macros
diff --git a/cmake/scripts/common/ProjectMacros.cmake b/cmake/scripts/common/ProjectMacros.cmake
index 67920c5f4d..3a1910caa6 100644
--- a/cmake/scripts/common/ProjectMacros.cmake
+++ b/cmake/scripts/common/ProjectMacros.cmake
@@ -75,39 +75,6 @@ function(GTEST_ADD_TESTS executable extra_args)
endforeach()
endfunction()
-function(sca_add_tests)
- find_program(CLANGCHECK_COMMAND clang-check)
- 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_EXECUTABLE)
- configure_file(${PROJECT_SOURCE_DIR}/cmake/scripts/linux/cppcheck-test.sh.in
- ${CORE_BUILD_DIR}/cppcheck-test.sh)
- set(CPPCHECK_INCLUDES)
- foreach(inc ${INCLUDES})
- list(APPEND CPPCHECK_INCLUDES -I ${inc})
- endforeach()
- endif()
- foreach(src ${sca_sources})
- file(RELATIVE_PATH name ${PROJECT_SOURCE_DIR} ${src})
- get_filename_component(EXT ${src} EXT)
- if(EXT STREQUAL .cpp)
- if(CLANGCHECK_COMMAND AND CMAKE_EXPORT_COMPILE_COMMANDS)
- add_test(NAME clang-check+${name}
- COMMAND ${CORE_BUILD_DIR}/clang-check-test.sh ${CLANGCHECK_COMMAND} ${src}
- CONFIGURATIONS analyze clang-check)
- endif()
- if(CPPCHECK_EXECUTABLE)
- add_test(NAME cppcheck+${name}
- COMMAND ${CORE_BUILD_DIR}/cppcheck-test.sh ${CPPCHECK_EXECUTABLE} ${src} ${CPPCHECK_INCLUDES}
- CONFIGURATIONS analyze cppcheck)
- endif()
- endif()
- endforeach()
-endfunction()
-
function(whole_archive output)
if(CMAKE_CXX_COMPILER_ID STREQUAL GNU OR CMAKE_CXX_COMPILER_ID STREQUAL Clang)
set(${output} -Wl,--whole-archive ${ARGN} -Wl,--no-whole-archive PARENT_SCOPE)
diff --git a/cmake/scripts/common/StaticAnalysis.cmake b/cmake/scripts/common/StaticAnalysis.cmake
new file mode 100644
index 0000000000..c776961ac8
--- /dev/null
+++ b/cmake/scripts/common/StaticAnalysis.cmake
@@ -0,0 +1,41 @@
+include(ProcessorCount)
+ProcessorCount(CPU_CORES)
+
+find_program(CPPCHECK_EXECUTABLE cppcheck)
+
+if(CPPCHECK_EXECUTABLE)
+ add_custom_target(analyze-cppcheck
+ DEPENDS ${APP_NAME_LC} ${APP_NAME_LC}-test
+ COMMAND ${CPPCHECK_EXECUTABLE}
+ --template="${CMAKE_SOURCE_DIR}/xbmc/\{file\}\(\{line\}\)\: \{severity\} \(\{id\}\): \{message\}"
+ -j${CPU_CORES}
+ --project=${CMAKE_BINARY_DIR}/compile_commands.json
+ --std=c++${CMAKE_CXX_STANDARD}
+ --enable=all
+ --verbose
+ --quiet
+ --xml
+ --xml-version=2
+ --language=c++
+ --output-file=${CMAKE_BINARY_DIR}/cppcheck-result.xml
+ xbmc
+ WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
+ COMMENT "Static code analysis using cppcheck")
+endif()
+
+find_program(CLANG_TIDY_EXECUTABLE NAMES clang-tidy)
+find_program(RUN_CLANG_TIDY NAMES run-clang-tidy.py run-clang-tidy
+ PATHS /usr/share/clang /usr/bin)
+
+if(RUN_CLANG_TIDY AND CLANG_TIDY_EXECUTABLE)
+ add_custom_target(analyze-clang-tidy
+ DEPENDS ${APP_NAME_LC} ${APP_NAME_LC}-test
+ COMMAND ${RUN_CLANG_TIDY}
+ -j${CPU_CORES}
+ -clang-tidy-binary=${CLANG_TIDY_EXECUTABLE}
+ -p=${CMAKE_BINARY_DIR}
+ -header-filter='${CMAKE_BINARY_DIR}/.*/include/.*'
+ | tee ${CMAKE_BINARY_DIR}/clangtidy-result.xml
+ WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
+ COMMENT "Static code analysis using clang-tidy")
+endif()
diff --git a/cmake/scripts/linux/clang-check-test.sh.in b/cmake/scripts/linux/clang-check-test.sh.in
deleted file mode 100755
index 12e9a0e62d..0000000000
--- a/cmake/scripts/linux/clang-check-test.sh.in
+++ /dev/null
@@ -1,24 +0,0 @@
-#!/bin/bash
-
-# This script performs a single analysis using clang-check
-# It is used by the 'make test' target in the buildsystems
-# Usually you should use 'ctest -C clang-check' rather than calling this script directly
-#
-# Parameters: $1 = Application binary
-# $2 = Source file to process
-
-clangcheck_cmd=$1
-source_file=$2
-
-tmpfil=`mktemp`
-$clangcheck_cmd -p @CMAKE_BINARY_DIR@ -analyze $source_file &> $tmpfil
-nerr=`cat $tmpfil | grep -v "warning: .*: 'linker' input unused" | wc -l`
-if test $nerr -gt 0
-then
- cat $tmpfil
- rm $tmpfil
- exit 1
-fi
-
-rm $tmpfil
-exit 0
diff --git a/cmake/scripts/linux/cppcheck-test.sh.in b/cmake/scripts/linux/cppcheck-test.sh.in
deleted file mode 100755
index 08cb672636..0000000000
--- a/cmake/scripts/linux/cppcheck-test.sh.in
+++ /dev/null
@@ -1,28 +0,0 @@
-#!/bin/bash
-
-# This script performs a single analysis using cppcheck
-# It is used by the 'make test' target in the buildsystems
-# Usually you should use 'ctest -C cppcheck' rather than calling this script directly
-#
-# Parameters: $1 = Application binary
-# $2 = Source file to process
-# $3..$N = include path parameters (-I dir1 -I dir2 ...)
-
-cppcheck_cmd=$1
-source_file=$2
-shift 2
-
-tmpfil=`mktemp`
-$cppcheck_cmd $@ --force --enable=all --suppress=unusedFunction $source_file &> $tmpfil
-nmatch=`cat $tmpfil | grep "\[.*\]" | wc -l`
-nnone=`cat $tmpfil | grep "\[\\*]" | wc -l`
-let "nval=$nmatch-$nnone"
-if test $nval -gt 0
-then
- cat $tmpfil
- rm $tmpfil
- exit 1
-fi
-
-rm $tmpfil
-exit 0