Skip to content

Commit 9f7c4e2

Browse files
committed
Draft: Build wheels for different Python interpreter
Fromager now support building wheels for a different Python interpreter: ```shell fromager --python-interpreter=/path/to/python ... ``` Fixes: #431 Signed-off-by: Christian Heimes <[email protected]>
1 parent d80da7c commit 9f7c4e2

File tree

3 files changed

+31
-5
lines changed

3 files changed

+31
-5
lines changed

src/fromager/__main__.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import logging
44
import pathlib
5+
import sys
56

67
import click
78

@@ -127,6 +128,13 @@
127128
help="Build sdist and wheen with network isolation (unshare -cn)",
128129
show_default=True,
129130
)
131+
@click.option(
132+
"--python-interpreter",
133+
type=clickext.ClickPath(),
134+
default=pathlib.Path(sys.executable),
135+
help="Python interpreter to build wheels for",
136+
show_default=True,
137+
)
130138
@click.pass_context
131139
def main(
132140
ctx: click.Context,
@@ -145,6 +153,7 @@ def main(
145153
variant: str,
146154
jobs: int | None,
147155
network_isolation: bool,
156+
python_interpreter: pathlib.Path,
148157
) -> None:
149158
# Set the overall logger level to debug and allow the handlers to filter
150159
# messages at their own level.
@@ -211,6 +220,7 @@ def main(
211220
network_isolation=network_isolation,
212221
max_jobs=jobs,
213222
settings_dir=settings_dir,
223+
python_interpreter=python_interpreter,
214224
)
215225
wkctx.setup()
216226
ctx.obj = wkctx

src/fromager/build_environment.py

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
11
import importlib.metadata
22
import logging
33
import pathlib
4-
import platform
54
import re
65
import subprocess
7-
import sys
86
import typing
97

108
from packaging.requirements import Requirement
@@ -75,7 +73,7 @@ def __init__(
7573
build_requirements: typing.Iterable[Requirement] | None,
7674
):
7775
self._ctx = ctx
78-
self.path = parent_dir / f"build-{platform.python_version()}"
76+
self.path = parent_dir / f"build-{ctx.python_version}"
7977
self._build_requirements = build_requirements
8078
self._createenv()
8179

@@ -90,7 +88,7 @@ def _createenv(self) -> None:
9088

9189
logger.debug("creating build environment in %s", self.path)
9290
external_commands.run(
93-
[sys.executable, "-m", "virtualenv", str(self.path)],
91+
[str(self._ctx.python_interpreter), "-m", "virtualenv", str(self.path)],
9492
network_isolation=False,
9593
)
9694
logger.info("created build environment in %s", self.path)
@@ -258,7 +256,7 @@ def _safe_install(
258256
logger.debug("installing %s %s", req_type, req)
259257
external_commands.run(
260258
[
261-
sys.executable,
259+
str(ctx.python_interpreter),
262260
"-m",
263261
"pip",
264262
"-vvv",

src/fromager/context.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import logging
44
import os
55
import pathlib
6+
import sys
67
import typing
78
from urllib.parse import urlparse
89

@@ -13,6 +14,7 @@
1314
from . import (
1415
constraints,
1516
dependency_graph,
17+
external_commands,
1618
packagesettings,
1719
)
1820

@@ -38,6 +40,7 @@ def __init__(
3840
network_isolation: bool = False,
3941
max_jobs: int | None = None,
4042
settings_dir: pathlib.Path | None = None,
43+
python_interpreter: pathlib.Path = pathlib.Path(sys.executable),
4144
):
4245
if active_settings is None:
4346
active_settings = packagesettings.Settings(
@@ -69,6 +72,8 @@ def __init__(
6972
self.variant = variant
7073
self.network_isolation = network_isolation
7174
self.settings_dir = settings_dir
75+
self.python_interpreter = python_interpreter.absolute()
76+
self._python_version: str | None = None
7277

7378
self._build_order_filename = self.work_dir / "build-order.json"
7479
self._constraints_filename = self.work_dir / "constraints.txt"
@@ -165,6 +170,19 @@ def package_build_info(
165170
name = package
166171
return self.settings.package_build_info(name)
167172

173+
def python_version(self) -> str:
174+
if self._python_version is None:
175+
out = external_commands.run(
176+
[
177+
str(self.python_interpreter),
178+
"-c",
179+
"import platform; print(platform.python_version())",
180+
],
181+
network_isolation=False,
182+
)
183+
self._python_version = out.split("\n", 1)[0].strip()
184+
return self._python_version
185+
168186
def setup(self) -> None:
169187
# The work dir must already exist, so don't try to create it.
170188
# Use os.makedirs() to create the others in case the paths

0 commit comments

Comments
 (0)