This commit is contained in:
2022-10-06 07:57:47 +03:00
parent 698365f338
commit d31802ed95
18 changed files with 1506 additions and 1 deletions

View File

@ -0,0 +1,14 @@
include_guard(GLOBAL)
if(NOT CLANG_APPLY_REPLACEMENTS_NAME)
set(CLANG_APPLY_REPLACEMENTS_NAMES clang-apply-replacements)
foreach(V RANGE 9 18)
list(INSERT CLANG_APPLY_REPLACEMENTS_NAMES 0 "clang-apply-replacements-${V}")
endforeach()
unset(V)
else()
set(CLANG_APPLY_REPLACEMENTS_NAMES ${CLANG_APPLY_REPLACEMENTS_NAME})
endif()
find_program(CLANG_APPLY_REPLACEMENTS_EXE NAMES ${CLANG_APPLY_REPLACEMENTS_NAMES})
unset(CLANG_APPLY_REPLACEMENTS_NAMES)

View File

@ -0,0 +1,52 @@
include_guard(GLOBAL)
if(NOT CLANG_CHECK_NAME)
set(CLANG_CHECK_NAMES clang-check)
foreach(V RANGE 9 18)
list(INSERT CLANG_CHECK_NAMES 0 "clang-check-${V}")
endforeach()
unset(V)
else()
set(CLANG_CHECK_NAMES ${CLANG_CHECK_NAME})
endif()
find_program(CLANG_CHECK_EXE NAMES ${CLANG_CHECK_NAMES})
unset(CLANG_CHECK_NAMES)
function(myxx_analyze_clang_check target)
if(NOT CLANG_CHECK_EXE)
message(STATUS "MyxCMake: Clang Check analyzer is not found")
return()
endif()
if(TARGET ${target}-analyze-clang-check)
message(STATUS "MyxxCMake: target ${target}-analyze-clang-check already exists")
return()
endif()
set(options FIX)
set(oneValueArgs)
set(multiValueArgs EXTRA_ARGS)
cmake_parse_arguments(ARG "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
set(args --analyze --extra-arg=-Wno-unknown-warning-option ${EXTRA_ARGS})
get_target_property(sources ${target} SOURCES)
foreach(iter ${sources})
string(FIND ${iter} ${CMAKE_BINARY_DIR} pos)
if(pos EQUAL -1)
list(APPEND srcs ${iter})
endif()
endforeach()
if(ARG_FIX)
list(APPEND args "--fixit")
endif()
if(NOT TARGET myxx-analyze-clang-check)
add_custom_target(myxx-analyze-clang-check)
endif()
add_custom_target(${target}-analyze-clang-check
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
COMMAND ${CLANG_CHECK_EXE} ${args} -p ${CMAKE_BINARY_DIR} ${srcs})
add_dependencies(${target}-analyze-clang-check ${target})
add_dependencies(myxx-analyze-clang-check ${target}-analyze-clang-check)
endfunction()

View File

@ -0,0 +1,56 @@
include_guard(GLOBAL)
find_program(CLAZY_EXE NAMES clazy-standalone)
if(CLAZY_EXE AND CLANG_APPLY_REPLACEMENTS_EXE)
option(MYX_CMAKE_CLAZY_FIX "MyxCMake: perform fixes for Clazy" OFF)
endif()
function(myxx_analyze_clazy target)
if(NOT CLAZY_EXE)
message(STATUS "MyxCMake: Clazy standalone analyzer is not found")
return()
endif()
if(TARGET ${target}-analyze-clazy)
message(STATUS "MyxxCMake: target ${target}-analyze-clazy already exists")
return()
endif()
set(options FIX)
set(oneValueArgs CHECKS)
set(multiValueArgs)
cmake_parse_arguments(ARG "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
if(NOT ARG_CHECKS)
set(ARG_CHECKS "level2,container-inside-loop,heap-allocated-small-trivial-type,inefficient-qlist,isempty-vs-count,qt-keywords,unneeded-cast")
endif()
set(args -checks=${ARG_CHECKS}
-extra-arg=-Wno-unknown-warning-option
-export-fixes=clazy-fixes-file.yaml)
get_target_property(sources ${target} SOURCES)
foreach(iter ${sources})
string(FIND ${iter} ${CMAKE_BINARY_DIR} pos)
if(pos EQUAL -1)
list(APPEND srcs ${iter})
endif()
endforeach()
if(NOT TARGET myxx-analyze-clazy)
add_custom_target(myxx-analyze-clazy)
endif()
if(ARG_FIX)
add_custom_target(${target}-analyze-clazy
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
COMMAND ${CLAZY_EXE} ${args} -p ${CMAKE_BINARY_DIR} ${srcs}
COMMAND ${CLANG_APPLY_REPLACEMENTS_EXE} ${CMAKE_BINARY_DIR})
else()
add_custom_target(${target}-analyze-clazy
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
COMMAND ${CLAZY_EXE} ${args} -p ${CMAKE_BINARY_DIR} ${srcs})
endif()
add_dependencies(${target}-analyze-clazy ${target})
add_dependencies(myxx-analyze-clazy ${target}-analyze-clazy)
endfunction()

View File

@ -0,0 +1,54 @@
find_program(PVS_STUDIO_ANALYZER_EXE pvs-studio-analyzer)
find_program(PVS_STUDIO_CONVERTER_EXE plog-converter)
function(myxx_analyze_pvs_studio target)
if(PVS_STUDIO_ANALYZER_EXE)
message(STATUS "MyxxCMake: pvs-studio-analyzer not found.")
return()
endif()
if(PVS_STUDIO_CONVERTER_EXE)
message(STATUS "MyxxCMake: pvs-studio-converter not found.")
return()
endif()
if(TARGET myx-cmake-analyze-pvs-studio)
return()
endif()
set(options)
set(oneValueArgs CHECKS)
set(multiValueArgs)
cmake_parse_arguments(ARG "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
set(PVS_STUDIO_HEADER "${CMAKE_BINARY_DIR}/include/myx_cmake_pvs_studio_header_p.hpp")
file(WRITE ${PVS_STUDIO_HEADER}
"#ifndef MYX_CMAKE_PVS_STUDIO_HEADER_HPP_\n"
"#define MYX_CMAKE_PVS_STUDIO_HEADER_HPP_\n"
"#pragma once\n"
"//-V813_MINSIZE=33\n"
"#endif // MYX_CMAKE_PVS_STUDIO_HEADER_HPP_\n")
pvs_studio_add_target(TARGET myx-cmake-analyze-pvs-studio
LOG
COMPILE_COMMANDS
HIDE_HELP
OUTPUT FORMAT errorfile
ARGS --exclude-path ${CMAKE_CURRENT_BINARY_DIR}/${target}_autogen
MODE GA:1,2,3;64:1;OP:1,2;CS:1,2)
get_target_property(__target_type ${target} TYPE)
if(${__target_type} STREQUAL INTERFACE_LIBRARY)
set(__target_type INTERFACE)
else()
set(__target_type PRIVATE)
endif()
if(MSVC)
target_compile_options(${target} BEFORE ${__target_type} /FI ${PVS_STUDIO_HEADER})
else() # GCC/Clang
target_compile_options(${target} BEFORE ${__target_type} -include ${PVS_STUDIO_HEADER})
endif()
add_dependencies(myx-cmake-analyze-pvs-studio ${target})
get_target_property(__target_source_dir "${target}" SOURCE_DIR)
pvs_studio_analyze_target("${target}" "${__target_source_dir}")
endfunction()

View File

@ -0,0 +1,46 @@
option(MYXX_CODE_COVERAGE "MyxxCMake: enable code coverage" OFF)
if(MYXX_CODE_COVERAGE)
find_program(LCOV_EXE NAMES lcov)
find_program(GENHTML_EXE NAMES genhtml)
endif()
function(myxx_code_coverage target)
if(NOT MYXX_CODE_COVERAGE)
return()
endif()
if(CMAKE_CXX_COMPILER_IS_GCC)
target_compile_options(${target} PUBLIC "--coverage")
set_property(
TARGET ${target}
APPEND_STRING
PROPERTY LINK_FLAGS " --coverage")
endif()
if(CMAKE_CXX_COMPILER_IS_CLANG)
target_compile_options(${target} PUBLIC "-fprofile-instr-generate -fcoverage-mapping")
set_property(
TARGET ${target}
APPEND_STRING
PROPERTY LINK_FLAGS " --coverage")
endif()
if(LCOV_EXE)
add_custom_target(${target}-coverage
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
COMMAND ${LCOV_EXE} --test-name ${target} --output "${target}.lcov" --capture
--no-external
--base-directory ${CMAKE_SOURCE_DIR}
--directory ${CMAKE_BINARY_DIR})
--exclude "/usr/\\\*"
--exclude "${CMAKE_BINARY_DIR}/\\\*"
add_dependencies(${target}-coverage ${target})
if(GENHTML_EXE)
add_custom_target(${target}-coverage-report
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
COMMAND ${GENHTML_EXE} --output-directory "${target}-coverage-html" "${target}.lcov")
add_dependencies(${target}-coverage-report ${target}-coverage)
endif()
endif()
endfunction()