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()