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 <stefan.herbrechtsmeier@weidmueller.com> Reviewed-by: Simon Glass <sjg@chromium.org> Rename the module and support this, since gzip.py is a system module: Signed-off-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
		
							parent
							
								
									45aa279800
								
							
						
					
					
						commit
						0f369d7992
					
				|  | @ -73,17 +73,25 @@ class Bintool: | ||||||
|         # interested in the type. |         # interested in the type. | ||||||
|         module_name = btype.replace('-', '_') |         module_name = btype.replace('-', '_') | ||||||
|         module = modules.get(module_name) |         module = modules.get(module_name) | ||||||
|  |         class_name = f'Bintool{module_name}' | ||||||
| 
 | 
 | ||||||
|         # Import the module if we have not already done so |         # Import the module if we have not already done so | ||||||
|         if not module: |         if not module: | ||||||
|             try: |             try: | ||||||
|                 module = importlib.import_module('binman.btool.' + module_name) |                 module = importlib.import_module('binman.btool.' + module_name) | ||||||
|             except ImportError as exc: |             except ImportError as 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 |                     return module_name, exc | ||||||
|             modules[module_name] = module |             modules[module_name] = module | ||||||
| 
 | 
 | ||||||
|         # Look up the expected class name |         # Look up the expected class name | ||||||
|         return getattr(module, 'Bintool%s' % module_name) |         return getattr(module, class_name) | ||||||
| 
 | 
 | ||||||
|     @staticmethod |     @staticmethod | ||||||
|     def create(name): |     def create(name): | ||||||
|  |  | ||||||
|  | @ -0,0 +1,31 @@ | ||||||
|  | # SPDX-License-Identifier: GPL-2.0+ | ||||||
|  | # Copyright (C) 2022 Weidmüller Interface GmbH & Co. KG | ||||||
|  | # Stefan Herbrechtsmeier <stefan.herbrechtsmeier@weidmueller.com> | ||||||
|  | # | ||||||
|  | """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.]+)') | ||||||
|  | @ -1191,7 +1191,7 @@ features to produce new behaviours. | ||||||
|         """ |         """ | ||||||
|         algo = self.compress |         algo = self.compress | ||||||
|         if algo != 'none': |         if algo != 'none': | ||||||
|             algos = ['bzip2', 'lz4', 'lzma'] |             algos = ['bzip2', 'gzip', 'lz4', 'lzma'] | ||||||
|             if algo not in algos: |             if algo not in algos: | ||||||
|                 raise ValueError("Unknown algorithm '%s'" % algo) |                 raise ValueError("Unknown algorithm '%s'" % algo) | ||||||
|             names = {'lzma': 'lzma_alone'} |             names = {'lzma': 'lzma_alone'} | ||||||
|  |  | ||||||
|  | @ -107,7 +107,7 @@ BASE_DTB_PROPS = ['offset', 'size', 'image-pos'] | ||||||
| REPACK_DTB_PROPS = ['orig-offset', 'orig-size'] | REPACK_DTB_PROPS = ['orig-offset', 'orig-size'] | ||||||
| 
 | 
 | ||||||
| # Supported compression bintools | # Supported compression bintools | ||||||
| COMP_BINTOOLS = ['bzip2', 'lz4', 'lzma_alone'] | COMP_BINTOOLS = ['bzip2', 'gzip', 'lz4', 'lzma_alone'] | ||||||
| 
 | 
 | ||||||
| class TestFunctional(unittest.TestCase): | class TestFunctional(unittest.TestCase): | ||||||
|     """Functional tests for binman |     """Functional tests for binman | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue