From: Thomas Perale via buildroot <buildroot@buildroot.org>
To: buildroot@buildroot.org
Cc: Thomas Perale <thomas.perale@mind.be>
Subject: [Buildroot] [PATCH v5 3/8] utils/generate-cyclonedx: move utility function
Date: Wed, 11 Mar 2026 15:04:52 +0100 [thread overview]
Message-ID: <20260311140457.140041-4-thomas.perale@mind.be> (raw)
In-Reply-To: <20260311140457.140041-1-thomas.perale@mind.be>
Move all the utility functions that are not generating CycloneDX
structure to the top of the script and group the CycloneDX generation
function together.
Signed-off-by: Thomas Perale <thomas.perale@mind.be>
---
utils/generate-cyclonedx | 178 +++++++++++++++++++--------------------
1 file changed, 89 insertions(+), 89 deletions(-)
diff --git a/utils/generate-cyclonedx b/utils/generate-cyclonedx
index 52fb8cc3e9..facbd6c78f 100755
--- a/utils/generate-cyclonedx
+++ b/utils/generate-cyclonedx
@@ -78,65 +78,48 @@ def br2_retrieve_spdx_licenses(version: Tuple[int, int]):
return ret
-def split_top_level_comma(subj):
- """Split a string at comma's, but do not split at comma's in between parentheses.
+def br2_virtual_is_provided_by(ref, show_info_dict) -> list:
+ """Retrieve the list of packages that provide a virtual package.
Args:
- subj (str): String to be split.
+ ref (str): The identifier of the virtual package.
+ show_info_dict (dict): The JSON output of the show-info
+ command, parsed into a Python dictionary.
Returns:
- list: A list of substrings
+ list: package list that provides the virtual package.
"""
- counter = 0
- substring = ""
-
- for char in subj:
- if char == "," and counter == 0:
- yield substring
- substring = ""
- else:
- if char == "(":
- counter += 1
- elif char == ")":
- counter -= 1
- substring += char
+ return [
+ name
+ for name, comp in show_info_dict.items()
+ if "provides" in comp and ref in comp["provides"]
+ ]
- yield substring
+def br2_parse_deps(ref, show_info_dict, virtual=False) -> list:
+ """This function will collect all dependencies from the show-info output.
-def cyclonedx_license(lic):
- """Given the name of a license, create an individual entry in
- CycloneDX format. In CycloneDX, the 'id' keyword is used for
- names that are recognized as SPDX License abbreviations. All other
- license names are placed under the 'name' keyword.
+ The dependency on virtual package will collect the final dependency without
+ including the virtual one.
Args:
- lic (str): Name of the license
+ ref (str): The identifier of the package for which the dependencies have
+ to be looked up.
+ show_info_dict (dict): The JSON output of the show-info
+ command, parsed into a Python dictionary.
Returns:
- dict: An entry for the license in CycloneDX format.
+ list: A list of dependencies of the 'ref' package.
"""
- key = "id" if lic in SPDX_LICENSES else "name"
- return {
- key: lic,
- }
-
-
-def cyclonedx_licenses(lic_list):
- """Create a licenses list formatted for a CycloneDX component
+ deps = set()
- Args:
- lic_list (str): A comma separated list of license names.
+ for dep in show_info_dict.get(ref, {}).get("dependencies", []):
+ if not virtual and show_info_dict.get(dep, {}).get("virtual"):
+ deps.update(br2_virtual_is_provided_by(dep, show_info_dict))
+ else:
+ deps.add(dep)
- Returns:
- dict: A dictionary with license information for the component,
- in CycloneDX format.
- """
- return {
- "licenses": [
- {"license": cyclonedx_license(lic.strip())} for lic in split_top_level_comma(lic_list)
- ]
- }
+ return list(deps)
def extract_cves_from_header(header: str) -> list[str]:
@@ -169,7 +152,7 @@ def patch_retrieve_header(content: str) -> str:
DIFF_LINE_REGEX = re.compile(r"^diff\s+(?:--git|-[-\w]+)\s+(\S+)\s+(\S+)$")
INDEX_LINE_REGEX = re.compile(r"^Index:\s+(\S+)$")
- lines = content.split('\n')
+ lines = content.split("\n")
header = []
for i, line in enumerate(lines):
@@ -218,6 +201,67 @@ def read_patch_file(patch_path: Path) -> str:
return content
+def split_top_level_comma(subj):
+ """Split a string at comma's, but do not split at comma's in between parentheses.
+
+ Args:
+ subj (str): String to be split.
+
+ Returns:
+ list: A list of substrings
+ """
+ counter = 0
+ substring = ""
+
+ for char in subj:
+ if char == "," and counter == 0:
+ yield substring
+ substring = ""
+ else:
+ if char == "(":
+ counter += 1
+ elif char == ")":
+ counter -= 1
+ substring += char
+
+ yield substring
+
+
+def cyclonedx_license(lic):
+ """Given the name of a license, create an individual entry in
+ CycloneDX format. In CycloneDX, the 'id' keyword is used for
+ names that are recognized as SPDX License abbreviations. All other
+ license names are placed under the 'name' keyword.
+
+ Args:
+ lic (str): Name of the license
+
+ Returns:
+ dict: An entry for the license in CycloneDX format.
+ """
+ key = "id" if lic in SPDX_LICENSES else "name"
+ return {
+ key: lic,
+ }
+
+
+def cyclonedx_licenses(lic_list):
+ """Create a licenses list formatted for a CycloneDX component
+
+ Args:
+ lic_list (str): A comma separated list of license names.
+
+ Returns:
+ dict: A dictionary with license information for the component,
+ in CycloneDX format.
+ """
+ return {
+ "licenses": [
+ {"license": cyclonedx_license(lic.strip())} for lic in split_top_level_comma(lic_list)
+ ]
+ }
+
+
def cyclonedx_patches(patch_list: list[str]):
"""Translate a list of patches from the show-info JSON to a list of
patches in CycloneDX format.
@@ -358,50 +402,6 @@ def cyclonedx_vulnerabilities(show_info_dict):
} for cve, components in cves.items()]
-def br2_virtual_is_provided_by(ref, show_info_dict) -> list:
- """Retrieve the list of packages that provide a virtual package.
-
- Args:
- ref (str): The identifier of the virtual package.
- show_info_dict (dict): The JSON output of the show-info
- command, parsed into a Python dictionary.
-
- Returns:
- list: package list that provides the virtual package.
- """
- return [
- name
- for name, comp in show_info_dict.items()
- if "provides" in comp and ref in comp["provides"]
- ]
-
-
-def br2_parse_deps(ref, show_info_dict, virtual=False) -> list:
- """This function will collect all dependencies from the show-info output.
-
- The dependency on virtual package will collect the final dependency without
- including the virtual one.
-
- Args:
- ref (str): The identifier of the package for which the dependencies have
- to be looked up.
- show_info_dict (dict): The JSON output of the show-info
- command, parsed into a Python dictionary.
-
- Returns:
- list: A list of dependencies of the 'ref' package.
- """
- deps = set()
-
- for dep in show_info_dict.get(ref, {}).get("dependencies", []):
- if not virtual and show_info_dict.get(dep, {}).get("virtual"):
- deps.update(br2_virtual_is_provided_by(dep, show_info_dict))
- else:
- deps.add(dep)
-
- return list(deps)
-
-
def main():
parser = argparse.ArgumentParser(
description='''Create a CycloneDX SBoM for the Buildroot configuration.
--
2.53.0
_______________________________________________
buildroot mailing list
buildroot@buildroot.org
https://lists.buildroot.org/mailman/listinfo/buildroot
next prev parent reply other threads:[~2026-03-11 14:05 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-03-11 14:04 [Buildroot] [PATCH v5 0/8] Support CycloneDX v1.7 Thomas Perale via buildroot
2026-03-11 14:04 ` [Buildroot] [PATCH v5 1/8] utils/generate-cyclonedx: use tuple for version Thomas Perale via buildroot
2026-04-09 12:08 ` Quentin Schulz via buildroot
2026-04-09 20:27 ` Thomas Perale via buildroot
2026-03-11 14:04 ` [Buildroot] [PATCH v5 2/8] utils/generate-cyclonedx: move license download in a function Thomas Perale via buildroot
2026-04-09 12:12 ` Quentin Schulz via buildroot
2026-03-11 14:04 ` Thomas Perale via buildroot [this message]
2026-04-09 12:27 ` [Buildroot] [PATCH v5 3/8] utils/generate-cyclonedx: move utility function Quentin Schulz via buildroot
2026-03-11 14:04 ` [Buildroot] [PATCH v5 4/8] utils/generate-cyclonedx: encapsulate CycloneDX generation functions Thomas Perale via buildroot
2026-03-11 14:04 ` [Buildroot] [PATCH v5 5/8] utils/generate-cyclonedx: optional bump to v1.7 Thomas Perale via buildroot
2026-04-09 12:40 ` Quentin Schulz via buildroot
2026-03-11 14:04 ` [Buildroot] [PATCH v5 6/8] utils/generate-cyclonedx: mark host packages as external Thomas Perale via buildroot
2026-04-09 12:58 ` Quentin Schulz via buildroot
2026-04-09 20:42 ` Thomas Perale via buildroot
2026-04-09 20:43 ` Thomas Perale via buildroot
2026-04-10 9:12 ` Quentin Schulz via buildroot
2026-03-11 14:04 ` [Buildroot] [PATCH v5 7/8] utils/generate-cyclonedx: add 'id' property to resolves Thomas Perale via buildroot
2026-04-09 13:22 ` Quentin Schulz via buildroot
2026-04-09 20:24 ` Thomas Perale via buildroot
2026-03-11 14:04 ` [Buildroot] [PATCH v5 8/8] utils/generate-cyclonedx: split vulnerabilities per state Thomas Perale via buildroot
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260311140457.140041-4-thomas.perale@mind.be \
--to=buildroot@buildroot.org \
--cc=thomas.perale@mind.be \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox