@@ -30,7 +30,7 @@ python do_create_rootfs_spdx() {
import oe.spdx30_tasks
oe.spdx30_tasks.create_rootfs_spdx(d)
}
-addtask do_create_rootfs_spdx after do_rootfs do_create_recipe_spdx before do_image
+addtask do_create_rootfs_spdx after do_rootfs do_create_recipe_spdx before do_image do_image_complete
SSTATETASKS += "do_create_rootfs_spdx"
do_create_rootfs_spdx[sstate-inputdirs] = "${SPDXROOTFSDEPLOY}"
do_create_rootfs_spdx[sstate-outputdirs] = "${DEPLOY_DIR_SPDX}"
@@ -43,33 +43,23 @@ python do_create_rootfs_spdx_setscene() {
}
addtask do_create_rootfs_spdx_setscene
-python do_create_image_spdx() {
+python create_image_spdx() {
import oe.spdx30_tasks
- oe.spdx30_tasks.create_image_spdx(d)
-}
-addtask do_create_image_spdx after do_image_complete do_create_rootfs_spdx do_create_recipe_spdx before do_build
-SSTATETASKS += "do_create_image_spdx"
-SSTATE_SKIP_CREATION:task-create-image-spdx = "1"
-do_create_image_spdx[sstate-inputdirs] = "${SPDXIMAGEWORK}"
-do_create_image_spdx[sstate-outputdirs] = "${DEPLOY_DIR_SPDX}"
-do_create_image_spdx[cleandirs] = "${SPDXIMAGEWORK}"
-do_create_image_spdx[dirs] = "${SPDXIMAGEWORK}"
-do_create_image_spdx[file-checksums] += "${SPDX3_DEP_FILES}"
-do_create_image_spdx[vardeps] += "\
- SPDX_IMAGE_PURPOSE \
- "
+ from pathlib import Path
+ current_task = "do_" + d.getVar("BB_CURRENTTASK")
-python do_create_image_spdx_setscene() {
- sstate_setscene(d)
-}
-addtask do_create_image_spdx_setscene
+ spdxdeploydir = Path(d.getVar("SPDXDIR") + "/deploy-" + current_task)
+ oe.spdx30_tasks.create_image_spdx(d, spdxdeploydir)
+}
+oe.spdx30_tasks.create_image_spdx[vardeps] += "SPDX_IMAGE_PURPOSE"
+SPDX_DEPLOY_TASKS += "do_image_complete:create_image_spdx"
python do_create_image_sbom_spdx() {
import oe.spdx30_tasks
oe.spdx30_tasks.create_image_sbom_spdx(d)
}
-addtask do_create_image_sbom_spdx after do_create_rootfs_spdx do_create_image_spdx before do_build
+addtask do_create_image_sbom_spdx after do_create_rootfs_spdx do_image_complete before do_build
SSTATETASKS += "do_create_image_sbom_spdx"
SSTATE_SKIP_CREATION:task-create-image-sbom = "1"
do_create_image_sbom_spdx[sstate-inputdirs] = "${SPDXIMAGEDEPLOYDIR}"
@@ -9,6 +9,5 @@ deltask do_create_spdx
deltask do_create_spdx_runtime
deltask do_create_package_spdx
deltask do_create_rootfs_spdx
-deltask do_create_image_spdx
deltask do_create_image_sbom
deltask do_create_deploy_sbom
@@ -358,9 +358,6 @@ python () {
# for the recipe, at least until it's possible for do_populate_sysroot
# to describe it's own output.
"do_populate_sysroot": "do_create_spdx",
- # If an image is needed, also depend on the task to create the SBoM for
- # the image
- "do_image_complete": "do_create_image_spdx",
}
def map_task_deps(task, flag):
@@ -15,7 +15,6 @@ CVE_VERSION ??= "${PV}"
SPDXDIR ??= "${WORKDIR}/spdx/${SPDX_VERSION}"
SPDXDEPLOY = "${SPDXDIR}/deploy"
SPDXWORK = "${SPDXDIR}/work"
-SPDXIMAGEWORK = "${SPDXDIR}/image-work"
SPDXSDKWORK = "${SPDXDIR}/sdk-work"
SPDXSDKEXTWORK = "${SPDXDIR}/sdk-ext-work"
SPDXDEPS = "${SPDXDIR}/deps.json"
@@ -1539,19 +1539,19 @@ def create_rootfs_spdx(d):
)
-def create_image_spdx(d):
+def create_image_spdx(d, spdx_deploy_dir):
import oe.sbom30
+ pn = d.getVar("PN")
+ current_task = "do_" + d.getVar("BB_CURRENTTASK")
+
image_deploy_dir = Path(d.getVar("IMGDEPLOYDIR"))
manifest_path = Path(d.getVar("IMAGE_OUTPUT_MANIFEST"))
- spdx_work_dir = Path(d.getVar("SPDXIMAGEWORK"))
image_basename = d.getVar("IMAGE_BASENAME")
machine = d.getVar("MACHINE")
- objset = oe.sbom30.ObjectSet.new_objset(
- d, "%s-%s-image" % (image_basename, machine)
- )
+ objset = oe.sbom30.ObjectSet.new_objset(d, f"{pn}-{current_task}-deploy")
with manifest_path.open("r") as f:
manifest = json.load(f)
@@ -1644,13 +1644,18 @@ def create_image_spdx(d):
objset.add_aliases()
objset.link()
oe.sbom30.write_recipe_jsonld_doc(
- d, objset, "image", spdx_work_dir, create_task_link=True
+ d,
+ objset,
+ "deploy",
+ spdx_deploy_dir,
+ create_task_link=True,
)
def create_image_sbom_spdx(d):
import oe.sbom30
+ pn = d.getVar("PN")
image_name = d.getVar("IMAGE_NAME")
image_basename = d.getVar("IMAGE_BASENAME")
image_link_name = d.getVar("IMAGE_LINK_NAME")
@@ -1672,7 +1677,9 @@ def create_image_sbom_spdx(d):
root_elements.append(oe.sbom30.get_element_link_id(rootfs_image))
image_objset, _ = oe.sbom30.find_jsonld(
- d, "image", "%s-%s-image" % (image_basename, machine), required=True
+ d,
+ "deploy",
+ f"{pn}-do_image_complete-deploy",
)
for o in image_objset.foreach_root(oe.spdx30.software_File):
root_elements.append(oe.sbom30.get_element_link_id(o))
Replaces the dedicated do_create_image_spdx task with a deploy task tied to do_image_complete (which is task that deploys images). This has the advantage that images recipe SPDX dependencies are now completely automatically detected in the task graph, and the SPDX documents are merged in automatically when dependencies on do_image_complete are detected Signed-off-by: Joshua Watt <JPEWhacker@gmail.com> --- .../create-spdx-image-3.0.bbclass | 30 +++++++------------ meta/classes-recipe/nospdx.bbclass | 1 - meta/classes/create-spdx-3.0.bbclass | 3 -- meta/classes/spdx-common.bbclass | 1 - meta/lib/oe/spdx30_tasks.py | 21 ++++++++----- 5 files changed, 24 insertions(+), 32 deletions(-)