function(psc_cppcheck_ps_array out_value) set(values) foreach(item IN LISTS ARGN) string(REPLACE "'" "''" escaped "${item}") list(APPEND values "'${escaped}'") endforeach() string(REPLACE ";" "," value "${values}") set(${out_value} "@(${value})" PARENT_SCOPE) endfunction() function(psc_add_cppcheck_target target_name) set(options) set(oneValueArgs OUTPUT_DIR COMPILE_COMMANDS CPPCHECK_EXECUTABLE CHECK_LEVEL JOBS) set(multiValueArgs INPUT_DIRS EXCLUDE_DIRS ENABLE SUPPRESSIONS) cmake_parse_arguments(ARG "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) if (NOT ARG_OUTPUT_DIR) set(ARG_OUTPUT_DIR "${CMAKE_CURRENT_BINARY_DIR}/metrics/${target_name}/cppcheck") endif () if (NOT ARG_COMPILE_COMMANDS) set(ARG_COMPILE_COMMANDS "${CMAKE_BINARY_DIR}/compile_commands.json") endif () if (NOT ARG_CPPCHECK_EXECUTABLE) set(ARG_CPPCHECK_EXECUTABLE "C:/Program Files/Cppcheck/cppcheck.exe") endif () if (NOT ARG_CHECK_LEVEL) set(ARG_CHECK_LEVEL "normal") endif () if (NOT ARG_JOBS) set(ARG_JOBS 8) endif () if (NOT ARG_INPUT_DIRS) set(ARG_INPUT_DIRS "${CMAKE_SOURCE_DIR}") endif () if (NOT ARG_ENABLE) set(ARG_ENABLE warning style performance portability) endif () if (NOT ARG_SUPPRESSIONS) set(ARG_SUPPRESSIONS missingIncludeSystem unmatchedSuppression) endif () psc_cppcheck_ps_array(PSC_CPPCHECK_INPUT_DIRS ${ARG_INPUT_DIRS}) psc_cppcheck_ps_array(PSC_CPPCHECK_EXCLUDE_DIRS ${ARG_EXCLUDE_DIRS}) psc_cppcheck_ps_array(PSC_CPPCHECK_ENABLE ${ARG_ENABLE}) psc_cppcheck_ps_array(PSC_CPPCHECK_SUPPRESSIONS ${ARG_SUPPRESSIONS}) set(PSC_CPPCHECK_OUTPUT_DIR "${ARG_OUTPUT_DIR}") set(PSC_CPPCHECK_COMPILE_COMMANDS "${ARG_COMPILE_COMMANDS}") set(PSC_CPPCHECK_EXECUTABLE "${ARG_CPPCHECK_EXECUTABLE}") set(PSC_CPPCHECK_CHECK_LEVEL "${ARG_CHECK_LEVEL}") set(PSC_CPPCHECK_JOBS "${ARG_JOBS}") set(script_dir "${CMAKE_CURRENT_BINARY_DIR}/psc_metrics_scripts/${target_name}") file(MAKE_DIRECTORY "${script_dir}") set(script "${script_dir}/${target_name}_cppcheck.ps1") configure_file("${CMAKE_CURRENT_FUNCTION_LIST_DIR}/Cppcheck.ps1.in" "${script}" @ONLY) add_custom_target(${target_name} COMMAND pwsh -NoProfile -ExecutionPolicy Bypass -File "${script}" VERBATIM ) set(${target_name}_OUTPUT_DIR "${ARG_OUTPUT_DIR}" PARENT_SCOPE) endfunction()