Files
2026-07-07 15:39:46 +08:00

241 lines
12 KiB
CMake

include_guard(GLOBAL)
include(${CMAKE_CURRENT_LIST_DIR}/../base/global.cmake)
include(${CMAKE_CURRENT_LIST_DIR}/../base/log.cmake)
function(wdk_init_codeql_defaults target_name)
wdk_require_target("wdk_init_codeql_defaults" "${target_name}")
wdk_begin_target_state_init_once(_should_init "${target_name}" codeql_defaults)
if(NOT _should_init)
return()
endif()
wdk_init_target_state("${target_name}" codeql_mode "bundle")
wdk_init_target_state("${target_name}" codeql_root_dir "")
wdk_init_target_state("${target_name}" codeql_bundle_dir "")
wdk_init_target_state("${target_name}" codeql_bundle_suite_glob "")
wdk_init_target_state("${target_name}" codeql_enable_recommended OFF)
wdk_init_target_state("${target_name}" codeql_clean_before_capture ON)
endfunction()
function(_add_codeql_driver_analysis target_name)
wdk_require_target("_add_codeql_driver_analysis" "${target_name}")
wdk_init_codeql_defaults("${target_name}")
wdk_get_target_state(folder_name "${target_name}")
file(TO_CMAKE_PATH "$ENV{USERPROFILE}" codeql_user_profile_dir)
if(ARGN)
list(GET ARGN 0 vcxproj_stage_dir)
else()
wdk_get_target_state(vcxproj_stage_dir "${target_name}")
endif()
set(_codeql_supported_modes global bundle)
wdk_get_target_state(codeql_mode "${target_name}")
wdk_require_value_in_list("${CMAKE_CURRENT_FUNCTION}" "${codeql_mode}" _codeql_supported_modes)
wdk_get_target_state(version_identifier "${target_name}")
wdk_get_target_state(codeql_root_dir "${target_name}")
wdk_get_target_state(codeql_bundle_dir "${target_name}")
wdk_get_target_state(codeql_bundle_suite_glob "${target_name}")
wdk_get_target_state(codeql_enable_recommended "${target_name}")
wdk_get_target_state(codeql_clean_before_capture "${target_name}")
whcp_select_codeql_versions(
"${version_identifier}"
codeql_cli_version
codeql_windows_drivers_pack
codeql_cpp_queries_pack
codeql_whcp_branch
)
if("${codeql_bundle_dir}" STREQUAL "")
set(codeql_root_dir "D:/ae/env/CodeQL")
endif()
if("${codeql_bundle_dir}" STREQUAL "")
set(codeql_bundle_dir "${codeql_root_dir}/bundle_v${codeql_cli_version}")
endif()
set(_install_packs_target "${target_name}_codeql_install_packs")
set(_analyze_target "${target_name}_codeql")
set(_codeql_analyze_extra_args "")
get_filename_component(_codeql_source_root "${vcxproj_stage_dir}" ABSOLUTE)
set(_codeql_capture_build_dir "${CMAKE_BINARY_DIR}")
set(_codeql_database_dir "${vcxproj_stage_dir}/db/${target_name}")
set(_codeql_sarif_dir "${vcxproj_stage_dir}/sarif/${target_name}")
set(_codeql_script_dir "${vcxproj_stage_dir}/scripts")
set(_install_packs_script "${_codeql_script_dir}/${target_name}_codeql_install_packs.bat")
set(_codeql_build_script "${_codeql_script_dir}/${target_name}_codeql_build.bat")
set(_codeql_analyze_script "${_codeql_script_dir}/${target_name}_codeql_analyze.bat")
get_filename_component(_codeql_database_parent_dir "${_codeql_database_dir}" DIRECTORY)
if("${codeql_mode}" STREQUAL "global")
set(codeql_exe "${codeql_root_dir}/codeql_v${codeql_cli_version}/codeql.exe")
if(NOT codeql_windows_drivers_pack MATCHES "^(.+)@([^@]+)$")
wdk_fatal("${CMAKE_CURRENT_FUNCTION}" "Invalid CodeQL windows drivers pack reference: ${codeql_windows_drivers_pack}")
endif()
set(codeql_windows_drivers_pack_name "${CMAKE_MATCH_1}")
set(codeql_windows_drivers_pack_version "${CMAKE_MATCH_2}")
set(_codeql_suite_glob
"${codeql_user_profile_dir}/.codeql/packages/${codeql_windows_drivers_pack_name}/${codeql_windows_drivers_pack_version}/windows-driver-suites/*.qls"
)
wdk_make_cmd_script_content(_install_packs_script_content
"\"${codeql_exe}\" pack download \"${codeql_windows_drivers_pack}\""
"if errorlevel 1 exit /b 1"
"\"${codeql_exe}\" pack download \"${codeql_cpp_queries_pack}\""
"if errorlevel 1 exit /b 1"
)
else()
set(codeql_exe "${codeql_bundle_dir}/codeql.exe")
if("${codeql_bundle_suite_glob}" STREQUAL "")
set(_codeql_suite_glob "${codeql_bundle_dir}/qlpacks/codeql/cpp-queries/*/codeql-suites/cpp-security-and-quality.qls")
else()
set(_codeql_suite_glob "${codeql_bundle_suite_glob}")
endif()
list(APPEND _codeql_analyze_extra_args "\"--additional-packs=${codeql_bundle_dir}/qlpacks\"")
wdk_make_cmd_script_content(_install_packs_script_content
"echo CodeQL bundle mode: using local bundle at \"${codeql_bundle_dir}\""
"echo CodeQL bundle mode: no pack download is required."
)
endif()
check_exist_fail_fast(codeql_exe)
wdk_add_written_cmd_script_target(
"${_install_packs_target}"
"${_install_packs_script}"
"${CMAKE_CURRENT_BINARY_DIR}"
"Preparing CodeQL packs for ${target_name}"
"${_install_packs_script_content}"
)
wdk_set_target_state("${_install_packs_target}" folder_name "${folder_name}")
file(TO_NATIVE_PATH "${_codeql_capture_build_dir}" _codeql_capture_build_dir_native)
if(codeql_clean_before_capture)
wdk_make_cmd_script_content(_codeql_build_script_content
"echo [CodeQL] Clean target build directory"
"\"${CMAKE_COMMAND}\" --build \"${_codeql_capture_build_dir_native}\" --target clean"
"if errorlevel 1 exit /b 1"
"echo [CodeQL] Build target: ${target_name}"
"\"${CMAKE_COMMAND}\" --build \"${_codeql_capture_build_dir_native}\" --target ${target_name} --verbose"
"if errorlevel 1 exit /b 1"
)
else()
wdk_make_cmd_script_content(_codeql_build_script_content
"echo [CodeQL] Build target: ${target_name}"
"\"${CMAKE_COMMAND}\" --build \"${_codeql_capture_build_dir_native}\" --target ${target_name} --verbose"
"if errorlevel 1 exit /b 1"
)
endif()
wdk_write_cmd_script("${_codeql_build_script}" "${_codeql_build_script_content}")
file(TO_NATIVE_PATH "${_codeql_build_script}" _codeql_build_script_native)
set(_codeql_build_command "cmd /C call \\\"${_codeql_build_script_native}\\\"")
file(GLOB _codeql_suite_files CONFIGURE_DEPENDS "${_codeql_suite_glob}")
if(NOT _codeql_suite_files)
if("${codeql_mode}" STREQUAL "global")
set(_missing_suite_message
"CodeQL suites are not installed for ${version_identifier}. Build ${_install_packs_target}, then reconfigure."
)
set(_missing_suite_deps "${_install_packs_target}")
wdk_log_warning("${target_name}"
"_add_codeql_driver_analysis: no .qls files found by glob:\n"
" ${_codeql_suite_glob}\n"
"Build target '${_install_packs_target}', then reconfigure to scan installed suites."
)
else()
set(_missing_suite_message
"CodeQL bundle suites were not found. Check codeql_bundle_dir and codeql_bundle_suite_glob."
)
set(_missing_suite_deps "")
wdk_log_warning("${target_name}"
"_add_codeql_driver_analysis: no .qls files found by glob:\n"
" ${_codeql_suite_glob}\n"
"Bundle dir: ${codeql_bundle_dir}"
)
endif()
set(_codeql_missing_suite_script "${_codeql_script_dir}/${target_name}_codeql_missing_suites.bat")
wdk_make_cmd_script_content(_codeql_missing_suite_script_content
"echo ${_missing_suite_message}"
)
wdk_add_written_cmd_script_target(
"${_analyze_target}"
"${_codeql_missing_suite_script}"
"${CMAKE_CURRENT_BINARY_DIR}"
"CodeQL suites missing for ${target_name}"
"${_codeql_missing_suite_script_content}"
${_missing_suite_deps}
)
wdk_set_target_state("${_analyze_target}" folder_name "${folder_name}")
return()
endif()
set(_codeql_required_suite_lines "")
set(_codeql_recommended_suite_lines "")
foreach(_suite_file IN LISTS _codeql_suite_files)
get_filename_component(_suite_file_name "${_suite_file}" NAME)
get_filename_component(_suite_name "${_suite_file}" NAME_WE)
string(TOLOWER "${_suite_name}" _suite_name_lower)
if("${codeql_mode}" STREQUAL "global")
set(_suite_ref "${codeql_windows_drivers_pack}:windows-driver-suites/${_suite_file_name}")
else()
set(_suite_ref "${_suite_file}")
endif()
set(_suite_sarif "${_codeql_sarif_dir}/${target_name}_${_suite_name}.sarif")
if(_suite_name_lower MATCHES "recommended")
list(APPEND _codeql_recommended_suite_lines
"\"${codeql_exe}\" database analyze \"${_codeql_database_dir}\" \"${_suite_ref}\" ${_codeql_analyze_extra_args} --format=sarif-latest \"--output=${_suite_sarif}\""
"if errorlevel 1 exit /b 1"
)
else()
list(APPEND _codeql_required_suite_lines
"\"${codeql_exe}\" database analyze \"${_codeql_database_dir}\" \"${_suite_ref}\" ${_codeql_analyze_extra_args} --format=sarif-latest \"--output=${_suite_sarif}\""
"if errorlevel 1 exit /b 1"
)
endif()
endforeach()
set(_codeql_analyze_lines
"\"${CMAKE_COMMAND}\" -E remove_directory \"${_codeql_database_dir}\""
"\"${CMAKE_COMMAND}\" -E remove_directory \"${_codeql_sarif_dir}\""
"\"${CMAKE_COMMAND}\" -E make_directory \"${_codeql_database_parent_dir}\""
"\"${CMAKE_COMMAND}\" -E make_directory \"${_codeql_sarif_dir}\""
"\"${codeql_exe}\" database create \"${_codeql_database_dir}\" --language=cpp \"--source-root=${_codeql_source_root}\" \"--command=${_codeql_build_command}\""
"if errorlevel 1 exit /b 1"
${_codeql_required_suite_lines}
)
if(codeql_enable_recommended)
list(APPEND _codeql_analyze_lines ${_codeql_recommended_suite_lines})
endif()
wdk_make_cmd_script_content(_codeql_analyze_script_content ${_codeql_analyze_lines})
wdk_add_written_cmd_script_target(
"${_analyze_target}"
"${_codeql_analyze_script}"
"${CMAKE_CURRENT_BINARY_DIR}"
"Running CodeQL suites for ${target_name}"
"${_codeql_analyze_script_content}"
)
wdk_set_target_state("${_analyze_target}" folder_name "${folder_name}")
wdk_log_status("${target_name}" "CodeQL observe-build targets added for target: ${target_name}")
wdk_log_status("${target_name}" " mode : ${codeql_mode}")
wdk_log_status("${target_name}" " capture build dir : ${_codeql_capture_build_dir}")
wdk_log_status("${target_name}" " source root : ${_codeql_source_root}")
wdk_log_status("${target_name}" " prepare packs : ${_install_packs_target}")
wdk_log_status("${target_name}" " analyze target : ${_analyze_target}")
wdk_log_status("${target_name}" " version identifier : ${version_identifier}")
wdk_log_status("${target_name}" " CodeQL CLI version : ${codeql_cli_version}")
wdk_log_status("${target_name}" " WHCP branch : ${codeql_whcp_branch}")
wdk_log_status("${target_name}" " windows pack : ${codeql_windows_drivers_pack}")
wdk_log_status("${target_name}" " cpp queries pack : ${codeql_cpp_queries_pack}")
wdk_log_status("${target_name}" " suite glob : ${_codeql_suite_glob}")
wdk_log_status("${target_name}" " build script : ${_codeql_build_script}")
wdk_log_status("${target_name}" " database dir : ${_codeql_database_dir}")
wdk_log_status("${target_name}" " sarif dir : ${_codeql_sarif_dir}")
endfunction()