diff --git a/pyk/src/pyk/kdist/__main__.py b/pyk/src/pyk/kdist/__main__.py index 1a0624310af..814513821b5 100644 --- a/pyk/src/pyk/kdist/__main__.py +++ b/pyk/src/pyk/kdist/__main__.py @@ -48,6 +48,7 @@ def _exec_build( force: bool, verbose: bool, debug: bool, + clean: bool, ) -> None: kdist.build( target_ids=_process_targets(targets), @@ -55,6 +56,7 @@ def _exec_build( jobs=jobs, force=force, verbose=verbose or debug, + clean=clean, ) @@ -130,6 +132,9 @@ def add_target_arg(parser: ArgumentParser, help_text: str) -> None: ) build_parser.add_argument('-f', '--force', action='store_true', default=False, help='force build') build_parser.add_argument('-j', '--jobs', metavar='N', type=int, default=1, help='maximal number of build jobs') + build_parser.add_argument( + '--no-clean', dest='clean', action='store_false', default=True, help="Don't clean before building" + ) clean_parser = command_parser.add_parser('clean', help='clean targets') add_target_arg(clean_parser, 'target to clean') diff --git a/pyk/src/pyk/kdist/_kdist.py b/pyk/src/pyk/kdist/_kdist.py index dc4721546f6..bae040f77c0 100644 --- a/pyk/src/pyk/kdist/_kdist.py +++ b/pyk/src/pyk/kdist/_kdist.py @@ -86,6 +86,7 @@ def build( jobs: int = 1, force: bool = False, verbose: bool = False, + clean: bool = True, ) -> None: args = dict(args) if args else {} dep_ids = target_cache().resolve_deps(target_ids) @@ -108,6 +109,7 @@ def submit(target_id: TargetId) -> None: args=args, force=force, verbose=verbose, + clean=clean, ) pending[future] = target_id @@ -134,6 +136,7 @@ def _build_target( *, force: bool, verbose: bool, + clean: bool, ) -> Path: target = target_cache().resolve(target_id) output_dir = self._target_dir(target_id) @@ -145,8 +148,9 @@ def _build_target( if not force and self._up_to_date(target_id, manifest): return output_dir - shutil.rmtree(output_dir, ignore_errors=True) - output_dir.mkdir(parents=True) + if clean: + shutil.rmtree(output_dir, ignore_errors=True) + output_dir.mkdir(parents=True, exist_ok=True) manifest_file.unlink(missing_ok=True) with ( @@ -156,7 +160,8 @@ def _build_target( try: target.target.build(output_dir, deps=self._deps(target), args=args, verbose=verbose) except Exception as err: - shutil.rmtree(output_dir, ignore_errors=True) + if clean: + shutil.rmtree(output_dir, ignore_errors=True) raise RuntimeError(f'Build failed: {target_id.full_name}') from err manifest_file.write_text(json.dumps(manifest))