diff --git a/niar/cmdrunner.py b/niar/cmdrunner.py index 07422d8..06ab3d2 100644 --- a/niar/cmdrunner.py +++ b/niar/cmdrunner.py @@ -5,7 +5,7 @@ import subprocess from .logging import logger -__all__ = ["CompilationUnit", "CommandRunner"] +__all__ = ["CompilationUnit", "CommandRunner", "CommandFailedError"] class CompilationUnit: @@ -76,6 +76,8 @@ class CompilationUnit: with open(inf, "rb") as f: r[str(inf)] = f.read() return r + + class CommandRunner: cus: list[CompilationUnit] @@ -128,7 +130,7 @@ class CommandRunner: logger.error("the following process(es) failed:") for cu in failed: logger.error(f" {formatted(cu)}") - raise RuntimeError(f"failed {step} step") + raise CommandFailedError(f"failed {step} step") for cu, _ in runnables: cu.mark_up_to_date() @@ -144,6 +146,10 @@ class CommandRunner: logger.info(f"{action} {formatted(cu)}") +class CommandFailedError(RuntimeError): + pass + + def formatted(cu): if inspect.isfunction(cu.cmd): return cu.cmd.__name__ diff --git a/niar/cxxrtl.py b/niar/cxxrtl.py index 974e42a..9aad1fc 100644 --- a/niar/cxxrtl.py +++ b/niar/cxxrtl.py @@ -12,7 +12,7 @@ from amaranth._toolchain.yosys import find_yosys from amaranth.back import rtlil from .build import construct_top -from .cmdrunner import CommandRunner +from .cmdrunner import CommandRunner, CommandFailedError from .logging import logtime, logger from .project import Project @@ -251,7 +251,11 @@ def main(np: Project, args): infs=cc_o_paths + list(np.path("cxxrtl").glob("**/*.zig")), outf=outf, chdir="cxxrtl") - cr.run() + try: + cr.run() + except CommandFailedError: + logger.log(logging.INFO, "aborting on CommandFailedError") + return shutil.copy(outf, exe_o_path) else: cmd = [ @@ -266,7 +270,11 @@ def main(np: Project, args): cr.add_process(cmd, infs=cc_o_paths, outf=exe_o_path) - cr.run() + try: + cr.run() + except CommandFailedError: + logger.log(logging.INFO, "aborting on CommandFailedError") + return if not args.compile: cmd = [exe_o_path]