Files
build_infra/Cppcheck/main.cmake
T
2026-07-28 17:55:29 +08:00

58 lines
2.4 KiB
CMake

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