#!/usr/bin/env python3 # # Copyright (c) 2018 Nordic Semiconductor ASA # # SPDX-License-Identifier: Apache-2.0 # This merges a set of input hex files into a single output hex file. # Any conflicts will result in an error being reported. import argparse from intelhex import AddressOverlapError, IntelHex def merge_hex_files(output, input_hex_files, overlap, output_bin): ih = IntelHex() for hex_file_path in input_hex_files: to_merge = IntelHex(hex_file_path) # Since 'arm-none-eabi-objcopy' incorrectly inserts record # type '03 - Start Segment Address', we need to remove the # start_addr to avoid conflicts when merging. to_merge.start_addr = None try: ih.merge(to_merge, overlap=overlap) except AddressOverlapError as e: raise AddressOverlapError(f"{hex_file_path} has merge issues") from e output_format = "bin" if output_bin else "hex" ih.tofile(output, format=output_format) def parse_args(): parser = argparse.ArgumentParser( description="Merge hex files.", formatter_class=argparse.RawDescriptionHelpFormatter, allow_abbrev=False, ) parser.add_argument( "-o", "--output", required=False, default="merged.hex", help="Output file name." ) parser.add_argument( "--overlap", default="error", help="What to do when files overlap (error, ignore, replace). " "See IntelHex.merge() for more info.", ) parser.add_argument( "--output-bin", action='store_true', help="Save the merged content as binary file." ) parser.add_argument("input_files", nargs='*') return parser.parse_args() def main(): args = parse_args() merge_hex_files(args.output, args.input_files, args.overlap, args.output_bin) if __name__ == "__main__": main()