[PATCH] buildsystem: add imgmanifestjson JSON generation support
Florian Eckert
fe at dev.tdt.de
Fri Sep 19 02:51:21 PDT 2025
The script 'package-metadata.pl' already has a functionality to generate
JSON output from '.packageinfo'. However, this output containing
information about 'all' packages.
This information is also interesting at the image level in order to
further machine-process the information about the installed packages. This
commit adds the creation of a '*.pkg.info.json' file when building the
image.
The creation of the file is disabled by default and can be enabled via the
new Kconfig option 'CONFIG_JSON_PKG_INFO'.
Signed-off-by: Florian Eckert <fe at dev.tdt.de>
---
config/Config-build.in | 7 ++++++
include/image.mk | 6 +++++
scripts/package-metadata.pl | 44 +++++++++++++++++++++++++++++++++++++
3 files changed, 57 insertions(+)
diff --git a/config/Config-build.in b/config/Config-build.in
index 42b353ecf7..197a26a8ae 100644
--- a/config/Config-build.in
+++ b/config/Config-build.in
@@ -34,6 +34,13 @@ menu "Global build settings"
directory containing Software Bill Of Materials in CycloneDX
format.
+ config JSON_PKG_INFO
+ bool "Create packages info JSON"
+ default n
+ help
+ Create a JSON files *.info.pkg.json in the build
+ directory for further machine processing.
+
config ALL_NONSHARED
bool "Select all target specific packages by default"
select ALL_KMODS
diff --git a/include/image.mk b/include/image.mk
index 048e750f33..5b800956f8 100644
--- a/include/image.mk
+++ b/include/image.mk
@@ -340,6 +340,12 @@ ifneq ($(CONFIG_JSON_CYCLONEDX_SBOM),)
$(BIN_DIR)/$(IMG_PREFIX)$(if $(PROFILE_SANITIZED),-$(PROFILE_SANITIZED)).manifest > \
$(BIN_DIR)/$(IMG_PREFIX)$(if $(PROFILE_SANITIZED),-$(PROFILE_SANITIZED)).bom.cdx.json
endif
+ifneq ($(CONFIG_JSON_PKG_INFO),)
+ $(SCRIPT_DIR)/package-metadata.pl imgmanifestjson \
+ $(if $(IB),$(TOPDIR)/.packageinfo, $(TMP_DIR)/.packageinfo) \
+ $(BIN_DIR)/$(IMG_PREFIX)$(if $(PROFILE_SANITIZED),-$(PROFILE_SANITIZED)).manifest > \
+ $(BIN_DIR)/$(IMG_PREFIX)$(if $(PROFILE_SANITIZED),-$(PROFILE_SANITIZED)).pkg.info.json
+endif
endef
define Image/gzip-ext4-padded-squashfs
diff --git a/scripts/package-metadata.pl b/scripts/package-metadata.pl
index 82bd4360f3..90f0946e3a 100755
--- a/scripts/package-metadata.pl
+++ b/scripts/package-metadata.pl
@@ -589,6 +589,48 @@ sub gen_usergroup_list() {
}
}
+sub gen_image_manifest_json() {
+ my $pkginfo = shift @ARGV;
+ my $imgmanifest = shift @ARGV;
+ my $json;
+ my %image_packages;
+
+ %image_packages = image_manifest_packages($imgmanifest);
+ %image_packages or exit 1;
+
+ parse_package_metadata($pkginfo) or exit 1;
+ foreach my $name (sort {uc($a) cmp uc($b)} keys %image_packages) {
+ my %depends;
+ my $pkg = $package{$name};
+ foreach my $dep (@{$pkg->{depends} || []}) {
+ if ($dep =~ m!^\+?(?:[^:]+:)?([^@]+)$!) {
+ $depends{$1}++;
+ }
+ }
+ my @depends = sort keys %depends;
+ my $pkg_deps = join ' ', map { qq/"$_",/ } @depends;
+ $pkg_deps =~ s/\,$//;
+
+ my $pkg_maintainer = join ' ', map { qq/"$_",/ } @{$pkg->{maintainer} || []};
+ $pkg_maintainer =~ s/\,$//;
+
+ $json = <<"END_JSON";
+${json}{
+"name":"$name",
+"version":"$pkg->{version}",
+"category":"$pkg->{category}",
+"license":"$pkg->{license}",
+"cpe_id":"$pkg->{cpe_id}",
+"maintainer": [$pkg_maintainer],
+"depends":[$pkg_deps]},
+END_JSON
+ }
+
+ $json =~ s/[\n\r]//g;
+ $json =~ s/\,$//;
+ print "[$json]";
+}
+
sub gen_package_manifest_json() {
my $json;
parse_package_metadata($ARGV[0]) or exit 1;
@@ -802,6 +844,7 @@ sub parse_command() {
/^kconfig/ and return gen_kconfig_overrides();
/^source$/ and return gen_package_source();
/^pkgaux$/ and return gen_package_auxiliary();
+ /^imgmanifestjson$/ and return gen_image_manifest_json();
/^pkgmanifestjson$/ and return gen_package_manifest_json();
/^imgcyclonedxsbom$/ and return gen_image_cyclonedxsbom();
/^pkgcyclonedxsbom$/ and return gen_package_cyclonedxsbom();
@@ -817,6 +860,7 @@ Available Commands:
$0 kconfig [file] [config] [patchver] Kernel config overrides
$0 source [file] Package source file information
$0 pkgaux [file] Package auxiliary variables in makefile format
+ $0 imgmanifestjson [file] [manifest] Image manifests in JSON format
$0 pkgmanifestjson [file] Package manifests in JSON format
$0 imgcyclonedxsbom <file> [manifest] Image package manifest in CycloneDX SBOM JSON format
$0 pkgcyclonedxsbom <file> Package manifest in CycloneDX SBOM JSON format
--
2.39.5
More information about the openwrt-devel
mailing list