From 3b9e0373b5a81f439661a21511b17579aacf0275 Mon Sep 17 00:00:00 2001 From: Andrey Astafyev Date: Mon, 8 Apr 2024 22:33:09 +0300 Subject: [PATCH] PVS-Studio --- MyxxCMake/lib/pvs-studio/PVS-Studio.cmake | 43 +++++++++++++++++------ 1 file changed, 32 insertions(+), 11 deletions(-) diff --git a/MyxxCMake/lib/pvs-studio/PVS-Studio.cmake b/MyxxCMake/lib/pvs-studio/PVS-Studio.cmake index c294605..b239b08 100644 --- a/MyxxCMake/lib/pvs-studio/PVS-Studio.cmake +++ b/MyxxCMake/lib/pvs-studio/PVS-Studio.cmake @@ -3,8 +3,7 @@ # 2020-2022 (c) PVS-Studio LLC # Version 12 -cmake_minimum_required(VERSION 3.0.0) -cmake_policy(SET CMP0051 NEW) +cmake_minimum_required(VERSION 3.6) cmake_policy(SET CMP0054 NEW) if (PVS_STUDIO_AS_SCRIPT) @@ -60,7 +59,7 @@ function (pvs_studio_log TEXT) endfunction() function (pvs_studio_relative_path VAR ROOT FILEPATH) - if (WIN32) + if (CMAKE_HOST_WIN32) STRING(REGEX REPLACE "\\\\" "/" ROOT ${ROOT}) STRING(REGEX REPLACE "\\\\" "/" FILEPATH ${FILEPATH}) endif() @@ -105,6 +104,8 @@ macro (pvs_studio_append_standard_flag FLAGS STANDARD) if ("${STANDARD}" MATCHES "^(99|11|14|17|20)$") if ("${PVS_STUDIO_PREPROCESSOR}" MATCHES "gcc|clang") list(APPEND "${FLAGS}" "-std=c++${STANDARD}") + elseif("${PVS_STUDIO_PREPROCESSOR}" MATCHES "visualcpp") + list(APPEND "${FLAGS}" "/std:c++${STANDARD}") endif() endif() endmacro() @@ -184,7 +185,7 @@ function (pvs_studio_analyze_file SOURCE SOURCE_DIR BINARY_DIR) pvs_studio_relative_path(SOURCE_RELATIVE "${SOURCE_DIR}" "${SOURCE}") pvs_studio_join_path(SOURCE "${SOURCE_DIR}" "${SOURCE}") - set(LOG "${BINARY_DIR}/PVS-Studio/${SOURCE_RELATIVE}.plog") + set(LOG "${BINARY_DIR}/PVS-Studio/${TARGET}/${SOURCE_RELATIVE}.log") get_filename_component(LOG "${LOG}" REALPATH) get_filename_component(PARENT_DIR "${LOG}" DIRECTORY) @@ -343,7 +344,7 @@ function (pvs_studio_add_target) set(PATHS) - if (WIN32) + if (CMAKE_HOST_WIN32) # The registry value is only read when you do some cache operation on it. # https://stackoverflow.com/questions/1762201/reading-registry-values-with-cmake GET_FILENAME_COMPONENT(ROOT "[HKEY_LOCAL_MACHINE\\SOFTWARE\\WOW6432Node\\ProgramVerificationSystems\\PVS-Studio;installDir]" ABSOLUTE CACHE) @@ -521,18 +522,38 @@ function (pvs_studio_add_target) pvs_studio_relative_path(LOG_RELATIVE "${CMAKE_BINARY_DIR}" "${PVS_STUDIO_LOG}") if (PVS_STUDIO_PLOGS OR PVS_STUDIO_COMPILE_COMMANDS) - if (WIN32) + if (CMAKE_HOST_WIN32) string(REPLACE / \\ PVS_STUDIO_PLOGS "${PVS_STUDIO_PLOGS}") - endif() - if (WIN32) - set(COMMANDS COMMAND type ${PVS_STUDIO_PLOGS} ${PVS_STUDIO_PLOGS_LOGS} > "${PVS_STUDIO_LOG}" 2>nul || cd .) + if (CMAKE_GENERATOR MATCHES "NMake") + set(COMMAND_TYPE_FILE "${CMAKE_BINARY_DIR}/PVSConcatAllLogs.cmd") + + # The number of files that will be merged in one call to the type command + set(STEP_SIZE 30) + set(BEGIN 0) + + list(APPEND PVS_STUDIO_PLOGS ${PVS_STUDIO_PLOGS_LOGS}) + list(LENGTH PVS_STUDIO_PLOGS END) + + # Creating a bat file to call the 'type' command + file(WRITE ${COMMAND_TYPE_FILE} "@echo off\nbreak > ${PVS_STUDIO_LOG}\n") + + while(BEGIN LESS END) + list(SUBLIST PVS_STUDIO_PLOGS ${BEGIN} ${STEP_SIZE} NEW_LIST) + file(APPEND ${COMMAND_TYPE_FILE} "type ${NEW_LIST} >> ${PVS_STUDIO_LOG} 2>nul || cd .\n") + math(EXPR BEGIN "${BEGIN} + ${STEP_SIZE}") + endwhile() + + list(APPEND COMMANDS COMMAND call ${COMMAND_TYPE_FILE}) + else() + set(COMMANDS COMMAND type ${PVS_STUDIO_PLOGS} ${PVS_STUDIO_PLOGS_LOGS} > "${PVS_STUDIO_LOG}" 2>nul || cd .) + endif() else() set(COMMANDS COMMAND cat ${PVS_STUDIO_PLOGS} ${PVS_STUDIO_PLOGS_LOGS} > "${PVS_STUDIO_LOG}" 2>/dev/null || true) endif() set(COMMENT "Generating ${LOG_RELATIVE}") if (NOT "${PVS_STUDIO_FORMAT}" STREQUAL "" OR PVS_STUDIO_OUTPUT) if ("${PVS_STUDIO_FORMAT}" STREQUAL "") - set(PVS_STUDIO_FORMAT "errorfile") + set(PVS_STUDIO_FORMAT "errorfile") endif() if (PVS_STUDIO_HIDE_HELP) set(PVS_STUDIO_CONVERTER_ARGS ${PVS_STUDIO_CONVERTER_ARGS} --noHelpMessages) @@ -553,7 +574,7 @@ function (pvs_studio_add_target) set(COMMENT "Generating ${LOG_RELATIVE}: no sources found") endif() - if (WIN32) + if (CMAKE_HOST_WIN32) string(REPLACE / \\ PVS_STUDIO_LOG "${PVS_STUDIO_LOG}") endif()