From 0f369d79925a4e0a909c0c1618b786775f63f81f Mon Sep 17 00:00:00 2001 From: Stefan Herbrechtsmeier Date: Fri, 19 Aug 2022 16:25:35 +0200 Subject: [PATCH] binman: Add gzip bintool Add gzip bintool to binman to support on-the-fly compression of Linux kernel images and FPGA bitstreams. The SPL basic fitImage implementation supports only gzip decompression. Signed-off-by: Stefan Herbrechtsmeier Reviewed-by: Simon Glass Rename the module and support this, since gzip.py is a system module: Signed-off-by: Simon Glass --- tools/binman/bintool.py | 12 ++++++++++-- tools/binman/btool/btool_gzip.py | 31 +++++++++++++++++++++++++++++++ tools/binman/entry.py | 2 +- tools/binman/ftest.py | 2 +- 4 files changed, 43 insertions(+), 4 deletions(-) create mode 100644 tools/binman/btool/btool_gzip.py diff --git a/tools/binman/bintool.py b/tools/binman/bintool.py index 7676ac92ec..ec30ceff74 100644 --- a/tools/binman/bintool.py +++ b/tools/binman/bintool.py @@ -73,17 +73,25 @@ class Bintool: # interested in the type. module_name = btype.replace('-', '_') module = modules.get(module_name) + class_name = f'Bintool{module_name}' # Import the module if we have not already done so if not module: try: module = importlib.import_module('binman.btool.' + module_name) except ImportError as exc: - return module_name, exc + try: + # Deal with classes which must be renamed due to conflicts + # with Python libraries + class_name = f'Bintoolbtool_{module_name}' + module = importlib.import_module('binman.btool.btool_' + + module_name) + except ImportError: + return module_name, exc modules[module_name] = module # Look up the expected class name - return getattr(module, 'Bintool%s' % module_name) + return getattr(module, class_name) @staticmethod def create(name): diff --git a/tools/binman/btool/btool_gzip.py b/tools/binman/btool/btool_gzip.py new file mode 100644 index 0000000000..7bea300b5d --- /dev/null +++ b/tools/binman/btool/btool_gzip.py @@ -0,0 +1,31 @@ +# SPDX-License-Identifier: GPL-2.0+ +# Copyright (C) 2022 Weidmüller Interface GmbH & Co. KG +# Stefan Herbrechtsmeier +# +"""Bintool implementation for gzip + +gzip allows compression and decompression of files. + +Documentation is available via:: + + man gzip +""" + +from binman import bintool + +# pylint: disable=C0103 +class Bintoolbtool_gzip(bintool.BintoolPacker): + """Compression/decompression using the gzip algorithm + + This bintool supports running `gzip` to compress and decompress data, as + used by binman. + + It is also possible to fetch the tool, which uses `apt` to install it. + + Documentation is available via:: + + man gzip + """ + def __init__(self, name): + super().__init__(name, compress_args=[], + version_regex=r'gzip ([0-9.]+)') diff --git a/tools/binman/entry.py b/tools/binman/entry.py index 0cd5b8b9f1..84a303665d 100644 --- a/tools/binman/entry.py +++ b/tools/binman/entry.py @@ -1191,7 +1191,7 @@ features to produce new behaviours. """ algo = self.compress if algo != 'none': - algos = ['bzip2', 'lz4', 'lzma'] + algos = ['bzip2', 'gzip', 'lz4', 'lzma'] if algo not in algos: raise ValueError("Unknown algorithm '%s'" % algo) names = {'lzma': 'lzma_alone'} diff --git a/tools/binman/ftest.py b/tools/binman/ftest.py index 8bd3968157..5275855baf 100644 --- a/tools/binman/ftest.py +++ b/tools/binman/ftest.py @@ -107,7 +107,7 @@ BASE_DTB_PROPS = ['offset', 'size', 'image-pos'] REPACK_DTB_PROPS = ['orig-offset', 'orig-size'] # Supported compression bintools -COMP_BINTOOLS = ['bzip2', 'lz4', 'lzma_alone'] +COMP_BINTOOLS = ['bzip2', 'gzip', 'lz4', 'lzma_alone'] class TestFunctional(unittest.TestCase): """Functional tests for binman -- 2.39.5