From 24811d11b5e1524706ffced889ec831a49e6ccd8 Mon Sep 17 00:00:00 2001 From: msclock Date: Tue, 21 May 2024 21:02:04 +0800 Subject: [PATCH] feat: add clang-tidy for static analysis (#108) Signed-off-by: msclock --- cmake/build/ClangTidy.cmake | 63 +++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 cmake/build/ClangTidy.cmake diff --git a/cmake/build/ClangTidy.cmake b/cmake/build/ClangTidy.cmake new file mode 100644 index 0000000..8b503bd --- /dev/null +++ b/cmake/build/ClangTidy.cmake @@ -0,0 +1,63 @@ +#[[ +Configure clang-tidy for static analysis when compiling a C++ project. +]] + +include_guard(GLOBAL) + +set(USE_CLANGTIDY + ON + CACHE BOOL "Use clang-tidy for static analysis of C++ code") + +set(USE_CLANGTIDY_OPTIONS + -extra-arg=-Wno-unknown-warning-option + -extra-arg=-Wno-ignored-optimization-argument + -extra-arg=-Wno-unused-command-line-argument -p ${CMAKE_BINARY_DIR}) + +set(USE_CLANGTIDY_WARNINGS_AS_ERRORS + OFF + CACHE BOOL "Treat cppcheck warnings as errors") + +message( + STATUS + "Use Clang-tidy with USE_CLANGTIDY: ${USE_CLANGTIDY} + Clang-tidy Options: + USE_CLANGTIDY: If use clang-tidy. Default is ON. + USE_CLANGTIDY_OPTIONS: clang-tidy run options. Default is ${USE_CLANGTIDY_OPTIONS} + USE_CLANGTIDY_WARNINGS_AS_ERRORS: If treat warnings as errors. Default is OFF." +) + +if(NOT USE_CLANGTIDY) + message(STATUS "Disable clang-tidy by USE_CLANGTIDY evaluates to false") + return() +endif() + +find_program( + CLANGTIDY_COMMAND + NAMES clang-tidy + DOC "Path to clang-tidy executable") + +if(NOT CLANGTIDY_COMMAND) + message(WARNING "No clang-tidy found, disabling clang-tidy analysis") + return() +endif() + +set(CMAKE_CXX_CLANG_TIDY ${CLANGTIDY_COMMAND} ${USE_CLANGTIDY_OPTIONS}) + +# Add the standard to the clang-tidy options +if(NOT "${CMAKE_CXX_STANDARD}" STREQUAL "") + if("${USE_CLANGTIDY_OPTIONS_DRIVER_MODE}" STREQUAL "cl") + set(CLANG_TIDY_STANDARD_BY_DRIVER -extra-arg=/std:c++${CMAKE_CXX_STANDARD}) + else() + set(CLANG_TIDY_STANDARD_BY_DRIVER -extra-arg=-std=c++${CMAKE_CXX_STANDARD}) + endif() + + list(APPEND CMAKE_CXX_CLANG_TIDY ${CLANG_TIDY_STANDARD_BY_DRIVER}) + unset(CLANG_TIDY_STANDARD_BY_DRIVER) +endif() + +if(USE_CLANGTIDY_WARNINGS_AS_ERRORS) + list(APPEND CMAKE_CXX_CLANG_TIDY -warnings-as-errors=*) +endif() + +list(REMOVE_DUPLICATES CMAKE_CXX_CLANG_TIDY) +message(STATUS "Clang-tidy final command: ${CMAKE_CXX_CLANG_TIDY}")