if(CMAKE_EXPORT_COMPILE_COMMANDS) find_program(PVS_STUDIO_ANALYZER_EXE NAMES pvs-studio-analyzer) include(PVS-Studio) else() message(STATUS "MyxCMake: CMAKE_EXPORT_COMPILE_COMMANDS is not set. PVS checks will be disabled.") endif() function(myx_cmake_pvs_studio_analyze target) if(PVS_STUDIO_ANALYZER_EXE) if(NOT TARGET myx-cmake-pvs-studio-analyze) add_custom_target(myx-cmake-pvs-studio-analyze) endif() set(PVS_STUDIO_CONFIG "${CMAKE_BINARY_DIR}/PVS-Studio-${target}.cfg") set(PVS_STUDIO_CONFIG_COMMAND "${CMAKE_COMMAND}" -E echo "sourcetree-root=${CMAKE_SOURCE_DIR}" > "${PVS_STUDIO_CONFIG}") add_custom_command(OUTPUT "${PVS_STUDIO_CONFIG}" COMMAND ${PVS_STUDIO_CONFIG_COMMAND} WORKING_DIRECTORY "${CMAKE_BINARY_DIR}" COMMENT "Generating PVS-Studio.cfg") set(PVS_STUDIO_HEADER "${CMAKE_BINARY_DIR}/include/pvs_studio_suppression_${target}.hpp") file(WRITE ${PVS_STUDIO_HEADER} "#ifndef PVS_STUDIO_HPP_\n" "#define PVS_STUDIO_HPP_\n" "#pragma once\n" "//-V813_MINSIZE=33\n" "#endif // PVS_STUDIO_HPP_\n" ) get_target_property(__sources ${target} SOURCES) list(FILTER __sources EXCLUDE REGEX "qrc_.*\\.cpp$") list(FILTER __sources EXCLUDE REGEX "moc_.*\\.cpp$") list(FILTER __sources EXCLUDE REGEX "ui_.*\\.h$") pvs_studio_add_target( TARGET ${target}-pvs-studio-analyze CONFIG ${PVS_STUDIO_CONFIG} DEPENDS ${PVS_STUDIO_CONFIG} LOG "${CMAKE_BINARY_DIR}/PVS-Studio-${target}.log" SOURCES ${__sources} 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) add_dependencies(myx-cmake-pvs-studio-analyze ${target}-pvs-studio-analyze) 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() else() message(STATUS "MyxCMake: PVS-Studio analyzer is not found") endif() endfunction()