imagebuilder: implement STRIP_ABI option for manifest target

When using apk as the package manager, imagebuilder make command

    make manifest STRIP_ABI=1

does not strip package names of their ABI-version suffix.  The ASU
server relies on this to validate builds, so many snapshot build
requests are failing.

Fix this by using the already existing package data parser in
make-index-json.py and augment it to write the result in manifest
format.

Fixes: https://github.com/openwrt/openwrt/issues/19274
Signed-off-by: Eric Fahlgren <ericfahlgren@gmail.com>
Link: https://github.com/openwrt/openwrt/pull/19278
Signed-off-by: Robert Marko <robimarko@gmail.com>
This commit is contained in:
Eric Fahlgren 2025-07-01 14:02:41 -07:00 committed by Robert Marko
parent 9d31db2833
commit 23dc466969
2 changed files with 19 additions and 8 deletions

View File

@ -31,6 +31,8 @@ def parse_args():
help="Required device architecture: like 'x86_64' or 'aarch64_generic'") help="Required device architecture: like 'x86_64' or 'aarch64_generic'")
parser.add_argument("-f", "--source-format", required=True, choices=source_format, parser.add_argument("-f", "--source-format", required=True, choices=source_format,
help="Required source format of input: 'apk' or 'opkg'") help="Required source format of input: 'apk' or 'opkg'")
parser.add_argument("-m", "--manifest", action="store_true", default=False,
help="Print output in manifest format, as package:version pairs")
parser.add_argument(dest="source", parser.add_argument(dest="source",
help="File name for input, '-' for stdin") help="File name for input, '-' for stdin")
# fmt: on # fmt: on
@ -42,7 +44,11 @@ def parse_apk(text: str) -> dict:
packages: dict = {} packages: dict = {}
data = json.loads(text) data = json.loads(text)
for package in data.get("packages", []): if isinstance(data, dict) and "packages" in data:
# Extract 'apk adbdump' dict field to 'apk query' package list
data = data["packages"]
for package in data:
package_name: str = package["name"] package_name: str = package["name"]
for tag in package.get("tags", []): for tag in package.get("tags", []):
@ -83,9 +89,13 @@ if __name__ == "__main__":
text: str = input.read() text: str = input.read()
packages = parse_apk(text) if args.source_format == "apk" else parse_opkg(text) packages = parse_apk(text) if args.source_format == "apk" else parse_opkg(text)
index = { if args.manifest:
"version": 2, for name, version in packages.items():
"architecture": args.architecture, print(name, version)
"packages": packages, else:
} index = {
print(json.dumps(index, indent=2)) "version": 2,
"architecture": args.architecture,
"packages": packages,
}
print(json.dumps(index, indent=2))

View File

@ -168,7 +168,8 @@ _call_manifest: FORCE
ifeq ($(CONFIG_USE_APK),) ifeq ($(CONFIG_USE_APK),)
$(OPKG) list-installed $(if $(STRIP_ABI),--strip-abi) $(OPKG) list-installed $(if $(STRIP_ABI),--strip-abi)
else else
$(APK) list --quiet --manifest --no-network $(APK) query --format json --fields name,version,$(if $(STRIP_ABI),tags) --installed '*' | \
$(SCRIPT_DIR)/make-index-json.py -a $(ARCH_PACKAGES) -f apk --manifest -
endif endif
package_index: FORCE package_index: FORCE