[OE-core][PATCH 5/9] spdx3: Add is-native property

Joshua Watt
2026-02-20T15:41:48Z

Adds a custom is-native property to the recipe package to indicate if it
is a native recipe

Signed-off-by: Joshua Watt <JPEWhacker@gmail.com>
---
meta/lib/oe/sbom30.py | 20 ++++++++++++++++++++
meta/lib/oe/spdx30_tasks.py | 18 +++++++++++-------
2 files changed, 31 insertions(+), 7 deletions(-)

diff --git a/meta/lib/oe/sbom30.py b/meta/lib/oe/sbom30.py
index 227ac51877..50a72fce39 100644
--- a/meta/lib/oe/sbom30.py
+++ b/meta/lib/oe/sbom30.py
@@ -118,6 +118,26 @@ class OEDocumentExtension(oe.spdx30.extension_Extension):
)

+@oe.spdx30.register(OE_SPDX_BASE + "recipe-extension")
+class OERecipeExtension(oe.spdx30.extension_Extension):
+ """
+ This extension is added to recipe software_Packages to indicate various
+ useful bits of information about the recipe
+ """
+
+ CLOSED = True
+
+ @classmethod
+ def _register_props(cls):
+ super()._register_props()
+ cls._add_property(
+ "is_native",
+ oe.spdx30.BooleanProp(),
+ OE_SPDX_BASE + "is-native",
+ max_count=1,
+ )
+
+
def spdxid_hash(*items):
h = hashlib.md5()
for i in items:
diff --git a/meta/lib/oe/spdx30_tasks.py b/meta/lib/oe/spdx30_tasks.py
index 9a312a870d..fff1ca6bea 100644
--- a/meta/lib/oe/spdx30_tasks.py
+++ b/meta/lib/oe/spdx30_tasks.py
@@ -477,6 +477,10 @@ def set_purls(spdx_package, purls):
)

+def get_is_native(d):
+ return bb.data.inherits_class("native", d) or bb.data.inherits_class("cross", d)
+
+
def create_recipe_spdx(d):
deploydir = Path(d.getVar("SPDXRECIPEDEPLOY"))
deploy_dir_spdx = Path(d.getVar("DEPLOY_DIR_SPDX"))
@@ -507,6 +511,11 @@ def create_recipe_spdx(d):
)
)

+ if get_is_native(d):
+ ext = oe.sbom30.OERecipeExtension()
+ ext.is_native = True
+ recipe.extension.append(ext)
+
set_purls(recipe, (d.getVar("SPDX_PACKAGE_URLS") or "").split())

# TODO: This doesn't work before do_unpack because the license text has to
@@ -668,9 +677,7 @@ def create_spdx(d):
spdx_workdir = Path(d.getVar("SPDXWORK"))
include_sources = d.getVar("SPDX_INCLUDE_SOURCES") == "1"
pkg_arch = d.getVar("SSTATE_PKGARCH")
- is_native = bb.data.inherits_class("native", d) or bb.data.inherits_class(
- "cross", d
- )
+ is_native = get_is_native(d)

recipe, recipe_objset = load_recipe_spdx(d)

@@ -1021,14 +1028,11 @@ def create_spdx(d):
def create_package_spdx(d):
deploy_dir_spdx = Path(d.getVar("DEPLOY_DIR_SPDX"))
deploydir = Path(d.getVar("SPDXRUNTIMEDEPLOY"))
- is_native = bb.data.inherits_class("native", d) or bb.data.inherits_class(
- "cross", d
- )

providers = oe.spdx_common.collect_package_providers(d)
pkg_arch = d.getVar("SSTATE_PKGARCH")

- if is_native:
+ if get_is_native(d):
return

bb.build.exec_func("read_subpackage_metadata", d)
--
2.53.0