blob: c16b5af39a760b02e3c4d27bf1e28f534a2773da (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
|
# Copyright (C) 2024 The Qt Company Ltd.
# SPDX-License-Identifier: BSD-3-Clause
# Helper functions for SBOM generation. We defer setting up targets until the end of build setup
# because we only want to generate e.g. one SBOM document for WebEngine. This in turn requires
# us to only call sbom.py once for WebEngine.
# Setup data structures used in other calls
function(qt_webengine_sbom_project_begin project_name cmake_target_name)
if(NOT QT_GENERATE_SBOM)
return()
endif()
set_property(GLOBAL PROPERTY QTWEBENGINE_SBOM_PROJECT_NAME ${project_name})
set_property(GLOBAL PROPERTY QTWEBENGINE_SBOM_CMAKE_TARGET_NAME ${cmake_target_name})
set_property(GLOBAL PROPERTY QTWEBENGINE_SBOM_GN_TARGETS "")
set_property(GLOBAL PROPERTY QTWEBENGINE_SBOM_BUILD_DIRS "")
set_property(GLOBAL PROPERTY QTWEBENGINE_SBOM_CMAKE_TO_GN_DEPENDENCY_PAIRS "")
endfunction()
# Add a GN target to the list of components contained in an SBOM document
function(qt_webengine_add_gn_target_to_sbom gn_target build_dir)
if(NOT QT_GENERATE_SBOM)
return()
endif()
get_property(project_name GLOBAL PROPERTY QTWEBENGINE_SBOM_PROJECT_NAME)
if(NOT DEFINED project_name)
message(FATAL_ERROR "Call qt_webengine_sbom_project_begin first")
return()
endif()
set_property(GLOBAL APPEND PROPERTY QTWEBENGINE_SBOM_GN_TARGETS ":${gn_target}")
set_property(GLOBAL APPEND PROPERTY QTWEBENGINE_SBOM_BUILD_DIRS "${build_dir}")
endfunction()
function(qt_webengine_add_gn_artifact_relationship_to_sbom ninja_target cmake_target)
if(NOT QT_GENERATE_SBOM)
return()
endif()
set_property(GLOBAL APPEND PROPERTY QTWEBENGINE_SBOM_CMAKE_TO_GN_DEPENDENCY_PAIRS
"${cmake_target};${ninja_target}")
endfunction()
# Join all the targets into (at most) two documents for Pdf / WebEngine
function(qt_webengine_sbom_project_end)
if(NOT QT_GENERATE_SBOM)
return()
endif()
# We have the situation that qtbase by default does not generate JSON files if the required
# python dependency spdx-tools is not found.
# But QtWebEngine requires the spdx-tools package to be available, otherwise we can't generate
# a tag/value document from the Chromium-generated json file, and then link the Chromium
# SBOM document to the qtwebengine one.
# Skip the Chromium SBOM generation if the dependency is not found.
# A warning or skip message should have already been shown at general configure check time.
qt_internal_sbom_verify_deps_for_generate_tag_value_spdx_document(
OUT_VAR_DEPS_FOUND sbom_deps_found
)
if(NOT sbom_deps_found)
return()
endif()
get_property(project_name GLOBAL PROPERTY QTWEBENGINE_SBOM_PROJECT_NAME)
get_property(gn_target_list GLOBAL PROPERTY QTWEBENGINE_SBOM_GN_TARGETS)
get_property(build_dir_list GLOBAL PROPERTY QTWEBENGINE_SBOM_BUILD_DIRS)
get_property(cmake_target_name GLOBAL PROPERTY QTWEBENGINE_SBOM_CMAKE_TARGET_NAME)
get_property(cmake_to_gn_dep_pairs GLOBAL PROPERTY
QTWEBENGINE_SBOM_CMAKE_TO_GN_DEPENDENCY_PAIRS)
string(TOLOWER ${project_name} project_name_lower)
set(chromium_project_name QtWebEngine-Chromium-${project_name})
string(TOLOWER ${chromium_project_name} chromium_project_name_lower)
qt_internal_sbom_get_project_supplier_url(supplier_url)
qt_internal_sbom_compute_project_namespace(doc_namespace SUPPLIER_URL ${supplier_url}
PROJECT_NAME ${chromium_project_name_lower})
qt_internal_sbom_compute_project_file_name(output_file_name EXTENSION_JSON
PROJECT_NAME ${chromium_project_name_lower})
set(output_file_path ${WEBENGINE_ROOT_BUILD_DIR}/qt_sbom/${output_file_name})
set(generate_sbom_script_path
"${CMAKE_CURRENT_BINARY_DIR}/gen_qtwebengine_chromium_sbom_${project_name}-$<CONFIG>.cmake")
set(chromium_sbom_script
"${WEBENGINE_ROOT_SOURCE_DIR}/src/3rdparty/chromium/tools/licenses/sbom.py")
set(generate_sbom_script_contents "
message(STATUS \"Generating Chromium SBOM for ${project_name}...\")
execute_process(
COMMAND \"${CMAKE_COMMAND}\"
\"-DSCRIPT_PATH=${chromium_sbom_script}\"
\"-DGN_TARGET_LIST=${gn_target_list}\"
\"-DBUILD_DIR_LIST=${build_dir_list}\"
\"-DQT_HOST_PATH=${QT_HOST_PATH}\"
\"-DQT6_HOST_INFO_LIBEXECDIR=${QT6_HOST_INFO_LIBEXECDIR}\"
\"-DQT6_HOST_INFO_BINDIR=${QT6_HOST_INFO_BINDIR}\"
-DPACKAGE_ID=${project_name}
-DDOC_NAMESPACE=${doc_namespace}
\"-DOUTPUT=${output_file_path}\"
\"-DPython3_EXECUTABLE=${Python3_EXECUTABLE}\"
-P \"${WEBENGINE_ROOT_SOURCE_DIR}/cmake/QtGnSbom.cmake\"
WORKING_DIRECTORY \"${WEBENGINE_ROOT_BUILD_DIR}\"
COMMAND_ERROR_IS_FATAL ANY
)
file(INSTALL \"${output_file_path}\" DESTINATION \"${QT6_INSTALL_PREFIX}/${INSTALL_SBOMDIR}\")
message(STATUS \"Done generating Chromium SBOM for ${project_name}.\")
")
file(GENERATE OUTPUT "${generate_sbom_script_path}" CONTENT "${generate_sbom_script_contents}")
qt_internal_sbom_add_cmake_include_step(STEP BEGIN INCLUDE_PATH "${generate_sbom_script_path}")
qt_internal_sbom_generate_tag_value_spdx_document(
OPERATION_ID ${chromium_project_name_lower}
INPUT_JSON_FILE_PATH "${output_file_path}"
OUT_VAR_OUTPUT_FILE_NAME external_output_file_name
)
# Reference to external document.
qt_internal_sbom_get_external_document_ref_spdx_id(${chromium_project_name_lower} document_ref_spdx_id)
set(external_package_spdx_id "SPDXRef-${chromium_project_name}-Internal-Components")
qt_internal_sbom_add_external_reference(
EXTERNAL_DOCUMENT_FILE_PATH "sbom/${external_output_file_name}"
EXTERNAL_DOCUMENT_SPDX_ID "${document_ref_spdx_id}"
EXTERNAL_PACKAGE_SPDX_ID "${external_package_spdx_id}"
)
while(NOT "${cmake_to_gn_dep_pairs}" STREQUAL "")
list(POP_FRONT cmake_to_gn_dep_pairs cmake_target gn_target)
qt_internal_sbom_get_target_spdx_id("${cmake_target}" cmake_spdx_id)
qt_internal_sbom_get_sanitized_spdx_id(gn_spdx_id
"SPDXRef-${chromium_project_name}-${gn_target}")
set(relationship "${cmake_spdx_id} CONTAINS ${document_ref_spdx_id}:${gn_spdx_id}")
qt_internal_extend_target(${cmake_target}
SBOM_RELATIONSHIPS
"${relationship}"
)
endwhile()
endfunction()
# Shims for SBOM commands that may be missing < 6.9
if(NOT COMMAND qt_internal_sbom_begin_qt_repo_project)
function(qt_internal_sbom_begin_qt_repo_project)
endfunction()
function(qt_internal_sbom_end_qt_repo_project)
endfunction()
function(qt_internal_sbom_add_files)
endfunction()
endif()
|