scripts: west sign: test for input file existence Check the CONFIG_BUILD_OUTPUT_HEX and CONFIG_BUILD_OUTPUT_BIN options are enabled before attempting to build signed versions of these formats. Signed-off-by: Marti Bolivar <marti.bolivar@nordicsemi.no>
diff --git a/scripts/west_commands/sign.py b/scripts/west_commands/sign.py index 7dc8752..1ea90cc 100644 --- a/scripts/west_commands/sign.py +++ b/scripts/west_commands/sign.py
@@ -101,7 +101,8 @@ group.add_argument('--bin', '--no-bin', dest='gen_bin', nargs=0, action=ToggleAction, help='''produce a signed .bin file? - (default: yes, if supported)''') + (default: yes, if supported and unsigned bin + exists)''') group.add_argument('-B', '--sbin', metavar='BIN', help='''signed .bin file name (default: zephyr.signed.bin in the build @@ -112,38 +113,62 @@ group.add_argument('--hex', '--no-hex', dest='gen_hex', nargs=0, action=ToggleAction, help='''produce a signed .hex file? - (default: yes, if supported)''') + (default: yes, if supported and unsigned hex + exists)''') group.add_argument('-H', '--shex', metavar='HEX', help='''signed .hex file name (default: zephyr.signed.hex in the build directory, next to zephyr.hex)''') - # defaults for hex/bin generation - parser.set_defaults(gen_bin=True, gen_hex=True) - return parser def do_run(self, args, ignored): - if not (args.gen_bin or args.gen_hex): - return - - # Provide the build directory if not given, and defer to the signer. - build_dir = find_build_dir(args.build_dir) - self.args = args # for check_force + + # Find the build directory and parse .config and DT. + build_dir = find_build_dir(args.build_dir) self.check_force(os.path.isdir(build_dir), 'no such build directory {}'.format(build_dir)) self.check_force(is_zephyr_build(build_dir), "build directory {} doesn't look like a Zephyr build " 'directory'.format(build_dir)) + bcfg = BuildConfiguration(build_dir) + # Decide on output formats. + formats = [] + bin_exists = 'CONFIG_BUILD_OUTPUT_BIN' in bcfg + if args.gen_bin: + self.check_force(bin_exists, + '--bin given but CONFIG_BUILD_OUTPUT_BIN not set ' + "in build directory's ({}) .config". + format(build_dir)) + formats.append('bin') + elif args.gen_bin is None and bin_exists: + formats.append('bin') + + hex_exists = 'CONFIG_BUILD_OUTPUT_HEX' in bcfg + if args.gen_hex: + self.check_force(hex_exists, + + '--hex given but CONFIG_BUILD_OUTPUT_HEX not set ' + "in build directory's ({}) .config". + format(build_dir)) + formats.append('hex') + elif args.gen_hex is None and hex_exists: + formats.append('hex') + + if not formats: + log.dbg('nothing to do: no output files') + return + + # Delegate to the signer. if args.tool == 'imgtool': signer = ImgtoolSigner() # (Add support for other signers here in elif blocks) else: raise RuntimeError("can't happen") - signer.sign(self, build_dir) + signer.sign(self, build_dir, bcfg, formats) class Signer(abc.ABC): @@ -153,17 +178,19 @@ it in the Sign.do_run() method.''' @abc.abstractmethod - def sign(self, command, build_dir): + def sign(self, command, build_dir, bcfg, formats): '''Abstract method to perform a signature; subclasses must implement. :param command: the Sign instance :param build_dir: the build directory + :param bcfg: BuildConfiguration for build directory + :param formats: list of formats to generate ('bin', 'hex') ''' class ImgtoolSigner(Signer): - def sign(self, command, build_dir): + def sign(self, command, build_dir, bcfg, formats): args = command.args if args.tool_path: @@ -177,7 +204,6 @@ log.die('imgtool not found; either install it', '(e.g. "pip3 install imgtool") or provide --tool-path') - bcfg = BuildConfiguration(build_dir) align, vtoff, slot_size = [self.get_cfg(command, bcfg, x) for x in ('DT_FLASH_WRITE_BLOCK_SIZE', 'CONFIG_TEXT_SECTION_OFFSET', @@ -221,7 +247,7 @@ runner_config = cached_runner_config(build_dir, cache) # Build a signed .bin - if args.gen_bin and runner_config.bin_file: + if 'bin' in formats and runner_config.bin_file: out_bin = args.sbin or str(b / 'zephyr' / 'zephyr.signed.bin') log.inf('Generating:', out_bin) sign_bin = (sign_base + args.tool_args + @@ -230,7 +256,7 @@ subprocess.check_call(sign_bin) # Build a signed .hex - if args.gen_hex and runner_config.hex_file: + if 'hex' in formats and runner_config.hex_file: out_hex = args.shex or str(b / 'zephyr' / 'zephyr.signed.hex') log.inf('Generating:', out_hex) sign_hex = (sign_base + args.tool_args +