mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 13:41:24 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			70 lines
		
	
	
	
		
			2.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			70 lines
		
	
	
	
		
			2.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| """Build an experimental just-in-time compiler for CPython."""
 | |
| 
 | |
| import argparse
 | |
| import pathlib
 | |
| import shlex
 | |
| import sys
 | |
| 
 | |
| import _targets
 | |
| 
 | |
| if __name__ == "__main__":
 | |
|     comment = f"$ {shlex.join([pathlib.Path(sys.executable).name] + sys.argv)}"
 | |
|     parser = argparse.ArgumentParser(description=__doc__)
 | |
|     parser.add_argument(
 | |
|         "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"
 | |
|     )
 | |
|     parser.add_argument(
 | |
|         "-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()
 | |
|     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)
 | 
