diff options
Diffstat (limited to 'Tools/jit/build.py')
-rw-r--r-- | Tools/jit/build.py | 50 |
1 files changed, 46 insertions, 4 deletions
diff --git a/Tools/jit/build.py b/Tools/jit/build.py index a8cb0f67c36..a0733005929 100644 --- a/Tools/jit/build.py +++ b/Tools/jit/build.py @@ -11,7 +11,10 @@ if __name__ == "__main__": comment = f"$ {shlex.join([pathlib.Path(sys.executable).name] + sys.argv)}" parser = argparse.ArgumentParser(description=__doc__) parser.add_argument( - "target", type=_targets.get_target, help="a PEP 11 target triple to compile for" + "target", + nargs="+", + type=_targets.get_target, + help="a PEP 11 target triple to compile for", ) parser.add_argument( "-d", "--debug", action="store_true", help="compile for a debug build of Python" @@ -20,9 +23,48 @@ if __name__ == "__main__": "-f", "--force", action="store_true", help="force the entire JIT to be rebuilt" ) parser.add_argument( + "-o", + "--output-dir", + help="where to output generated files", + required=True, + type=lambda p: pathlib.Path(p).resolve(), + ) + parser.add_argument( + "-p", + "--pyconfig-dir", + help="where to find pyconfig.h", + required=True, + type=lambda p: pathlib.Path(p).resolve(), + ) + parser.add_argument( "-v", "--verbose", action="store_true", help="echo commands as they are run" ) + parser.add_argument( + "--cflags", help="additional flags to pass to the compiler", default="" + ) args = parser.parse_args() - args.target.debug = args.debug - args.target.verbose = args.verbose - args.target.build(pathlib.Path.cwd(), comment=comment, force=args.force) + for target in args.target: + target.debug = args.debug + target.force = args.force + target.verbose = args.verbose + target.cflags = args.cflags + target.pyconfig_dir = args.pyconfig_dir + target.build( + comment=comment, + force=args.force, + jit_stencils=args.output_dir / f"jit_stencils-{target.triple}.h", + ) + jit_stencils_h = args.output_dir / "jit_stencils.h" + lines = [f"// {comment}\n"] + guard = "#if" + for target in args.target: + lines.append(f"{guard} {target.condition}\n") + lines.append(f'#include "jit_stencils-{target.triple}.h"\n') + guard = "#elif" + lines.append("#else\n") + lines.append('#error "unexpected target"\n') + lines.append("#endif\n") + body = "".join(lines) + # Don't touch the file if it hasn't changed (so we don't trigger a rebuild): + if not jit_stencils_h.is_file() or jit_stencils_h.read_text() != body: + jit_stencils_h.write_text(body) |