241 lines
12 KiB
CMake
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()
|