-
-
Notifications
You must be signed in to change notification settings - Fork 32.1k
gh-114809: Support fat builds on macOS with the experimental JIT #115742
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -25,6 +25,8 @@ | |
PYTHON_EXECUTOR_CASES_C_H = CPYTHON / "Python" / "executor_cases.c.h" | ||
TOOLS_JIT_TEMPLATE_C = TOOLS_JIT / "template.c" | ||
|
||
ASYNCIO_RUNNER=asyncio.Runner() | ||
|
||
|
||
_S = typing.TypeVar("_S", _schema.COFFSection, _schema.ELFSection, _schema.MachOSection) | ||
_R = typing.TypeVar( | ||
|
@@ -106,6 +108,7 @@ async def _compile( | |
o = tempdir / f"{opname}.o" | ||
args = [ | ||
f"--target={self.triple}", | ||
"-isysroot", "/Users/ronald/Applications/Xcode-beta.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk", | ||
"-DPy_BUILD_CORE", | ||
"-D_DEBUG" if self.debug else "-DNDEBUG", | ||
f"-D_JIT_OPCODE={opname}", | ||
|
@@ -152,17 +155,17 @@ async def _build_stencils(self) -> dict[str, _stencils.StencilGroup]: | |
tasks.append(group.create_task(coro, name=opname)) | ||
return {task.get_name(): task.result() for task in tasks} | ||
|
||
def build(self, out: pathlib.Path, *, comment: str = "") -> None: | ||
def build(self, out: pathlib.Path, *, comment: str = "", stencils_h: str = "jit_stencils.h") -> None: | ||
"""Build jit_stencils.h in the given directory.""" | ||
digest = f"// {self._compute_digest(out)}\n" | ||
jit_stencils = out / "jit_stencils.h" | ||
jit_stencils = out / stencils_h | ||
if ( | ||
not self.force | ||
and jit_stencils.exists() | ||
and jit_stencils.read_text().startswith(digest) | ||
): | ||
return | ||
stencil_groups = asyncio.run(self._build_stencils()) | ||
stencil_groups = ASYNCIO_RUNNER.run(self._build_stencils()) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Not sure if this is the right way to enable running multiple builds, I'm a very light asyncio user. Without this change the second run fails due to running with a different runloop. |
||
with jit_stencils.open("w") as file: | ||
file.write(digest) | ||
if comment: | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -10,7 +10,7 @@ | |
comment = f"$ {shlex.join([sys.executable] + 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" | ||
|
@@ -22,7 +22,30 @@ | |
"-v", "--verbose", action="store_true", help="echo commands as they are run" | ||
) | ||
args = parser.parse_args() | ||
args.target.debug = args.debug | ||
args.target.force = args.force | ||
args.target.verbose = args.verbose | ||
args.target.build(pathlib.Path.cwd(), comment=comment) | ||
|
||
if len(args.target) == -1: | ||
args.target.debug = args.debug | ||
args.target.force = args.force | ||
args.target.verbose = args.verbose | ||
args.target.build(pathlib.Path.cwd(), comment=comment) | ||
|
||
else: | ||
# Multiple triples specified, assume this is a macOS multiarchitecture build | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This bit is not ideal, multiple files are created and that likely breaks dependency handling in the Makefile. It should be possible to publish everything in a single header file, but that requires more significant changes to the builder. |
||
# - Generate multiple stencil headers | ||
# - Generate a helper header that include sthe stencils for the current | ||
# architecture. | ||
for target in args.target: | ||
target.debug = args.debug | ||
target.force = args.force | ||
target.verbose = args.verbose | ||
target.build(pathlib.Path.cwd(), comment=comment, stencils_h=f"jit_stencils-{target.triple}.h") | ||
|
||
with open("jit_stencils.h", "w") as fp: | ||
for idx, target in enumerate(args.target): | ||
cpu, _, _ = target.triple.partition("-") | ||
fp.write(f"#{'if' if idx == 0 else 'elif'} defined(__{cpu}__)\n") | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This works for x86_64 and arm64, but might break for ancient systems running PPC and PPC64. I don't care for those. |
||
fp.write(f'# include "jit_stencils-{target.triple}.h"\n') | ||
|
||
fp.write("#else\n") | ||
fp.write('# error "unexpected cpu type"\n') | ||
fp.write("#endif\n") |
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This will be removed in the final version, and likely needs a different issue and patch: I installed llvm using a download on llvm's GitHub, and use Xcode to build python (not Command Line Tools). Without this addition "clang-16" cannot find the SDK to use.