All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v2] sbom30.py/spdx30_tasks.py: fix SPDX_* prefix lookup
@ 2026-08-24 20:10 iwanicki92
  2026-08-24 23:26 ` [OE-core] " Joshua Watt
  0 siblings, 1 reply; 4+ messages in thread
From: iwanicki92 @ 2026-08-24 20:10 UTC (permalink / raw)
  To: openembedded-core; +Cc: Mathieu Dubois-Briand

Sub-variables (_name, _type, _comment, _id_email) were being looked
up using the literal string "SPDX_IMAGE_SUPPLIER", "SPDX_SDK_SUPPLIER"
"SPDX_PACKAGE_SUPPLIER", "SPDX_INVOKED_BY", "SPDX_ON_BEHALF_OF",
instead of the value of those variables, breaking the documented
ability to use a custom prefix (e.g. MY_COMPANY).

Tested by setting in local.conf:

```
MY_COMPANY_name = "CCCC"
MY_COMPANY_type = "organization"
SPDX_IMAGE_SUPPLIER = "MY_COMPANY"
SPDX_IMAGE_SUPPLIER_name = "AAAA"
SPDX_IMAGE_SUPPLIER_type = "organization"
SPDX_PACKAGE_SUPPLIER = "MY_COMPANY"
SPDX_PACKAGE_SUPPLIER_name = "BBBB"
SPDX_PACKAGE_SUPPLIER_type = "organization"
```

And then comparing `core-image-minimal-qemux86-64.rootfs.spdx.json`
SBOMs. Before this change SBOM contained only AAAA and BBBB but no CCCC,
after there was only CCCC.

Signed-off-by: iwanicki92 <iwanicki92@gmail.com>
---
Changes in v2:

Change the expand path to fallback to `varname` itself when lookup
doesn't find anything. This change allows for both old, undocumented `_ref`
indirection and documented indirection (`SPDX_* = "<PREFIX>"`)
---
 meta/lib/oe/sbom30.py       |  6 +++++-
 meta/lib/oe/spdx30_tasks.py | 10 +++++-----
 2 files changed, 10 insertions(+), 6 deletions(-)

diff --git a/meta/lib/oe/sbom30.py b/meta/lib/oe/sbom30.py
index e02382c3cc78..becf9e30d392 100644
--- a/meta/lib/oe/sbom30.py
+++ b/meta/lib/oe/sbom30.py
@@ -397,7 +397,11 @@ class ObjectSet(oe.spdx30.SHACLObjectSet):
         self.doc.import_.append(m)
         return spdxid
 
-    def new_agent(self, varname, *, creation_info=None, add=True):
+    def new_agent(self, varname, *, creation_info=None, add=True, expand=False):
+        if expand:
+            varname = self.d.getVar(varname) or varname
+        if not varname:
+            return None
         ref_varname = self.d.getVar(f"{varname}_ref")
         if ref_varname:
             if ref_varname == varname:
diff --git a/meta/lib/oe/spdx30_tasks.py b/meta/lib/oe/spdx30_tasks.py
index dac02e378429..88c707476a65 100644
--- a/meta/lib/oe/spdx30_tasks.py
+++ b/meta/lib/oe/spdx30_tasks.py
@@ -905,7 +905,7 @@ def create_spdx(d):
                 force_purposes=["install"],
             )
 
-            supplier = build_objset.new_agent("SPDX_PACKAGE_SUPPLIER")
+            supplier = build_objset.new_agent("SPDX_PACKAGE_SUPPLIER", expand=True)
             if supplier is not None:
                 spdx_package.suppliedBy = (
                     supplier if isinstance(supplier, str) else supplier._id
@@ -1213,8 +1213,8 @@ def write_bitbake_spdx(d):
     objset = oe.sbom30.ObjectSet.new_objset(d, "bitbake", False)
 
     host_import_key = d.getVar("SPDX_BUILD_HOST")
-    invoked_by = objset.new_agent("SPDX_INVOKED_BY", add=False)
-    on_behalf_of = objset.new_agent("SPDX_ON_BEHALF_OF", add=False)
+    invoked_by = objset.new_agent("SPDX_INVOKED_BY", add=False, expand=True)
+    on_behalf_of = objset.new_agent("SPDX_ON_BEHALF_OF", add=False, expand=True)
 
     if d.getVar("SPDX_INCLUDE_BITBAKE_PARENT_BUILD") == "1":
         # Since the Build objects are unique, we may as well set the creation
@@ -1536,7 +1536,7 @@ def create_image_sbom_spdx(d):
     objset, sbom = oe.sbom30.create_sbom(d, image_name, root_elements)
 
     # Set supplier on root elements if SPDX_IMAGE_SUPPLIER is defined
-    supplier = objset.new_agent("SPDX_IMAGE_SUPPLIER", add=False)
+    supplier = objset.new_agent("SPDX_IMAGE_SUPPLIER", add=False, expand=True)
     if supplier is not None:
         supplier_id = supplier if isinstance(supplier, str) else supplier._id
         if not isinstance(supplier, str):
@@ -1657,7 +1657,7 @@ def create_sdk_sbom(d, sdk_deploydir, spdx_work_dir, toolchain_outputname):
     )
 
     # Set supplier on root elements if SPDX_SDK_SUPPLIER is defined
-    supplier = objset.new_agent("SPDX_SDK_SUPPLIER", add=False)
+    supplier = objset.new_agent("SPDX_SDK_SUPPLIER", add=False, expand=True)
     if supplier is not None:
         supplier_id = supplier if isinstance(supplier, str) else supplier._id
         if not isinstance(supplier, str):
-- 
2.55.0



^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [OE-core] [PATCH v2] sbom30.py/spdx30_tasks.py: fix SPDX_* prefix lookup
  2026-08-24 20:10 [PATCH v2] sbom30.py/spdx30_tasks.py: fix SPDX_* prefix lookup iwanicki92
@ 2026-08-24 23:26 ` Joshua Watt
  2026-08-25  5:48   ` iwanicki92
  0 siblings, 1 reply; 4+ messages in thread
From: Joshua Watt @ 2026-08-24 23:26 UTC (permalink / raw)
  To: iwanicki92; +Cc: openembedded-core, Mathieu Dubois-Briand

[-- Attachment #1: Type: text/plain, Size: 5350 bytes --]

On Mon, Aug 24, 2026 at 2:14 PM iwanicki92 via lists.openembedded.org
<iwanicki92=gmail.com@lists.openembedded.org> wrote:

> Sub-variables (_name, _type, _comment, _id_email) were being looked
> up using the literal string "SPDX_IMAGE_SUPPLIER", "SPDX_SDK_SUPPLIER"
> "SPDX_PACKAGE_SUPPLIER", "SPDX_INVOKED_BY", "SPDX_ON_BEHALF_OF",
> instead of the value of those variables, breaking the documented
> ability to use a custom prefix (e.g. MY_COMPANY).
>
> Tested by setting in local.conf:
>
> ```
> MY_COMPANY_name = "CCCC"
> MY_COMPANY_type = "organization"
> SPDX_IMAGE_SUPPLIER = "MY_COMPANY"
> SPDX_IMAGE_SUPPLIER_name = "AAAA"
> SPDX_IMAGE_SUPPLIER_type = "organization"
> SPDX_PACKAGE_SUPPLIER = "MY_COMPANY"
> SPDX_PACKAGE_SUPPLIER_name = "BBBB"
> SPDX_PACKAGE_SUPPLIER_type = "organization"
> ```
>
> And then comparing `core-image-minimal-qemux86-64.rootfs.spdx.json`
> SBOMs. Before this change SBOM contained only AAAA and BBBB but no CCCC,
> after there was only CCCC.
>

This isn't how these variables are intended to work; I'm not sure where the
documentation you found suggests this, but the values for any base variable
are suffixes always appended to that base variable. For example:

SPDX_IMAGE_SUPPLIER = "MY_COMPANY"
SPDX_IMAGE_SUPPLIER_MY_COMPANY_name = "CCCC"
SPDX_IMAGE_SUPPLIER_MY_COMPANY_type = "organization"




> Signed-off-by: iwanicki92 <iwanicki92@gmail.com>
> ---
> Changes in v2:
>
> Change the expand path to fallback to `varname` itself when lookup
> doesn't find anything. This change allows for both old, undocumented `_ref`
> indirection and documented indirection (`SPDX_* = "<PREFIX>"`)
> ---
>  meta/lib/oe/sbom30.py       |  6 +++++-
>  meta/lib/oe/spdx30_tasks.py | 10 +++++-----
>  2 files changed, 10 insertions(+), 6 deletions(-)
>
> diff --git a/meta/lib/oe/sbom30.py b/meta/lib/oe/sbom30.py
> index e02382c3cc78..becf9e30d392 100644
> --- a/meta/lib/oe/sbom30.py
> +++ b/meta/lib/oe/sbom30.py
> @@ -397,7 +397,11 @@ class ObjectSet(oe.spdx30.SHACLObjectSet):
>          self.doc.import_.append(m)
>          return spdxid
>
> -    def new_agent(self, varname, *, creation_info=None, add=True):
> +    def new_agent(self, varname, *, creation_info=None, add=True,
> expand=False):
> +        if expand:
> +            varname = self.d.getVar(varname) or varname
> +        if not varname:
> +            return None
>          ref_varname = self.d.getVar(f"{varname}_ref")
>          if ref_varname:
>              if ref_varname == varname:
> diff --git a/meta/lib/oe/spdx30_tasks.py b/meta/lib/oe/spdx30_tasks.py
> index dac02e378429..88c707476a65 100644
> --- a/meta/lib/oe/spdx30_tasks.py
> +++ b/meta/lib/oe/spdx30_tasks.py
> @@ -905,7 +905,7 @@ def create_spdx(d):
>                  force_purposes=["install"],
>              )
>
> -            supplier = build_objset.new_agent("SPDX_PACKAGE_SUPPLIER")
> +            supplier = build_objset.new_agent("SPDX_PACKAGE_SUPPLIER",
> expand=True)
>              if supplier is not None:
>                  spdx_package.suppliedBy = (
>                      supplier if isinstance(supplier, str) else
> supplier._id
> @@ -1213,8 +1213,8 @@ def write_bitbake_spdx(d):
>      objset = oe.sbom30.ObjectSet.new_objset(d, "bitbake", False)
>
>      host_import_key = d.getVar("SPDX_BUILD_HOST")
> -    invoked_by = objset.new_agent("SPDX_INVOKED_BY", add=False)
> -    on_behalf_of = objset.new_agent("SPDX_ON_BEHALF_OF", add=False)
> +    invoked_by = objset.new_agent("SPDX_INVOKED_BY", add=False,
> expand=True)
> +    on_behalf_of = objset.new_agent("SPDX_ON_BEHALF_OF", add=False,
> expand=True)
>
>      if d.getVar("SPDX_INCLUDE_BITBAKE_PARENT_BUILD") == "1":
>          # Since the Build objects are unique, we may as well set the
> creation
> @@ -1536,7 +1536,7 @@ def create_image_sbom_spdx(d):
>      objset, sbom = oe.sbom30.create_sbom(d, image_name, root_elements)
>
>      # Set supplier on root elements if SPDX_IMAGE_SUPPLIER is defined
> -    supplier = objset.new_agent("SPDX_IMAGE_SUPPLIER", add=False)
> +    supplier = objset.new_agent("SPDX_IMAGE_SUPPLIER", add=False,
> expand=True)
>      if supplier is not None:
>          supplier_id = supplier if isinstance(supplier, str) else
> supplier._id
>          if not isinstance(supplier, str):
> @@ -1657,7 +1657,7 @@ def create_sdk_sbom(d, sdk_deploydir, spdx_work_dir,
> toolchain_outputname):
>      )
>
>      # Set supplier on root elements if SPDX_SDK_SUPPLIER is defined
> -    supplier = objset.new_agent("SPDX_SDK_SUPPLIER", add=False)
> +    supplier = objset.new_agent("SPDX_SDK_SUPPLIER", add=False,
> expand=True)
>      if supplier is not None:
>          supplier_id = supplier if isinstance(supplier, str) else
> supplier._id
>          if not isinstance(supplier, str):
> --
> 2.55.0
>
>
> -=-=-=-=-=-=-=-=-=-=-=-
> Links: You receive all messages sent to this group.
> View/Reply Online (#244150):
> https://lists.openembedded.org/g/openembedded-core/message/244150
> Mute This Topic: https://lists.openembedded.org/mt/120910416/3616693
> Group Owner: openembedded-core+owner@lists.openembedded.org
> Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub [
> JPEWhacker@gmail.com]
> -=-=-=-=-=-=-=-=-=-=-=-
>
>

[-- Attachment #2: Type: text/html, Size: 7203 bytes --]

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH v2] sbom30.py/spdx30_tasks.py: fix SPDX_* prefix lookup
  2026-08-24 23:26 ` [OE-core] " Joshua Watt
@ 2026-08-25  5:48   ` iwanicki92
  2026-08-25 15:00     ` [OE-core] " Joshua Watt
  0 siblings, 1 reply; 4+ messages in thread
From: iwanicki92 @ 2026-08-25  5:48 UTC (permalink / raw)
  To: openembedded-core

[-- Attachment #1: Type: text/plain, Size: 1365 bytes --]

> 
> I'm not sure where the documentation you found suggests this
> 

The Yocto Project documentation: https://docs.yoctoproject.org/ref-manual/variables.html#term-SPDX_IMAGE_SUPPLIER contains almost the same example:

MY_COMPANY_name = "Acme Corp"
MY_COMPANY_type = "organization"
SPDX_IMAGE_SUPPLIER = "MY_COMPANY"
SPDX_SDK_SUPPLIER = "MY_COMPANY"

the support for this is already implemented by undocumented `_ref` suffix, so maybe documentation should be changed instead.
Though `_ref` suffix if I'm reading code correctly allows for infinite chaining e.g:

SPDX_IMAGE_SUPPLIER_ref = "MY_COMPANY1"
MY_COMPANY1_ref = "MY_COMPANY2"
MY_COMPANY2_name = "Acme Corp

> 
> but the values for any base variable are suffixes always appended to that
> base variable
> 
> 
> SPDX_IMAGE_SUPPLIER = "MY_COMPANY"
> SPDX_IMAGE_SUPPLIER_MY_COMPANY_name = "CCCC"
> SPDX_IMAGE_SUPPLIER_MY_COMPANY_type = "organization"
> 

This one I don't think is mentioned anywhere, and also doesn't work. Maybe you meant SPDX_AUTHORS which has this syntax:

SPDX_AUTHORS ??= "openembedded"
SPDX_AUTHORS[doc] = "A space separated list of the document authors. Each item \
is used to name a base variable like SPDX_AUTHORS_<AUTHOR> that \
describes the author."
SPDX_AUTHORS_openembedded_name = "OpenEmbedded"
SPDX_AUTHORS_openembedded_type = "organization"

[-- Attachment #2: Type: text/html, Size: 1716 bytes --]

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [OE-core] [PATCH v2] sbom30.py/spdx30_tasks.py: fix SPDX_* prefix lookup
  2026-08-25  5:48   ` iwanicki92
@ 2026-08-25 15:00     ` Joshua Watt
  0 siblings, 0 replies; 4+ messages in thread
From: Joshua Watt @ 2026-08-25 15:00 UTC (permalink / raw)
  To: iwanicki92; +Cc: openembedded-core

[-- Attachment #1: Type: text/plain, Size: 3185 bytes --]

On Mon, Aug 24, 2026 at 11:48 PM iwanicki92 via lists.openembedded.org
<iwanicki92=gmail.com@lists.openembedded.org> wrote:

> I'm not sure where the documentation you found suggests this
>
>
> The Yocto Project documentation:
> https://docs.yoctoproject.org/ref-manual/variables.html#term-SPDX_IMAGE_SUPPLIER
> contains almost the same example:
>
> MY_COMPANY_name = "Acme Corp"
> MY_COMPANY_type = "organization"
> SPDX_IMAGE_SUPPLIER = "MY_COMPANY"
> SPDX_SDK_SUPPLIER = "MY_COMPANY"
>

This is incorrect and needs to be removed


>
> the support for this is already implemented by undocumented `_ref` suffix,
> so maybe documentation should be changed instead.
> Though `_ref` suffix if I'm reading code correctly allows for infinite
> chaining e.g:
>
> SPDX_IMAGE_SUPPLIER_ref = "MY_COMPANY1"
> MY_COMPANY1_ref = "MY_COMPANY2"
> MY_COMPANY2_name = "Acme Corp
>


That's not how _ref works. _ref allows you to "reference" another SPDX
"Agent" that was created elsewhere (instead of creating a new one each
time). So you can do:

SPDX_IMAGE_SUPPLIER_name = "AAAA"
SPDX_IMAGE_SUPPLIER_type = "organization"

SPDX_SDK_SUPPLIER_ref = "SPDX_IMAGE_SUPPLIER"

And then the generated SPDX will only contain a single "AAAA" company
object that is referenced in both cases, instead of creating 2 duplicate
objects. However, at least one of the variables must actually create the
organization for that to work (e.g. SPDX_IMAGE_SUPPLIER in this case)


>
>
> but the values for any base variable are suffixes always appended to that
> base variable
>
> SPDX_IMAGE_SUPPLIER = "MY_COMPANY"
> SPDX_IMAGE_SUPPLIER_MY_COMPANY_name = "CCCC"
> SPDX_IMAGE_SUPPLIER_MY_COMPANY_type = "organization"
>
>
> This one I don't think is mentioned anywhere, and also doesn't work. Maybe
> you meant SPDX_AUTHORS which has this syntax:
>

Yes, I did, sorry for being confusing. Some variables allow multiple things
to be assigned (like SPDX_AUTHORS) and some only allow a single one (like
SPDX_IMAGE_SUPPLIER). The ones the support multiple require the suffixes to
be specified in the variable name, e.g.

  SPDX_AUTHORS = "A B C"

And then the code will create authors using SPDX_AUTHORS_A, SPDX_AUTHORS_B,
and SPDX_AUTHORS_C, but these 3 variables are all treated the same as all
other SPDX Agent variables (e.g. the same as SPDX_IMAGE_SUPPLIER)



>
> SPDX_AUTHORS ??= "openembedded"
> SPDX_AUTHORS[doc] = "A space separated list of the document authors. Each
> item \
>     is used to name a base variable like SPDX_AUTHORS_<AUTHOR> that \
>     describes the author."
> SPDX_AUTHORS_openembedded_name = "OpenEmbedded"
> SPDX_AUTHORS_openembedded_type = "organization"
>
> -=-=-=-=-=-=-=-=-=-=-=-
> Links: You receive all messages sent to this group.
> View/Reply Online (#244192):
> https://lists.openembedded.org/g/openembedded-core/message/244192
> Mute This Topic: https://lists.openembedded.org/mt/120910416/3616693
> Group Owner: openembedded-core+owner@lists.openembedded.org
> Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub [
> JPEWhacker@gmail.com]
> -=-=-=-=-=-=-=-=-=-=-=-
>
>

[-- Attachment #2: Type: text/html, Size: 5243 bytes --]

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2026-08-25 15:00 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-08-24 20:10 [PATCH v2] sbom30.py/spdx30_tasks.py: fix SPDX_* prefix lookup iwanicki92
2026-08-24 23:26 ` [OE-core] " Joshua Watt
2026-08-25  5:48   ` iwanicki92
2026-08-25 15:00     ` [OE-core] " Joshua Watt

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.