* [RR V2][NULL][0/3] SPDX 3.0: Reduce redundant spdxid-hash symlinks to save inode on host
@ 2024-11-20 5:50 Hongxu Jia
2024-11-20 5:50 ` [oe-core][PATCH V2 1/3] sbom30/spdx30: add link prefix and name to namespace of spdxId and alias Hongxu Jia
` (4 more replies)
0 siblings, 5 replies; 9+ messages in thread
From: Hongxu Jia @ 2024-11-20 5:50 UTC (permalink / raw)
To: openembedded-core, JPEWhacker, hongxu.jia
Summary: SPDX 3.0: Reduce redundant spdxid-hash symlinks to save inode on host
* Git logs
[oe-core]
commit 5ebf6f058259bc073e83bd2fa2b3b116e6156d60
Author: Hongxu Jia <hongxu.jia@windriver.com>
Date: Sat Nov 9 17:16:31 2024 +0800
oeqa/selftest: Add SPDX 3.0 include source cases for core_image_minimal build
$ oe-selftest -r spdx.SPDX30Check.test_core_image_minimal_include_source
2024-11-20 03:29:24,850 - oe-selftest - INFO - Adding layer libraries:
2024-11-20 03:29:24,850 - oe-selftest - INFO - path-to/poky/meta/lib
2024-11-20 03:29:24,850 - oe-selftest - INFO - path-to/poky/meta-yocto-bsp/lib
2024-11-20 03:29:24,850 - oe-selftest - INFO - path-to/poky/meta-selftest/lib
2024-11-20 03:29:24,850 - oe-selftest - INFO - path-to/meta-openembedded/meta-oe/lib
2024-11-20 03:29:24,868 - oe-selftest - INFO - Checking base configuration is valid/parsable
2024-11-20 03:29:27,317 - oe-selftest - INFO - Adding: "include selftest.inc" in path-to/build_spdx3-st/conf/local.conf
2024-11-20 03:29:27,317 - oe-selftest - INFO - Adding: "include bblayers.inc" in bblayers.conf
2024-11-20 03:29:27,317 - oe-selftest - INFO - test_core_image_minimal_include_source (spdx.SPDX30Check.test_core_image_minimal_include_source)
2024-11-20 04:52:47,318 - oe-selftest - INFO - Keepalive message
2024-11-20 05:14:08,115 - oe-selftest - INFO - ... ok
2024-11-20 05:21:12,798 - oe-selftest - INFO - ----------------------------------------------------------------------
2024-11-20 05:21:12,798 - oe-selftest - INFO - Ran 1 test in 6706.271s
2024-11-20 05:21:12,798 - oe-selftest - INFO - OK
2024-11-20 05:21:32,026 - oe-selftest - INFO - RESULTS:
2024-11-20 05:21:32,026 - oe-selftest - INFO - RESULTS - spdx.SPDX30Check.test_core_image_minimal_include_source: PASSED (6280.82s)
2024-11-20 05:21:32,027 - oe-selftest - INFO - SUMMARY:
2024-11-20 05:21:32,027 - oe-selftest - INFO - oe-selftest () - Ran 1 test in 6706.272s
2024-11-20 05:21:32,027 - oe-selftest - INFO - oe-selftest - OK - All required tests passed (successes=1, skipped=0, failures=0, errors=0)
Signed-off-by: Hongxu Jia <hongxu.jia@windriver.com>
commit 3753b084cffcbef374093a442d4e692821d1a29b
Author: Hongxu Jia <hongxu.jia@windriver.com>
Date: Sat Nov 9 14:18:26 2024 +0800
sbom30.py: reduce redundant spdxid symlinks to save inode on host
In order to support all in-scope SPDX data within a single
JSON-LD file for SPDX 3.0.1, Yocto's SBOM:
- In native/target/nativesdk recipe, created spdxid-hash symlink
for each element to point to the JSON-LD file that contains
element details;
- In image recipe, use spdxid-hash symlink to collect element
details from varies of JSON-LD files
While SPDX_INCLUDE_SOURCES = "1", it adds sources to JSON-LD file
and create 2N+ spdxid-hash symlinks for N source files.
(N for software_File, N for hasDeclaredLicense's Relationship)
For large numbers of source files, adding an extra symlink -> real file
will occupy one more inode (per file), which will need a slot in
the OS's inode cache. In this situation, disk performance is slow
and inode is used up quickly
After commit [sbom30/spdx30: add link prefix and name to namespace
of spdxId and alias] applied, the namespace of spdxId and alias in
recipe and package jsonld differs. Use it to create symlink to jsonld,
take recipe shadow, package shadow and package shadow-src for example:
For recipe jsonld tmp/deploy/spdx/3.0.1/core2-64/recipes/shadow.spdx.json
spdxId: http://spdx.org/spdxdocs/recipe-shadow-xxx/...
alias: recipe-shadow/UNIHASH/...
symlink: tmp/deploy/spdx/3.0.1/core2-64/by-spdxid-link/recipe-shadow.spdx.json -> ../recipes/shadow.spdx.json
For package jsonld tmp/deploy/spdx/3.0.1/core2-64/packages/shadow.spdx.json
spdxId: http://spdx.org/spdxdocs/package-shadow-xxx/...
alias: package-shadow/UNIHASH/...
symlink: tmp/deploy/spdx/3.0.1/core2-64/by-spdxid-link/package-shadow.spdx.json -> ../packages/shadow.spdx.json
In package jsonld tmp/deploy/spdx/3.0.1/core2-64/packages/shadow-src.spdx.json
spdxId: http://spdx.org/spdxdocs/package-shadow-src-xxx/...
alias: package-shadow-src/UNIHASH/...
symlink: tmp/deploy/spdx/3.0.1/core2-64/by-spdxid-link/package-shadow-src.spdx.json -> ../packages/shadow-src.spdx.json
Build core-image-minimal with/without this commit, comparing the spdxid-link
number, 7 281 824 -> 6 043
echo 'SPDX_INCLUDE_SOURCES = "1"' >> local.conf
Without this commit:
$ time bitbake core-image-minimal
real 100m17.769s
user 0m24.516s
sys 0m4.334s
$ find tmp/deploy/spdx/3.0.1/*/by-spdxid-hash -name "*.json" |wc -l
7281824
With this commit:
$ time bitbake core-image-minimal
real 85m12.994s
user 0m20.423s
sys 0m4.228s
$ find tmp/deploy/spdx/3.0.1/*/by-spdxid-link -name "*.json" |wc -l
6043
Signed-off-by: Hongxu Jia <hongxu.jia@windriver.com>
commit 0ea8bcaa9a8fe63f1935e02968fbaa541734024b
Author: Hongxu Jia <hongxu.jia@windriver.com>
Date: Tue Nov 19 20:12:37 2024 +0800
sbom30/spdx30: add link prefix and name to namespace of spdxId and alias
In order to simple reference the SPDX ID to instead of making jsonld hash
path for each element, only creating one symlink for one file and referencing
it multiple times, add link prefix and name to the namespace of spdxId and alias
to replace ${PN} to avoid namespace conflict between recipe, packages and images.
Take recipe shadow, package shadow and package shadow-src for example:
Without this commit, spdxId and alias in recipe and package jsonld have the same
namespace
spdxId: http://spdx.org/spdxdocs/shadow-xxx/...
alias: shadow/UNIHASH/...
After apply this commit, the namespace of spdxId in recipe and package jsonld differs:
In recipe jsonld tmp/deploy/spdx/3.0.1/core2-64/recipes/shadow.spdx.json
spdxId: http://spdx.org/spdxdocs/recipe-shadow-xxx/...
alias: recipe-shadow/UNIHASH/...
In package jsonld tmp/deploy/spdx/3.0.1/core2-64/packages/shadow.spdx.json
spdxId: http://spdx.org/spdxdocs/package-shadow-xxx/...
alias: package-shadow/UNIHASH/...
In package jsonld tmp/deploy/spdx/3.0.1/core2-64/packages/shadow-src.spdx.json
spdxId: http://spdx.org/spdxdocs/package-shadow-src-xxx/...
alias: package-shadow-src/UNIHASH/...
Then will use namespace of spdxId and alias to create link for jsonld file,
one symlink for one jsonld file, referenced by elements multiple times
Signed-off-by: Hongxu Jia <hongxu.jia@windriver.com>
====== Testing ======
* Commands
Build core-image-minimal with/without this commit, comparing the spdxid-link
number, 7 281 824 -> 6 043
echo 'SPDX_INCLUDE_SOURCES = "1"' >> local.conf
Without this commit:
$ time bitbake core-image-minimal
real 100m17.769s
user 0m24.516s
sys 0m4.334s
$ find tmp/deploy/spdx/3.0.1/*/by-spdxid-hash -name "*.json" |wc -l
7281824
With this commit:
$ time bitbake core-image-minimal
real 85m12.994s
user 0m20.423s
sys 0m4.228s
$ find tmp/deploy/spdx/3.0.1/*/by-spdxid-link -name "*.json" |wc -l
6043
$ oe-selftest -r spdx.SPDX30Check.test_core_image_minimal_include_source
2024-11-20 03:29:24,850 - oe-selftest - INFO - Adding layer libraries:
2024-11-20 03:29:24,850 - oe-selftest - INFO - path-to/poky/meta/lib
2024-11-20 03:29:24,850 - oe-selftest - INFO - path-to/poky/meta-yocto-bsp/lib
2024-11-20 03:29:24,850 - oe-selftest - INFO - path-to/poky/meta-selftest/lib
2024-11-20 03:29:24,850 - oe-selftest - INFO - path-to/meta-openembedded/meta-oe/lib
2024-11-20 03:29:24,868 - oe-selftest - INFO - Checking base configuration is valid/parsable
2024-11-20 03:29:27,317 - oe-selftest - INFO - Adding: "include selftest.inc" in path-to/build_spdx3-st/conf/local.conf
2024-11-20 03:29:27,317 - oe-selftest - INFO - Adding: "include bblayers.inc" in bblayers.conf
2024-11-20 03:29:27,317 - oe-selftest - INFO - test_core_image_minimal_include_source (spdx.SPDX30Check.test_core_image_minimal_include_source)
2024-11-20 04:52:47,318 - oe-selftest - INFO - Keepalive message
2024-11-20 05:14:08,115 - oe-selftest - INFO - ... ok
2024-11-20 05:21:12,798 - oe-selftest - INFO - ----------------------------------------------------------------------
2024-11-20 05:21:12,798 - oe-selftest - INFO - Ran 1 test in 6706.271s
2024-11-20 05:21:12,798 - oe-selftest - INFO - OK
2024-11-20 05:21:32,026 - oe-selftest - INFO - RESULTS:
2024-11-20 05:21:32,026 - oe-selftest - INFO - RESULTS - spdx.SPDX30Check.test_core_image_minimal_include_source: PASSED (6280.82s)
2024-11-20 05:21:32,027 - oe-selftest - INFO - SUMMARY:
2024-11-20 05:21:32,027 - oe-selftest - INFO - oe-selftest () - Ran 1 test in 6706.272s
2024-11-20 05:21:32,027 - oe-selftest - INFO - oe-selftest - OK - All required tests passed (successes=1, skipped=0, failures=0, errors=0)
^ permalink raw reply [flat|nested] 9+ messages in thread
* [oe-core][PATCH V2 1/3] sbom30/spdx30: add link prefix and name to namespace of spdxId and alias
2024-11-20 5:50 [RR V2][NULL][0/3] SPDX 3.0: Reduce redundant spdxid-hash symlinks to save inode on host Hongxu Jia
@ 2024-11-20 5:50 ` Hongxu Jia
2024-11-20 5:50 ` [oe-core][PATCH V2 2/3] sbom30.py: reduce redundant spdxid symlinks to save inode on host Hongxu Jia
` (3 subsequent siblings)
4 siblings, 0 replies; 9+ messages in thread
From: Hongxu Jia @ 2024-11-20 5:50 UTC (permalink / raw)
To: openembedded-core, JPEWhacker, hongxu.jia
In order to simple reference the SPDX ID to instead of making jsonld hash
path for each element, only creating one symlink for one file and referencing
it multiple times, add link prefix and name to the namespace of spdxId and alias
to replace ${PN} to avoid namespace conflict between recipe, packages and images.
Take recipe shadow, package shadow and package shadow-src for example:
Without this commit, spdxId and alias in recipe and package jsonld have the same
namespace
spdxId: http://spdx.org/spdxdocs/shadow-xxx/...
alias: shadow/UNIHASH/...
After apply this commit, the namespace of spdxId in recipe and package jsonld differs:
In recipe jsonld tmp/deploy/spdx/3.0.1/core2-64/recipes/shadow.spdx.json
spdxId: http://spdx.org/spdxdocs/recipe-shadow-xxx/...
alias: recipe-shadow/UNIHASH/...
In package jsonld tmp/deploy/spdx/3.0.1/core2-64/packages/shadow.spdx.json
spdxId: http://spdx.org/spdxdocs/package-shadow-xxx/...
alias: package-shadow/UNIHASH/...
In package jsonld tmp/deploy/spdx/3.0.1/core2-64/packages/shadow-src.spdx.json
spdxId: http://spdx.org/spdxdocs/package-shadow-src-xxx/...
alias: package-shadow-src/UNIHASH/...
Then will use namespace of spdxId and alias to create link for jsonld file,
one symlink for one jsonld file, referenced by elements multiple times
Signed-off-by: Hongxu Jia <hongxu.jia@windriver.com>
---
meta/lib/oe/sbom30.py | 27 +++++++++++++++++----------
meta/lib/oe/spdx30_tasks.py | 13 +++++++------
2 files changed, 24 insertions(+), 16 deletions(-)
diff --git a/meta/lib/oe/sbom30.py b/meta/lib/oe/sbom30.py
index e3a9428668..7033bcdf5b 100644
--- a/meta/lib/oe/sbom30.py
+++ b/meta/lib/oe/sbom30.py
@@ -217,9 +217,11 @@ def to_list(l):
class ObjectSet(oe.spdx30.SHACLObjectSet):
- def __init__(self, d):
+ def __init__(self, d, name=None, link_prefix=None):
super().__init__()
self.d = d
+ self.name = name
+ self.link_prefix = link_prefix
def create_index(self):
self.by_sha256_hash = {}
@@ -322,6 +324,8 @@ class ObjectSet(oe.spdx30.SHACLObjectSet):
uuid.NAMESPACE_DNS, self.d.getVar("SPDX_UUID_NAMESPACE")
)
pn = self.d.getVar("PN")
+ if self.link_prefix and self.name:
+ pn = "%s-%s" % (self.link_prefix, self.name)
return "%s/%s-%s" % (
self.d.getVar("SPDX_NAMESPACE_PREFIX"),
pn,
@@ -341,10 +345,13 @@ class ObjectSet(oe.spdx30.SHACLObjectSet):
elif namespace not in e._id:
bb.warn(f"Namespace {namespace} not found in {e._id}")
else:
+ pn = self.d.getVar("PN")
+ if self.link_prefix and self.name:
+ pn = "%s-%s" % (self.link_prefix, self.name)
alias_ext = set_alias(
e,
e._id.replace(unihash, "UNIHASH").replace(
- namespace, self.d.getVar("PN")
+ namespace, pn
),
)
@@ -803,8 +810,8 @@ class ObjectSet(oe.spdx30.SHACLObjectSet):
)
@classmethod
- def new_objset(cls, d, name, copy_from_bitbake_doc=True):
- objset = cls(d)
+ def new_objset(cls, d, name, copy_from_bitbake_doc=True, link_prefix=None):
+ objset = cls(d, name=name, link_prefix=link_prefix)
document = oe.spdx30.SpdxDocument(
_id=objset.new_spdxid("document", name),
@@ -885,9 +892,9 @@ class ObjectSet(oe.spdx30.SHACLObjectSet):
return missing_spdxids
-def load_jsonld(d, path, required=False):
+def load_jsonld(d, path, required=False, name=None, link_prefix=None):
deserializer = oe.spdx30.JSONLDDeserializer()
- objset = ObjectSet(d)
+ objset = ObjectSet(d, name=name, link_prefix=link_prefix)
try:
with path.open("rb") as f:
deserializer.read(f, objset)
@@ -916,9 +923,9 @@ def jsonld_hash_path(_id):
return Path("by-spdxid-hash") / h[:2], h
-def load_jsonld_by_arch(d, arch, subdir, name, *, required=False):
+def load_jsonld_by_arch(d, arch, subdir, name, *, required=False, link_prefix=None):
path = jsonld_arch_path(d, arch, subdir, name)
- objset = load_jsonld(d, path, required=required)
+ objset = load_jsonld(d, path, required=required, name=name, link_prefix=link_prefix)
if objset is not None:
return (objset, path)
return (None, None)
@@ -1047,8 +1054,8 @@ def find_root_obj_in_jsonld(d, subdir, fn_name, obj_type, **attr_filter):
return spdx_obj, objset
-def load_obj_in_jsonld(d, arch, subdir, fn_name, obj_type, **attr_filter):
- objset, fn = load_jsonld_by_arch(d, arch, subdir, fn_name, required=True)
+def load_obj_in_jsonld(d, arch, subdir, fn_name, obj_type, link_prefix=None, **attr_filter):
+ objset, fn = load_jsonld_by_arch(d, arch, subdir, fn_name, required=True, link_prefix=link_prefix)
spdx_obj = objset.find_filter(obj_type, **attr_filter)
if not spdx_obj:
diff --git a/meta/lib/oe/spdx30_tasks.py b/meta/lib/oe/spdx30_tasks.py
index 5aeed5cd6f..ef829fbbf1 100644
--- a/meta/lib/oe/spdx30_tasks.py
+++ b/meta/lib/oe/spdx30_tasks.py
@@ -461,7 +461,7 @@ def create_spdx(d):
if not include_vex in ("none", "current", "all"):
bb.fatal("SPDX_INCLUDE_VEX must be one of 'none', 'current', 'all'")
- build_objset = oe.sbom30.ObjectSet.new_objset(d, d.getVar("PN"))
+ build_objset = oe.sbom30.ObjectSet.new_objset(d, d.getVar("PN"), link_prefix="recipe")
build = build_objset.new_task_build("recipe", "recipe")
build_objset.set_element_alias(build)
@@ -574,7 +574,7 @@ def create_spdx(d):
bb.debug(1, "Creating SPDX for package %s" % pkg_name)
- pkg_objset = oe.sbom30.ObjectSet.new_objset(d, pkg_name)
+ pkg_objset = oe.sbom30.ObjectSet.new_objset(d, pkg_name, link_prefix="package")
spdx_package = pkg_objset.add_root(
oe.spdx30.software_Package(
@@ -793,7 +793,7 @@ def create_package_spdx(d):
# Any element common to all packages that need to be referenced by ID
# should be written into this objset set
common_objset = oe.sbom30.ObjectSet.new_objset(
- d, "%s-package-common" % d.getVar("PN")
+ d, "%s-package-common" % d.getVar("PN"), link_prefix="package"
)
pkgdest = Path(d.getVar("PKGDEST"))
@@ -812,6 +812,7 @@ def create_package_spdx(d):
"packages-staging",
pkg_name,
oe.spdx30.software_Package,
+ link_prefix="package",
software_primaryPurpose=oe.spdx30.software_SoftwarePurpose.install,
)
@@ -1002,7 +1003,7 @@ def create_rootfs_spdx(d):
with root_packages_file.open("r") as f:
packages = json.load(f)
- objset = oe.sbom30.ObjectSet.new_objset(d, "%s-%s" % (image_basename, machine))
+ objset = oe.sbom30.ObjectSet.new_objset(d, "%s-%s" % (image_basename, machine), link_prefix="rootfs")
rootfs = objset.add_root(
oe.spdx30.software_Package(
@@ -1037,7 +1038,7 @@ def create_image_spdx(d):
image_basename = d.getVar("IMAGE_BASENAME")
machine = d.getVar("MACHINE")
- objset = oe.sbom30.ObjectSet.new_objset(d, "%s-%s" % (image_basename, machine))
+ objset = oe.sbom30.ObjectSet.new_objset(d, "%s-%s" % (image_basename, machine), link_prefix="image")
with manifest_path.open("r") as f:
manifest = json.load(f)
@@ -1150,7 +1151,7 @@ def sdk_create_spdx(d, sdk_type, spdx_work_dir, toolchain_outputname):
sdk_name = toolchain_outputname + "-" + sdk_type
sdk_packages = oe.sdk.sdk_list_installed_packages(d, sdk_type == "target")
- objset = oe.sbom30.ObjectSet.new_objset(d, sdk_name)
+ objset = oe.sbom30.ObjectSet.new_objset(d, sdk_name, link_prefix="sdk")
sdk_rootfs = objset.add_root(
oe.spdx30.software_Package(
--
2.25.1
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [oe-core][PATCH V2 2/3] sbom30.py: reduce redundant spdxid symlinks to save inode on host
2024-11-20 5:50 [RR V2][NULL][0/3] SPDX 3.0: Reduce redundant spdxid-hash symlinks to save inode on host Hongxu Jia
2024-11-20 5:50 ` [oe-core][PATCH V2 1/3] sbom30/spdx30: add link prefix and name to namespace of spdxId and alias Hongxu Jia
@ 2024-11-20 5:50 ` Hongxu Jia
2024-11-20 5:50 ` [oe-core][PATCH 3/3] oeqa/selftest: Add SPDX 3.0 include source cases for core_image_minimal build Hongxu Jia
` (2 subsequent siblings)
4 siblings, 0 replies; 9+ messages in thread
From: Hongxu Jia @ 2024-11-20 5:50 UTC (permalink / raw)
To: openembedded-core, JPEWhacker, hongxu.jia
In order to support all in-scope SPDX data within a single
JSON-LD file for SPDX 3.0.1, Yocto's SBOM:
- In native/target/nativesdk recipe, created spdxid-hash symlink
for each element to point to the JSON-LD file that contains
element details;
- In image recipe, use spdxid-hash symlink to collect element
details from varies of JSON-LD files
While SPDX_INCLUDE_SOURCES = "1", it adds sources to JSON-LD file
and create 2N+ spdxid-hash symlinks for N source files.
(N for software_File, N for hasDeclaredLicense's Relationship)
For large numbers of source files, adding an extra symlink -> real file
will occupy one more inode (per file), which will need a slot in
the OS's inode cache. In this situation, disk performance is slow
and inode is used up quickly
After commit [sbom30/spdx30: add link prefix and name to namespace
of spdxId and alias] applied, the namespace of spdxId and alias in
recipe and package jsonld differs. Use it to create symlink to jsonld,
take recipe shadow, package shadow and package shadow-src for example:
For recipe jsonld tmp/deploy/spdx/3.0.1/core2-64/recipes/shadow.spdx.json
spdxId: http://spdx.org/spdxdocs/recipe-shadow-xxx/...
alias: recipe-shadow/UNIHASH/...
symlink: tmp/deploy/spdx/3.0.1/core2-64/by-spdxid-link/recipe-shadow.spdx.json -> ../recipes/shadow.spdx.json
For package jsonld tmp/deploy/spdx/3.0.1/core2-64/packages/shadow.spdx.json
spdxId: http://spdx.org/spdxdocs/package-shadow-xxx/...
alias: package-shadow/UNIHASH/...
symlink: tmp/deploy/spdx/3.0.1/core2-64/by-spdxid-link/package-shadow.spdx.json -> ../packages/shadow.spdx.json
In package jsonld tmp/deploy/spdx/3.0.1/core2-64/packages/shadow-src.spdx.json
spdxId: http://spdx.org/spdxdocs/package-shadow-src-xxx/...
alias: package-shadow-src/UNIHASH/...
symlink: tmp/deploy/spdx/3.0.1/core2-64/by-spdxid-link/package-shadow-src.spdx.json -> ../packages/shadow-src.spdx.json
Build core-image-minimal with/without this commit, comparing the spdxid-link
number, 7 281 824 -> 6 043
echo 'SPDX_INCLUDE_SOURCES = "1"' >> local.conf
Without this commit:
$ time bitbake core-image-minimal
real 100m17.769s
user 0m24.516s
sys 0m4.334s
$ find tmp/deploy/spdx/3.0.1/*/by-spdxid-hash -name "*.json" |wc -l
7281824
With this commit:
$ time bitbake core-image-minimal
real 85m12.994s
user 0m20.423s
sys 0m4.228s
$ find tmp/deploy/spdx/3.0.1/*/by-spdxid-link -name "*.json" |wc -l
6043
Signed-off-by: Hongxu Jia <hongxu.jia@windriver.com>
---
meta/lib/oe/sbom30.py | 28 +++++++++++++++++++++++-----
1 file changed, 23 insertions(+), 5 deletions(-)
diff --git a/meta/lib/oe/sbom30.py b/meta/lib/oe/sbom30.py
index 7033bcdf5b..bad12a64d9 100644
--- a/meta/lib/oe/sbom30.py
+++ b/meta/lib/oe/sbom30.py
@@ -917,10 +917,23 @@ def jsonld_arch_path(d, arch, subdir, name, deploydir=None):
return deploydir / arch / subdir / (name + ".spdx.json")
-def jsonld_hash_path(_id):
- h = hashlib.sha256(_id.encode("utf-8")).hexdigest()
+def jsonld_link_path(_id, d):
+ spdx_namespace_prefix = d.getVar("SPDX_NAMESPACE_PREFIX")
+ m = re.match(f"^{spdx_namespace_prefix}/([^/]+)/", _id)
+ if m:
+ # Parse spdxId
+ # http://spdx.org/spdxdocs/recipe-shadow-10e66933-65cf-5a2d-9a1d-99b12a405441/55a7286167e0c1a871d49da1af6070709d52370a5b52fdea03d248452f919aaa/source/4 -> recipe-shadow
+ link_path = m.group(1)[0:-len(str(uuid.NAMESPACE_DNS))-1]
+ else:
+ m = re.match(r"([^/]+)/UNIHASH/", _id)
+ if m:
+ # Parse alias
+ # recipe-shadow/UNIHASH/license/3_24_0/BSD-3-Clause -> recipe-shadow
+ link_path = m.group(1)
+ else:
+ bb.fatal("Invalid id %s, neither SPDX ID or alias" % _id)
- return Path("by-spdxid-hash") / h[:2], h
+ return Path("by-spdxid-link"), link_path
def load_jsonld_by_arch(d, arch, subdir, name, *, required=False, link_prefix=None):
@@ -991,7 +1004,7 @@ def write_recipe_jsonld_doc(
dest = jsonld_arch_path(d, pkg_arch, subdir, objset.doc.name, deploydir=deploydir)
def link_id(_id):
- hash_path = jsonld_hash_path(_id)
+ hash_path = jsonld_link_path(_id, d)
link_name = jsonld_arch_path(
d,
@@ -999,6 +1012,11 @@ def write_recipe_jsonld_doc(
*hash_path,
deploydir=deploydir,
)
+
+ # Return if expected symlink exists
+ if link_name.is_symlink() and link_name.resolve() == dest:
+ return hash_path[-1]
+
try:
link_name.parent.mkdir(exist_ok=True, parents=True)
link_name.symlink_to(os.path.relpath(dest, link_name.parent))
@@ -1065,7 +1083,7 @@ def load_obj_in_jsonld(d, arch, subdir, fn_name, obj_type, link_prefix=None, **a
def find_by_spdxid(d, spdxid, *, required=False):
- return find_jsonld(d, *jsonld_hash_path(spdxid), required=required)
+ return find_jsonld(d, *jsonld_link_path(spdxid, d), required=required)
def create_sbom(d, name, root_elements, add_objectsets=[]):
--
2.25.1
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [oe-core][PATCH 3/3] oeqa/selftest: Add SPDX 3.0 include source cases for core_image_minimal build
2024-11-20 5:50 [RR V2][NULL][0/3] SPDX 3.0: Reduce redundant spdxid-hash symlinks to save inode on host Hongxu Jia
2024-11-20 5:50 ` [oe-core][PATCH V2 1/3] sbom30/spdx30: add link prefix and name to namespace of spdxId and alias Hongxu Jia
2024-11-20 5:50 ` [oe-core][PATCH V2 2/3] sbom30.py: reduce redundant spdxid symlinks to save inode on host Hongxu Jia
@ 2024-11-20 5:50 ` Hongxu Jia
2024-11-20 14:44 ` [OE-core] [RR V2][NULL][0/3] SPDX 3.0: Reduce redundant spdxid-hash symlinks to save inode on host Mathieu Dubois-Briand
[not found] ` <1809974167D85508.29057@lists.openembedded.org>
4 siblings, 0 replies; 9+ messages in thread
From: Hongxu Jia @ 2024-11-20 5:50 UTC (permalink / raw)
To: openembedded-core, JPEWhacker, hongxu.jia
$ oe-selftest -r spdx.SPDX30Check.test_core_image_minimal_include_source
2024-11-20 03:29:24,850 - oe-selftest - INFO - Adding layer libraries:
2024-11-20 03:29:24,850 - oe-selftest - INFO - path-to/poky/meta/lib
2024-11-20 03:29:24,850 - oe-selftest - INFO - path-to/poky/meta-yocto-bsp/lib
2024-11-20 03:29:24,850 - oe-selftest - INFO - path-to/poky/meta-selftest/lib
2024-11-20 03:29:24,850 - oe-selftest - INFO - path-to/meta-openembedded/meta-oe/lib
2024-11-20 03:29:24,868 - oe-selftest - INFO - Checking base configuration is valid/parsable
2024-11-20 03:29:27,317 - oe-selftest - INFO - Adding: "include selftest.inc" in path-to/build_spdx3-st/conf/local.conf
2024-11-20 03:29:27,317 - oe-selftest - INFO - Adding: "include bblayers.inc" in bblayers.conf
2024-11-20 03:29:27,317 - oe-selftest - INFO - test_core_image_minimal_include_source (spdx.SPDX30Check.test_core_image_minimal_include_source)
2024-11-20 04:52:47,318 - oe-selftest - INFO - Keepalive message
2024-11-20 05:14:08,115 - oe-selftest - INFO - ... ok
2024-11-20 05:21:12,798 - oe-selftest - INFO - ----------------------------------------------------------------------
2024-11-20 05:21:12,798 - oe-selftest - INFO - Ran 1 test in 6706.271s
2024-11-20 05:21:12,798 - oe-selftest - INFO - OK
2024-11-20 05:21:32,026 - oe-selftest - INFO - RESULTS:
2024-11-20 05:21:32,026 - oe-selftest - INFO - RESULTS - spdx.SPDX30Check.test_core_image_minimal_include_source: PASSED (6280.82s)
2024-11-20 05:21:32,027 - oe-selftest - INFO - SUMMARY:
2024-11-20 05:21:32,027 - oe-selftest - INFO - oe-selftest () - Ran 1 test in 6706.272s
2024-11-20 05:21:32,027 - oe-selftest - INFO - oe-selftest - OK - All required tests passed (successes=1, skipped=0, failures=0, errors=0)
Signed-off-by: Hongxu Jia <hongxu.jia@windriver.com>
---
meta/lib/oeqa/selftest/cases/spdx.py | 14 ++++++++++++++
1 file changed, 14 insertions(+)
diff --git a/meta/lib/oeqa/selftest/cases/spdx.py b/meta/lib/oeqa/selftest/cases/spdx.py
index 8384070219..c785f5445f 100644
--- a/meta/lib/oeqa/selftest/cases/spdx.py
+++ b/meta/lib/oeqa/selftest/cases/spdx.py
@@ -174,6 +174,20 @@ class SPDX30Check(SPDX3CheckBase, OESelftestTestCase):
# Document should be fully linked
self.check_objset_missing_ids(objset)
+ def test_core_image_minimal_include_source(self):
+ objset = self.check_recipe_spdx(
+ "core-image-minimal",
+ "{DEPLOY_DIR_IMAGE}/core-image-minimal-{MACHINE}.rootfs.spdx.json",
+ extraconf=textwrap.dedent(
+ """\
+ SPDX_INCLUDE_SOURCES = "1"
+ """
+ ),
+ )
+
+ # Document should be fully linked
+ self.check_objset_missing_ids(objset)
+
def test_core_image_minimal_sdk(self):
objset = self.check_recipe_spdx(
"core-image-minimal",
--
2.25.1
^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [OE-core] [RR V2][NULL][0/3] SPDX 3.0: Reduce redundant spdxid-hash symlinks to save inode on host
2024-11-20 5:50 [RR V2][NULL][0/3] SPDX 3.0: Reduce redundant spdxid-hash symlinks to save inode on host Hongxu Jia
` (2 preceding siblings ...)
2024-11-20 5:50 ` [oe-core][PATCH 3/3] oeqa/selftest: Add SPDX 3.0 include source cases for core_image_minimal build Hongxu Jia
@ 2024-11-20 14:44 ` Mathieu Dubois-Briand
2024-11-21 3:05 ` Jia, Hongxu
[not found] ` <1809974167D85508.29057@lists.openembedded.org>
4 siblings, 1 reply; 9+ messages in thread
From: Mathieu Dubois-Briand @ 2024-11-20 14:44 UTC (permalink / raw)
To: hongxu.jia; +Cc: openembedded-core, JPEWhacker, hongxu.jia
On Tue, Nov 19, 2024 at 09:50:33PM -0800, hongxu via lists.openembedded.org wrote:
> Summary: SPDX 3.0: Reduce redundant spdxid-hash symlinks to save inode on host
>
Hi,
Thanks for the v2, but I believe this is causing some issues on the
autobuilder:
ERROR: python3-dbusmock-0.32.2-r0 do_create_package_spdx: Error executing a python function in exec_func_python() autogenerated:
The stack trace of python calls that resulted in this exception/failure was:
[...]
Exception: FileExistsError: [Errno 17] File exists: '../packages/python3-dbusmock-dev.spdx.json' -> '/srv/pokybuild/yocto-worker/qemuppc-alt/build/build/tmp/work/ppc7400-poky-linux/python3-dbusmock/0.32.2/spdx/3.0.1/runtime-deploy/ppc7400/by-spdxid-link/python3-dbusmock.spdx.json'
And same kind of error for several packages, on most of the builders.
https://valkyrie.yoctoproject.org/#/builders/64/builds/408/steps/12/logs/stdio
Can you have a look at this, please ?
--
Mathieu Dubois-Briand, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [OE-core] [RR V2][NULL][0/3] SPDX 3.0: Reduce redundant spdxid-hash symlinks to save inode on host
2024-11-20 14:44 ` [OE-core] [RR V2][NULL][0/3] SPDX 3.0: Reduce redundant spdxid-hash symlinks to save inode on host Mathieu Dubois-Briand
@ 2024-11-21 3:05 ` Jia, Hongxu
0 siblings, 0 replies; 9+ messages in thread
From: Jia, Hongxu @ 2024-11-21 3:05 UTC (permalink / raw)
To: Mathieu Dubois-Briand
Cc: openembedded-core@lists.openembedded.org, JPEWhacker@gmail.com
[-- Attachment #1: Type: text/plain, Size: 2714 bytes --]
Hi,
From the error log, it seems you do not apply patch '[PATCH V2 1/3] sbom30/spdx30: add link prefix and name to namespace of spdxId and alias'
There are three patches for this review:
[PATCH V2 1/3] sbom30/spdx30: add link prefix and name to namespace of spdxId and alias
[PATCH V2 2/3] sbom30.py: reduce redundant spdxid symlinks to save inode on host
[PATCH 3/3] oeqa/selftest: Add SPDX 3.0 include source cases for core_image_minimal build
[...]
Exception: FileExistsError: [Errno 17] File exists: '../packages/python3-dbusmock-dev.spdx.json' -> '/srv/pokybuild/yocto-worker/qemuppc-alt/build/build/tmp/work/ppc7400-poky-linux/python3-dbusmock/0.32.2/spdx/3.0.1/runtime-deploy/ppc7400/by-spdxid-link/python3-dbusmock.spdx.json'
[...]
As comparing, after applying the patches I my build, the link should have "package" prefix and "-dev" suffix, runtime-deploy/core2-64/by-spdxid-link/package-python3-dbusmock-dev.spdx.json -> ../packages/python3-dbusmock-dev.spdx.json
//Hongxu
________________________________
From: Mathieu Dubois-Briand <mathieu.dubois-briand@bootlin.com>
Sent: Wednesday, November 20, 2024 10:44 PM
To: Jia, Hongxu <Hongxu.Jia@windriver.com>
Cc: openembedded-core@lists.openembedded.org <openembedded-core@lists.openembedded.org>; JPEWhacker@gmail.com <JPEWhacker@gmail.com>; Jia, Hongxu <Hongxu.Jia@windriver.com>
Subject: Re: [OE-core] [RR V2][NULL][0/3] SPDX 3.0: Reduce redundant spdxid-hash symlinks to save inode on host
CAUTION: This email comes from a non Wind River email account!
Do not click links or open attachments unless you recognize the sender and know the content is safe.
On Tue, Nov 19, 2024 at 09:50:33PM -0800, hongxu via lists.openembedded.org wrote:
> Summary: SPDX 3.0: Reduce redundant spdxid-hash symlinks to save inode on host
>
Hi,
Thanks for the v2, but I believe this is causing some issues on the
autobuilder:
ERROR: python3-dbusmock-0.32.2-r0 do_create_package_spdx: Error executing a python function in exec_func_python() autogenerated:
The stack trace of python calls that resulted in this exception/failure was:
[...]
Exception: FileExistsError: [Errno 17] File exists: '../packages/python3-dbusmock-dev.spdx.json' -> '/srv/pokybuild/yocto-worker/qemuppc-alt/build/build/tmp/work/ppc7400-poky-linux/python3-dbusmock/0.32.2/spdx/3.0.1/runtime-deploy/ppc7400/by-spdxid-link/python3-dbusmock.spdx.json'
And same kind of error for several packages, on most of the builders.
https://valkyrie.yoctoproject.org/#/builders/64/builds/408/steps/12/logs/stdio
Can you have a look at this, please ?
--
Mathieu Dubois-Briand, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com
[-- Attachment #2: Type: text/html, Size: 7384 bytes --]
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [oe-core][PATCH V2 1/3] sbom30/spdx30: add link prefix and name to namespace of spdxId and alias
[not found] ` <1809974167D85508.29057@lists.openembedded.org>
@ 2024-11-21 17:16 ` Jia, Hongxu
0 siblings, 0 replies; 9+ messages in thread
From: Jia, Hongxu @ 2024-11-21 17:16 UTC (permalink / raw)
To: openembedded-core@lists.openembedded.org, JPEWhacker@gmail.com
[-- Attachment #1: Type: text/plain, Size: 8663 bytes --]
Ping Joshua
//Hongxu
________________________________
From: openembedded-core@lists.openembedded.org <openembedded-core@lists.openembedded.org> on behalf of hongxu via lists.openembedded.org <hongxu.jia=eng.windriver.com@lists.openembedded.org>
Sent: Wednesday, November 20, 2024 1:50 PM
To: openembedded-core@lists.openembedded.org <openembedded-core@lists.openembedded.org>; JPEWhacker@gmail.com <JPEWhacker@gmail.com>; Jia, Hongxu <Hongxu.Jia@windriver.com>
Subject: [oe-core][PATCH V2 1/3] sbom30/spdx30: add link prefix and name to namespace of spdxId and alias
In order to simple reference the SPDX ID to instead of making jsonld hash
path for each element, only creating one symlink for one file and referencing
it multiple times, add link prefix and name to the namespace of spdxId and alias
to replace ${PN} to avoid namespace conflict between recipe, packages and images.
Take recipe shadow, package shadow and package shadow-src for example:
Without this commit, spdxId and alias in recipe and package jsonld have the same
namespace
spdxId: http://spdx.org/spdxdocs/shadow-xxx/...
alias: shadow/UNIHASH/...
After apply this commit, the namespace of spdxId in recipe and package jsonld differs:
In recipe jsonld tmp/deploy/spdx/3.0.1/core2-64/recipes/shadow.spdx.json
spdxId: http://spdx.org/spdxdocs/recipe-shadow-xxx/...
alias: recipe-shadow/UNIHASH/...
In package jsonld tmp/deploy/spdx/3.0.1/core2-64/packages/shadow.spdx.json
spdxId: http://spdx.org/spdxdocs/package-shadow-xxx/...
alias: package-shadow/UNIHASH/...
In package jsonld tmp/deploy/spdx/3.0.1/core2-64/packages/shadow-src.spdx.json
spdxId: http://spdx.org/spdxdocs/package-shadow-src-xxx/...
alias: package-shadow-src/UNIHASH/...
Then will use namespace of spdxId and alias to create link for jsonld file,
one symlink for one jsonld file, referenced by elements multiple times
Signed-off-by: Hongxu Jia <hongxu.jia@windriver.com>
---
meta/lib/oe/sbom30.py | 27 +++++++++++++++++----------
meta/lib/oe/spdx30_tasks.py | 13 +++++++------
2 files changed, 24 insertions(+), 16 deletions(-)
diff --git a/meta/lib/oe/sbom30.py b/meta/lib/oe/sbom30.py
index e3a9428668..7033bcdf5b 100644
--- a/meta/lib/oe/sbom30.py
+++ b/meta/lib/oe/sbom30.py
@@ -217,9 +217,11 @@ def to_list(l):
class ObjectSet(oe.spdx30.SHACLObjectSet):
- def __init__(self, d):
+ def __init__(self, d, name=None, link_prefix=None):
super().__init__()
self.d = d
+ self.name = name
+ self.link_prefix = link_prefix
def create_index(self):
self.by_sha256_hash = {}
@@ -322,6 +324,8 @@ class ObjectSet(oe.spdx30.SHACLObjectSet):
uuid.NAMESPACE_DNS, self.d.getVar("SPDX_UUID_NAMESPACE")
)
pn = self.d.getVar("PN")
+ if self.link_prefix and self.name:
+ pn = "%s-%s" % (self.link_prefix, self.name)
return "%s/%s-%s" % (
self.d.getVar("SPDX_NAMESPACE_PREFIX"),
pn,
@@ -341,10 +345,13 @@ class ObjectSet(oe.spdx30.SHACLObjectSet):
elif namespace not in e._id:
bb.warn(f"Namespace {namespace} not found in {e._id}")
else:
+ pn = self.d.getVar("PN")
+ if self.link_prefix and self.name:
+ pn = "%s-%s" % (self.link_prefix, self.name)
alias_ext = set_alias(
e,
e._id.replace(unihash, "UNIHASH").replace(
- namespace, self.d.getVar("PN")
+ namespace, pn
),
)
@@ -803,8 +810,8 @@ class ObjectSet(oe.spdx30.SHACLObjectSet):
)
@classmethod
- def new_objset(cls, d, name, copy_from_bitbake_doc=True):
- objset = cls(d)
+ def new_objset(cls, d, name, copy_from_bitbake_doc=True, link_prefix=None):
+ objset = cls(d, name=name, link_prefix=link_prefix)
document = oe.spdx30.SpdxDocument(
_id=objset.new_spdxid("document", name),
@@ -885,9 +892,9 @@ class ObjectSet(oe.spdx30.SHACLObjectSet):
return missing_spdxids
-def load_jsonld(d, path, required=False):
+def load_jsonld(d, path, required=False, name=None, link_prefix=None):
deserializer = oe.spdx30.JSONLDDeserializer()
- objset = ObjectSet(d)
+ objset = ObjectSet(d, name=name, link_prefix=link_prefix)
try:
with path.open("rb") as f:
deserializer.read(f, objset)
@@ -916,9 +923,9 @@ def jsonld_hash_path(_id):
return Path("by-spdxid-hash") / h[:2], h
-def load_jsonld_by_arch(d, arch, subdir, name, *, required=False):
+def load_jsonld_by_arch(d, arch, subdir, name, *, required=False, link_prefix=None):
path = jsonld_arch_path(d, arch, subdir, name)
- objset = load_jsonld(d, path, required=required)
+ objset = load_jsonld(d, path, required=required, name=name, link_prefix=link_prefix)
if objset is not None:
return (objset, path)
return (None, None)
@@ -1047,8 +1054,8 @@ def find_root_obj_in_jsonld(d, subdir, fn_name, obj_type, **attr_filter):
return spdx_obj, objset
-def load_obj_in_jsonld(d, arch, subdir, fn_name, obj_type, **attr_filter):
- objset, fn = load_jsonld_by_arch(d, arch, subdir, fn_name, required=True)
+def load_obj_in_jsonld(d, arch, subdir, fn_name, obj_type, link_prefix=None, **attr_filter):
+ objset, fn = load_jsonld_by_arch(d, arch, subdir, fn_name, required=True, link_prefix=link_prefix)
spdx_obj = objset.find_filter(obj_type, **attr_filter)
if not spdx_obj:
diff --git a/meta/lib/oe/spdx30_tasks.py b/meta/lib/oe/spdx30_tasks.py
index 5aeed5cd6f..ef829fbbf1 100644
--- a/meta/lib/oe/spdx30_tasks.py
+++ b/meta/lib/oe/spdx30_tasks.py
@@ -461,7 +461,7 @@ def create_spdx(d):
if not include_vex in ("none", "current", "all"):
bb.fatal("SPDX_INCLUDE_VEX must be one of 'none', 'current', 'all'")
- build_objset = oe.sbom30.ObjectSet.new_objset(d, d.getVar("PN"))
+ build_objset = oe.sbom30.ObjectSet.new_objset(d, d.getVar("PN"), link_prefix="recipe")
build = build_objset.new_task_build("recipe", "recipe")
build_objset.set_element_alias(build)
@@ -574,7 +574,7 @@ def create_spdx(d):
bb.debug(1, "Creating SPDX for package %s" % pkg_name)
- pkg_objset = oe.sbom30.ObjectSet.new_objset(d, pkg_name)
+ pkg_objset = oe.sbom30.ObjectSet.new_objset(d, pkg_name, link_prefix="package")
spdx_package = pkg_objset.add_root(
oe.spdx30.software_Package(
@@ -793,7 +793,7 @@ def create_package_spdx(d):
# Any element common to all packages that need to be referenced by ID
# should be written into this objset set
common_objset = oe.sbom30.ObjectSet.new_objset(
- d, "%s-package-common" % d.getVar("PN")
+ d, "%s-package-common" % d.getVar("PN"), link_prefix="package"
)
pkgdest = Path(d.getVar("PKGDEST"))
@@ -812,6 +812,7 @@ def create_package_spdx(d):
"packages-staging",
pkg_name,
oe.spdx30.software_Package,
+ link_prefix="package",
software_primaryPurpose=oe.spdx30.software_SoftwarePurpose.install,
)
@@ -1002,7 +1003,7 @@ def create_rootfs_spdx(d):
with root_packages_file.open("r") as f:
packages = json.load(f)
- objset = oe.sbom30.ObjectSet.new_objset(d, "%s-%s" % (image_basename, machine))
+ objset = oe.sbom30.ObjectSet.new_objset(d, "%s-%s" % (image_basename, machine), link_prefix="rootfs")
rootfs = objset.add_root(
oe.spdx30.software_Package(
@@ -1037,7 +1038,7 @@ def create_image_spdx(d):
image_basename = d.getVar("IMAGE_BASENAME")
machine = d.getVar("MACHINE")
- objset = oe.sbom30.ObjectSet.new_objset(d, "%s-%s" % (image_basename, machine))
+ objset = oe.sbom30.ObjectSet.new_objset(d, "%s-%s" % (image_basename, machine), link_prefix="image")
with manifest_path.open("r") as f:
manifest = json.load(f)
@@ -1150,7 +1151,7 @@ def sdk_create_spdx(d, sdk_type, spdx_work_dir, toolchain_outputname):
sdk_name = toolchain_outputname + "-" + sdk_type
sdk_packages = oe.sdk.sdk_list_installed_packages(d, sdk_type == "target")
- objset = oe.sbom30.ObjectSet.new_objset(d, sdk_name)
+ objset = oe.sbom30.ObjectSet.new_objset(d, sdk_name, link_prefix="sdk")
sdk_rootfs = objset.add_root(
oe.spdx30.software_Package(
--
2.25.1
[-- Attachment #2: Type: text/html, Size: 15423 bytes --]
^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [OE-core] [RR V2][NULL][0/3] SPDX 3.0: Reduce redundant spdxid-hash symlinks to save inode on host
[not found] <180997414F6EBDC6.32520@lists.openembedded.org>
@ 2024-11-21 17:17 ` Jia, Hongxu
2024-11-21 17:29 ` Joshua Watt
0 siblings, 1 reply; 9+ messages in thread
From: Jia, Hongxu @ 2024-11-21 17:17 UTC (permalink / raw)
To: openembedded-core@lists.openembedded.org, JPEWhacker@gmail.com,
Jia, Hongxu
[-- Attachment #1: Type: text/plain, Size: 9868 bytes --]
Ping Joshua
//Hongxu
________________________________
From: openembedded-core@lists.openembedded.org <openembedded-core@lists.openembedded.org> on behalf of hongxu via lists.openembedded.org <hongxu.jia=eng.windriver.com@lists.openembedded.org>
Sent: Wednesday, November 20, 2024 1:50 PM
To: openembedded-core@lists.openembedded.org <openembedded-core@lists.openembedded.org>; JPEWhacker@gmail.com <JPEWhacker@gmail.com>; Jia, Hongxu <Hongxu.Jia@windriver.com>
Subject: [OE-core] [RR V2][NULL][0/3] SPDX 3.0: Reduce redundant spdxid-hash symlinks to save inode on host
Summary: SPDX 3.0: Reduce redundant spdxid-hash symlinks to save inode on host
* Git logs
[oe-core]
commit 5ebf6f058259bc073e83bd2fa2b3b116e6156d60
Author: Hongxu Jia <hongxu.jia@windriver.com>
Date: Sat Nov 9 17:16:31 2024 +0800
oeqa/selftest: Add SPDX 3.0 include source cases for core_image_minimal build
$ oe-selftest -r spdx.SPDX30Check.test_core_image_minimal_include_source
2024-11-20 03:29:24,850 - oe-selftest - INFO - Adding layer libraries:
2024-11-20 03:29:24,850 - oe-selftest - INFO - path-to/poky/meta/lib
2024-11-20 03:29:24,850 - oe-selftest - INFO - path-to/poky/meta-yocto-bsp/lib
2024-11-20 03:29:24,850 - oe-selftest - INFO - path-to/poky/meta-selftest/lib
2024-11-20 03:29:24,850 - oe-selftest - INFO - path-to/meta-openembedded/meta-oe/lib
2024-11-20 03:29:24,868 - oe-selftest - INFO - Checking base configuration is valid/parsable
2024-11-20 03:29:27,317 - oe-selftest - INFO - Adding: "include selftest.inc" in path-to/build_spdx3-st/conf/local.conf
2024-11-20 03:29:27,317 - oe-selftest - INFO - Adding: "include bblayers.inc" in bblayers.conf
2024-11-20 03:29:27,317 - oe-selftest - INFO - test_core_image_minimal_include_source (spdx.SPDX30Check.test_core_image_minimal_include_source)
2024-11-20 04:52:47,318 - oe-selftest - INFO - Keepalive message
2024-11-20 05:14:08,115 - oe-selftest - INFO - ... ok
2024-11-20 05:21:12,798 - oe-selftest - INFO - ----------------------------------------------------------------------
2024-11-20 05:21:12,798 - oe-selftest - INFO - Ran 1 test in 6706.271s
2024-11-20 05:21:12,798 - oe-selftest - INFO - OK
2024-11-20 05:21:32,026 - oe-selftest - INFO - RESULTS:
2024-11-20 05:21:32,026 - oe-selftest - INFO - RESULTS - spdx.SPDX30Check.test_core_image_minimal_include_source: PASSED (6280.82s)
2024-11-20 05:21:32,027 - oe-selftest - INFO - SUMMARY:
2024-11-20 05:21:32,027 - oe-selftest - INFO - oe-selftest () - Ran 1 test in 6706.272s
2024-11-20 05:21:32,027 - oe-selftest - INFO - oe-selftest - OK - All required tests passed (successes=1, skipped=0, failures=0, errors=0)
Signed-off-by: Hongxu Jia <hongxu.jia@windriver.com>
commit 3753b084cffcbef374093a442d4e692821d1a29b
Author: Hongxu Jia <hongxu.jia@windriver.com>
Date: Sat Nov 9 14:18:26 2024 +0800
sbom30.py: reduce redundant spdxid symlinks to save inode on host
In order to support all in-scope SPDX data within a single
JSON-LD file for SPDX 3.0.1, Yocto's SBOM:
- In native/target/nativesdk recipe, created spdxid-hash symlink
for each element to point to the JSON-LD file that contains
element details;
- In image recipe, use spdxid-hash symlink to collect element
details from varies of JSON-LD files
While SPDX_INCLUDE_SOURCES = "1", it adds sources to JSON-LD file
and create 2N+ spdxid-hash symlinks for N source files.
(N for software_File, N for hasDeclaredLicense's Relationship)
For large numbers of source files, adding an extra symlink -> real file
will occupy one more inode (per file), which will need a slot in
the OS's inode cache. In this situation, disk performance is slow
and inode is used up quickly
After commit [sbom30/spdx30: add link prefix and name to namespace
of spdxId and alias] applied, the namespace of spdxId and alias in
recipe and package jsonld differs. Use it to create symlink to jsonld,
take recipe shadow, package shadow and package shadow-src for example:
For recipe jsonld tmp/deploy/spdx/3.0.1/core2-64/recipes/shadow.spdx.json
spdxId: http://spdx.org/spdxdocs/recipe-shadow-xxx/...
alias: recipe-shadow/UNIHASH/...
symlink: tmp/deploy/spdx/3.0.1/core2-64/by-spdxid-link/recipe-shadow.spdx.json -> ../recipes/shadow.spdx.json
For package jsonld tmp/deploy/spdx/3.0.1/core2-64/packages/shadow.spdx.json
spdxId: http://spdx.org/spdxdocs/package-shadow-xxx/...
alias: package-shadow/UNIHASH/...
symlink: tmp/deploy/spdx/3.0.1/core2-64/by-spdxid-link/package-shadow.spdx.json -> ../packages/shadow.spdx.json
In package jsonld tmp/deploy/spdx/3.0.1/core2-64/packages/shadow-src.spdx.json
spdxId: http://spdx.org/spdxdocs/package-shadow-src-xxx/...
alias: package-shadow-src/UNIHASH/...
symlink: tmp/deploy/spdx/3.0.1/core2-64/by-spdxid-link/package-shadow-src.spdx.json -> ../packages/shadow-src.spdx.json
Build core-image-minimal with/without this commit, comparing the spdxid-link
number, 7 281 824 -> 6 043
echo 'SPDX_INCLUDE_SOURCES = "1"' >> local.conf
Without this commit:
$ time bitbake core-image-minimal
real 100m17.769s
user 0m24.516s
sys 0m4.334s
$ find tmp/deploy/spdx/3.0.1/*/by-spdxid-hash -name "*.json" |wc -l
7281824
With this commit:
$ time bitbake core-image-minimal
real 85m12.994s
user 0m20.423s
sys 0m4.228s
$ find tmp/deploy/spdx/3.0.1/*/by-spdxid-link -name "*.json" |wc -l
6043
Signed-off-by: Hongxu Jia <hongxu.jia@windriver.com>
commit 0ea8bcaa9a8fe63f1935e02968fbaa541734024b
Author: Hongxu Jia <hongxu.jia@windriver.com>
Date: Tue Nov 19 20:12:37 2024 +0800
sbom30/spdx30: add link prefix and name to namespace of spdxId and alias
In order to simple reference the SPDX ID to instead of making jsonld hash
path for each element, only creating one symlink for one file and referencing
it multiple times, add link prefix and name to the namespace of spdxId and alias
to replace ${PN} to avoid namespace conflict between recipe, packages and images.
Take recipe shadow, package shadow and package shadow-src for example:
Without this commit, spdxId and alias in recipe and package jsonld have the same
namespace
spdxId: http://spdx.org/spdxdocs/shadow-xxx/...
alias: shadow/UNIHASH/...
After apply this commit, the namespace of spdxId in recipe and package jsonld differs:
In recipe jsonld tmp/deploy/spdx/3.0.1/core2-64/recipes/shadow.spdx.json
spdxId: http://spdx.org/spdxdocs/recipe-shadow-xxx/...
alias: recipe-shadow/UNIHASH/...
In package jsonld tmp/deploy/spdx/3.0.1/core2-64/packages/shadow.spdx.json
spdxId: http://spdx.org/spdxdocs/package-shadow-xxx/...
alias: package-shadow/UNIHASH/...
In package jsonld tmp/deploy/spdx/3.0.1/core2-64/packages/shadow-src.spdx.json
spdxId: http://spdx.org/spdxdocs/package-shadow-src-xxx/...
alias: package-shadow-src/UNIHASH/...
Then will use namespace of spdxId and alias to create link for jsonld file,
one symlink for one jsonld file, referenced by elements multiple times
Signed-off-by: Hongxu Jia <hongxu.jia@windriver.com>
====== Testing ======
* Commands
Build core-image-minimal with/without this commit, comparing the spdxid-link
number, 7 281 824 -> 6 043
echo 'SPDX_INCLUDE_SOURCES = "1"' >> local.conf
Without this commit:
$ time bitbake core-image-minimal
real 100m17.769s
user 0m24.516s
sys 0m4.334s
$ find tmp/deploy/spdx/3.0.1/*/by-spdxid-hash -name "*.json" |wc -l
7281824
With this commit:
$ time bitbake core-image-minimal
real 85m12.994s
user 0m20.423s
sys 0m4.228s
$ find tmp/deploy/spdx/3.0.1/*/by-spdxid-link -name "*.json" |wc -l
6043
$ oe-selftest -r spdx.SPDX30Check.test_core_image_minimal_include_source
2024-11-20 03:29:24,850 - oe-selftest - INFO - Adding layer libraries:
2024-11-20 03:29:24,850 - oe-selftest - INFO - path-to/poky/meta/lib
2024-11-20 03:29:24,850 - oe-selftest - INFO - path-to/poky/meta-yocto-bsp/lib
2024-11-20 03:29:24,850 - oe-selftest - INFO - path-to/poky/meta-selftest/lib
2024-11-20 03:29:24,850 - oe-selftest - INFO - path-to/meta-openembedded/meta-oe/lib
2024-11-20 03:29:24,868 - oe-selftest - INFO - Checking base configuration is valid/parsable
2024-11-20 03:29:27,317 - oe-selftest - INFO - Adding: "include selftest.inc" in path-to/build_spdx3-st/conf/local.conf
2024-11-20 03:29:27,317 - oe-selftest - INFO - Adding: "include bblayers.inc" in bblayers.conf
2024-11-20 03:29:27,317 - oe-selftest - INFO - test_core_image_minimal_include_source (spdx.SPDX30Check.test_core_image_minimal_include_source)
2024-11-20 04:52:47,318 - oe-selftest - INFO - Keepalive message
2024-11-20 05:14:08,115 - oe-selftest - INFO - ... ok
2024-11-20 05:21:12,798 - oe-selftest - INFO - ----------------------------------------------------------------------
2024-11-20 05:21:12,798 - oe-selftest - INFO - Ran 1 test in 6706.271s
2024-11-20 05:21:12,798 - oe-selftest - INFO - OK
2024-11-20 05:21:32,026 - oe-selftest - INFO - RESULTS:
2024-11-20 05:21:32,026 - oe-selftest - INFO - RESULTS - spdx.SPDX30Check.test_core_image_minimal_include_source: PASSED (6280.82s)
2024-11-20 05:21:32,027 - oe-selftest - INFO - SUMMARY:
2024-11-20 05:21:32,027 - oe-selftest - INFO - oe-selftest () - Ran 1 test in 6706.272s
2024-11-20 05:21:32,027 - oe-selftest - INFO - oe-selftest - OK - All required tests passed (successes=1, skipped=0, failures=0, errors=0)
[-- Attachment #2: Type: text/html, Size: 15140 bytes --]
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [OE-core] [RR V2][NULL][0/3] SPDX 3.0: Reduce redundant spdxid-hash symlinks to save inode on host
2024-11-21 17:17 ` [OE-core] [RR V2][NULL][0/3] SPDX 3.0: Reduce redundant spdxid-hash symlinks to save inode on host Jia, Hongxu
@ 2024-11-21 17:29 ` Joshua Watt
0 siblings, 0 replies; 9+ messages in thread
From: Joshua Watt @ 2024-11-21 17:29 UTC (permalink / raw)
To: Jia, Hongxu; +Cc: openembedded-core@lists.openembedded.org
Ya, I need to look this over closely to try to understand your solution :)
On Thu, Nov 21, 2024 at 10:17 AM Jia, Hongxu <Hongxu.Jia@windriver.com> wrote:
>
> Ping Joshua
>
> //Hongxu
>
> ________________________________
> From: openembedded-core@lists.openembedded.org <openembedded-core@lists.openembedded.org> on behalf of hongxu via lists.openembedded.org <hongxu.jia=eng.windriver.com@lists.openembedded.org>
> Sent: Wednesday, November 20, 2024 1:50 PM
> To: openembedded-core@lists.openembedded.org <openembedded-core@lists.openembedded.org>; JPEWhacker@gmail.com <JPEWhacker@gmail.com>; Jia, Hongxu <Hongxu.Jia@windriver.com>
> Subject: [OE-core] [RR V2][NULL][0/3] SPDX 3.0: Reduce redundant spdxid-hash symlinks to save inode on host
>
> Summary: SPDX 3.0: Reduce redundant spdxid-hash symlinks to save inode on host
>
> * Git logs
> [oe-core]
> commit 5ebf6f058259bc073e83bd2fa2b3b116e6156d60
> Author: Hongxu Jia <hongxu.jia@windriver.com>
> Date: Sat Nov 9 17:16:31 2024 +0800
>
> oeqa/selftest: Add SPDX 3.0 include source cases for core_image_minimal build
>
> $ oe-selftest -r spdx.SPDX30Check.test_core_image_minimal_include_source
> 2024-11-20 03:29:24,850 - oe-selftest - INFO - Adding layer libraries:
> 2024-11-20 03:29:24,850 - oe-selftest - INFO - path-to/poky/meta/lib
> 2024-11-20 03:29:24,850 - oe-selftest - INFO - path-to/poky/meta-yocto-bsp/lib
> 2024-11-20 03:29:24,850 - oe-selftest - INFO - path-to/poky/meta-selftest/lib
> 2024-11-20 03:29:24,850 - oe-selftest - INFO - path-to/meta-openembedded/meta-oe/lib
> 2024-11-20 03:29:24,868 - oe-selftest - INFO - Checking base configuration is valid/parsable
> 2024-11-20 03:29:27,317 - oe-selftest - INFO - Adding: "include selftest.inc" in path-to/build_spdx3-st/conf/local.conf
> 2024-11-20 03:29:27,317 - oe-selftest - INFO - Adding: "include bblayers.inc" in bblayers.conf
> 2024-11-20 03:29:27,317 - oe-selftest - INFO - test_core_image_minimal_include_source (spdx.SPDX30Check.test_core_image_minimal_include_source)
> 2024-11-20 04:52:47,318 - oe-selftest - INFO - Keepalive message
> 2024-11-20 05:14:08,115 - oe-selftest - INFO - ... ok
> 2024-11-20 05:21:12,798 - oe-selftest - INFO - ----------------------------------------------------------------------
> 2024-11-20 05:21:12,798 - oe-selftest - INFO - Ran 1 test in 6706.271s
> 2024-11-20 05:21:12,798 - oe-selftest - INFO - OK
> 2024-11-20 05:21:32,026 - oe-selftest - INFO - RESULTS:
> 2024-11-20 05:21:32,026 - oe-selftest - INFO - RESULTS - spdx.SPDX30Check.test_core_image_minimal_include_source: PASSED (6280.82s)
> 2024-11-20 05:21:32,027 - oe-selftest - INFO - SUMMARY:
> 2024-11-20 05:21:32,027 - oe-selftest - INFO - oe-selftest () - Ran 1 test in 6706.272s
> 2024-11-20 05:21:32,027 - oe-selftest - INFO - oe-selftest - OK - All required tests passed (successes=1, skipped=0, failures=0, errors=0)
>
> Signed-off-by: Hongxu Jia <hongxu.jia@windriver.com>
>
> commit 3753b084cffcbef374093a442d4e692821d1a29b
> Author: Hongxu Jia <hongxu.jia@windriver.com>
> Date: Sat Nov 9 14:18:26 2024 +0800
>
> sbom30.py: reduce redundant spdxid symlinks to save inode on host
>
> In order to support all in-scope SPDX data within a single
> JSON-LD file for SPDX 3.0.1, Yocto's SBOM:
> - In native/target/nativesdk recipe, created spdxid-hash symlink
> for each element to point to the JSON-LD file that contains
> element details;
> - In image recipe, use spdxid-hash symlink to collect element
> details from varies of JSON-LD files
>
> While SPDX_INCLUDE_SOURCES = "1", it adds sources to JSON-LD file
> and create 2N+ spdxid-hash symlinks for N source files.
> (N for software_File, N for hasDeclaredLicense's Relationship)
>
> For large numbers of source files, adding an extra symlink -> real file
> will occupy one more inode (per file), which will need a slot in
> the OS's inode cache. In this situation, disk performance is slow
> and inode is used up quickly
>
> After commit [sbom30/spdx30: add link prefix and name to namespace
> of spdxId and alias] applied, the namespace of spdxId and alias in
> recipe and package jsonld differs. Use it to create symlink to jsonld,
> take recipe shadow, package shadow and package shadow-src for example:
>
> For recipe jsonld tmp/deploy/spdx/3.0.1/core2-64/recipes/shadow.spdx.json
>
> spdxId: http://spdx.org/spdxdocs/recipe-shadow-xxx/...
> alias: recipe-shadow/UNIHASH/...
> symlink: tmp/deploy/spdx/3.0.1/core2-64/by-spdxid-link/recipe-shadow.spdx.json -> ../recipes/shadow.spdx.json
>
> For package jsonld tmp/deploy/spdx/3.0.1/core2-64/packages/shadow.spdx.json
>
> spdxId: http://spdx.org/spdxdocs/package-shadow-xxx/...
> alias: package-shadow/UNIHASH/...
> symlink: tmp/deploy/spdx/3.0.1/core2-64/by-spdxid-link/package-shadow.spdx.json -> ../packages/shadow.spdx.json
>
> In package jsonld tmp/deploy/spdx/3.0.1/core2-64/packages/shadow-src.spdx.json
>
> spdxId: http://spdx.org/spdxdocs/package-shadow-src-xxx/...
> alias: package-shadow-src/UNIHASH/...
> symlink: tmp/deploy/spdx/3.0.1/core2-64/by-spdxid-link/package-shadow-src.spdx.json -> ../packages/shadow-src.spdx.json
>
> Build core-image-minimal with/without this commit, comparing the spdxid-link
> number, 7 281 824 -> 6 043
>
> echo 'SPDX_INCLUDE_SOURCES = "1"' >> local.conf
>
> Without this commit:
> $ time bitbake core-image-minimal
> real 100m17.769s
> user 0m24.516s
> sys 0m4.334s
>
> $ find tmp/deploy/spdx/3.0.1/*/by-spdxid-hash -name "*.json" |wc -l
> 7281824
>
> With this commit:
> $ time bitbake core-image-minimal
> real 85m12.994s
> user 0m20.423s
> sys 0m4.228s
>
> $ find tmp/deploy/spdx/3.0.1/*/by-spdxid-link -name "*.json" |wc -l
> 6043
>
> Signed-off-by: Hongxu Jia <hongxu.jia@windriver.com>
>
> commit 0ea8bcaa9a8fe63f1935e02968fbaa541734024b
> Author: Hongxu Jia <hongxu.jia@windriver.com>
> Date: Tue Nov 19 20:12:37 2024 +0800
>
> sbom30/spdx30: add link prefix and name to namespace of spdxId and alias
>
> In order to simple reference the SPDX ID to instead of making jsonld hash
> path for each element, only creating one symlink for one file and referencing
> it multiple times, add link prefix and name to the namespace of spdxId and alias
> to replace ${PN} to avoid namespace conflict between recipe, packages and images.
>
> Take recipe shadow, package shadow and package shadow-src for example:
> Without this commit, spdxId and alias in recipe and package jsonld have the same
> namespace
>
> spdxId: http://spdx.org/spdxdocs/shadow-xxx/...
> alias: shadow/UNIHASH/...
>
> After apply this commit, the namespace of spdxId in recipe and package jsonld differs:
> In recipe jsonld tmp/deploy/spdx/3.0.1/core2-64/recipes/shadow.spdx.json
>
> spdxId: http://spdx.org/spdxdocs/recipe-shadow-xxx/...
> alias: recipe-shadow/UNIHASH/...
>
> In package jsonld tmp/deploy/spdx/3.0.1/core2-64/packages/shadow.spdx.json
>
> spdxId: http://spdx.org/spdxdocs/package-shadow-xxx/...
> alias: package-shadow/UNIHASH/...
>
> In package jsonld tmp/deploy/spdx/3.0.1/core2-64/packages/shadow-src.spdx.json
>
> spdxId: http://spdx.org/spdxdocs/package-shadow-src-xxx/...
> alias: package-shadow-src/UNIHASH/...
>
> Then will use namespace of spdxId and alias to create link for jsonld file,
> one symlink for one jsonld file, referenced by elements multiple times
>
> Signed-off-by: Hongxu Jia <hongxu.jia@windriver.com>
>
>
>
> ====== Testing ======
> * Commands
>
> Build core-image-minimal with/without this commit, comparing the spdxid-link
> number, 7 281 824 -> 6 043
>
> echo 'SPDX_INCLUDE_SOURCES = "1"' >> local.conf
>
> Without this commit:
> $ time bitbake core-image-minimal
> real 100m17.769s
> user 0m24.516s
> sys 0m4.334s
>
> $ find tmp/deploy/spdx/3.0.1/*/by-spdxid-hash -name "*.json" |wc -l
> 7281824
>
> With this commit:
> $ time bitbake core-image-minimal
> real 85m12.994s
> user 0m20.423s
> sys 0m4.228s
>
> $ find tmp/deploy/spdx/3.0.1/*/by-spdxid-link -name "*.json" |wc -l
> 6043
>
>
> $ oe-selftest -r spdx.SPDX30Check.test_core_image_minimal_include_source
> 2024-11-20 03:29:24,850 - oe-selftest - INFO - Adding layer libraries:
> 2024-11-20 03:29:24,850 - oe-selftest - INFO - path-to/poky/meta/lib
> 2024-11-20 03:29:24,850 - oe-selftest - INFO - path-to/poky/meta-yocto-bsp/lib
> 2024-11-20 03:29:24,850 - oe-selftest - INFO - path-to/poky/meta-selftest/lib
> 2024-11-20 03:29:24,850 - oe-selftest - INFO - path-to/meta-openembedded/meta-oe/lib
> 2024-11-20 03:29:24,868 - oe-selftest - INFO - Checking base configuration is valid/parsable
> 2024-11-20 03:29:27,317 - oe-selftest - INFO - Adding: "include selftest.inc" in path-to/build_spdx3-st/conf/local.conf
> 2024-11-20 03:29:27,317 - oe-selftest - INFO - Adding: "include bblayers.inc" in bblayers.conf
> 2024-11-20 03:29:27,317 - oe-selftest - INFO - test_core_image_minimal_include_source (spdx.SPDX30Check.test_core_image_minimal_include_source)
> 2024-11-20 04:52:47,318 - oe-selftest - INFO - Keepalive message
> 2024-11-20 05:14:08,115 - oe-selftest - INFO - ... ok
> 2024-11-20 05:21:12,798 - oe-selftest - INFO - ----------------------------------------------------------------------
> 2024-11-20 05:21:12,798 - oe-selftest - INFO - Ran 1 test in 6706.271s
> 2024-11-20 05:21:12,798 - oe-selftest - INFO - OK
> 2024-11-20 05:21:32,026 - oe-selftest - INFO - RESULTS:
> 2024-11-20 05:21:32,026 - oe-selftest - INFO - RESULTS - spdx.SPDX30Check.test_core_image_minimal_include_source: PASSED (6280.82s)
> 2024-11-20 05:21:32,027 - oe-selftest - INFO - SUMMARY:
> 2024-11-20 05:21:32,027 - oe-selftest - INFO - oe-selftest () - Ran 1 test in 6706.272s
> 2024-11-20 05:21:32,027 - oe-selftest - INFO - oe-selftest - OK - All required tests passed (successes=1, skipped=0, failures=0, errors=0)
>
>
^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2024-11-21 17:30 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-11-20 5:50 [RR V2][NULL][0/3] SPDX 3.0: Reduce redundant spdxid-hash symlinks to save inode on host Hongxu Jia
2024-11-20 5:50 ` [oe-core][PATCH V2 1/3] sbom30/spdx30: add link prefix and name to namespace of spdxId and alias Hongxu Jia
2024-11-20 5:50 ` [oe-core][PATCH V2 2/3] sbom30.py: reduce redundant spdxid symlinks to save inode on host Hongxu Jia
2024-11-20 5:50 ` [oe-core][PATCH 3/3] oeqa/selftest: Add SPDX 3.0 include source cases for core_image_minimal build Hongxu Jia
2024-11-20 14:44 ` [OE-core] [RR V2][NULL][0/3] SPDX 3.0: Reduce redundant spdxid-hash symlinks to save inode on host Mathieu Dubois-Briand
2024-11-21 3:05 ` Jia, Hongxu
[not found] ` <1809974167D85508.29057@lists.openembedded.org>
2024-11-21 17:16 ` [oe-core][PATCH V2 1/3] sbom30/spdx30: add link prefix and name to namespace of spdxId and alias Jia, Hongxu
[not found] <180997414F6EBDC6.32520@lists.openembedded.org>
2024-11-21 17:17 ` [OE-core] [RR V2][NULL][0/3] SPDX 3.0: Reduce redundant spdxid-hash symlinks to save inode on host Jia, Hongxu
2024-11-21 17:29 ` 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.