spdx30_tasks: Fix SPDX_CUSTOM_ANNOTATION_VARS implementation

Fix incorrect function call when processing SPDX_CUSTOM_ANNOTATION_VARS.
The code was calling new_annotation() as a standalone function, but it
should be called as a method on the build_objset object.

Error:
    new_annotation(d, build_objset, build, ...)

Corrected to:
    build_objset.new_annotation(d, build_objset, build, ...)

This bug would cause a NameError at runtime if SPDX_CUSTOM_ANNOTATION_VARS
was set to a non-empty value, preventing SPDX document generation.

The fix aligns with how new_annotation() is called elsewhere in the
codebase and matches the SBOMObjset class method signature.

(From OE-Core rev: de5c85b2c4c5a62d12aa5b9ab328d9a51d831c41)

Signed-off-by: Stefano Tondo <stefano.tondo.ext@siemens.com>
Signed-off-by: Mathieu Dubois-Briand <mathieu.dubois-briand@bootlin.com>
(cherry picked from commit 52ab3b640c6bb7ece34cb4ea6026fd6375f17af4)
Cc: Joshua Watt <jpewhacker@gmail.com>
Signed-off-by: Yoann Congal <yoann.congal@smile.fr>
[YC:
Link: https://lore.kernel.org/all/CAJdd5GaqcWujQae-GXQpcgAGtosHe7_X0T%2B8LyOfrr8-mOgzLA@mail.gmail.com/
]
Signed-off-by: Paul Barker <paul@pbarker.dev>
This commit is contained in:
Stefano Tondo authored and Paul Barker committed 2026-09-28 10:17:43 +01:00
1 parent b876ad82e7
commit 8b7ab84dea
2 files changed
+75 -3

No files matched your search

+1 -3
View File
@@ -517,9 +517,7 @@ def create_spdx(d):
build_objset.set_is_native(is_native)
for var in (d.getVar("SPDX_CUSTOM_ANNOTATION_VARS") or "").split():
new_annotation(
d,
build_objset,
build_objset.new_annotation(
build,
"%s=%s" % (var, d.getVar(var)),
oe.spdx30.AnnotationType.other,
+74
View File
@@ -343,3 +343,77 @@ class SPDX30Check(SPDX3CheckBase, OESelftestTestCase):
value, ["enabled", "disabled"],
f"Unexpected PACKAGECONFIG value '{value}' for {key}"
)
def test_custom_annotation_vars(self):
"""
Test that SPDX_CUSTOM_ANNOTATION_VARS properly creates annotations
without runtime errors. This is a regression test for the bug where
new_annotation() was called as a standalone function instead of as
a method on build_objset, causing a NameError.
The test verifies:
1. The build completes successfully (no NameError)
2. Each configured annotation variable appears exactly once
3. The annotation values match the configured variables
We check for exact equality (not >=) to prevent regressions where
one annotation might appear multiple times while another is missing.
"""
ANNOTATION_VAR1 = "TestAnnotation1"
ANNOTATION_VAR2 = "TestAnnotation2"
# This will fail with NameError if new_annotation() is called incorrectly
objset = self.check_recipe_spdx(
"base-files",
"{DEPLOY_DIR_SPDX}/{MACHINE_ARCH}/recipes/recipe-base-files.spdx.json",
extraconf=textwrap.dedent(
f"""\
ANNOTATION1 = "{ANNOTATION_VAR1}"
ANNOTATION2 = "{ANNOTATION_VAR2}"
SPDX_CUSTOM_ANNOTATION_VARS = "ANNOTATION1 ANNOTATION2"
"""
),
)
# If we got here, the build succeeded (no NameError)
# Now verify the annotations were actually created
# Find the build element
build = None
for o in objset.foreach_type(oe.spdx30.build_Build):
build = o
break
self.assertIsNotNone(build, "Unable to find Build element")
# Find annotation objects that reference our build
found_annotations = []
for obj in objset.objects: # <-- Remove parentheses
if isinstance(obj, oe.spdx30.Annotation):
if hasattr(obj, "subject") and build._id == obj.subject._id:
found_annotations.append(obj)
# Check each annotation separately to ensure exactly one occurrence of each
annotation1_count = 0
annotation2_count = 0
for annotation in found_annotations:
if hasattr(annotation, "statement"):
if f"ANNOTATION1={ANNOTATION_VAR1}" in annotation.statement:
annotation1_count += 1
self.logger.info(f"Found ANNOTATION1: {annotation.statement}")
if f"ANNOTATION2={ANNOTATION_VAR2}" in annotation.statement:
annotation2_count += 1
self.logger.info(f"Found ANNOTATION2: {annotation.statement}")
# Each annotation should appear exactly once
self.assertEqual(
annotation1_count,
1,
f"Expected exactly 1 occurrence of ANNOTATION1, found {annotation1_count}",
)
self.assertEqual(
annotation2_count,
1,
f"Expected exactly 1 occurrence of ANNOTATION2, found {annotation2_count}",
)