Skip to content

Commit 7896f71

Browse files
committed
[WIP] Implement build-tree editable mode
Signed-off-by: Cristian Le <[email protected]>
1 parent b55033a commit 7896f71

File tree

2 files changed

+61
-13
lines changed

2 files changed

+61
-13
lines changed

src/scikit_build_core/build/_editable.py

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,41 @@
1414
if typing.TYPE_CHECKING:
1515
from collections.abc import Sequence
1616

17-
__all__ = ["editable_redirect", "libdir_to_installed", "mapping_to_modules"]
17+
__all__ = [
18+
"editable_build_dir",
19+
"editable_redirect",
20+
"libdir_to_installed",
21+
"mapping_to_modules",
22+
]
1823

1924

2025
def __dir__() -> list[str]:
2126
return __all__
2227

2328

29+
def editable_build_dir(
30+
*,
31+
source_files: dict[str, str],
32+
) -> str:
33+
"""
34+
Prepare the contents of the _editable_redirect.py file as build-dir mode.
35+
"""
36+
37+
# We can reuse the `_editable_redirect.py` file without the rebuild/install
38+
# feature and providing only source files to map.
39+
editable_py = resources / "_editable_redirect.py"
40+
editable_txt: str = editable_py.read_text(encoding="utf-8")
41+
42+
arguments = (
43+
source_files, # known_source_files
44+
{}, # known_wheel_files
45+
None, # path
46+
)
47+
arguments_str = ", ".join(repr(x) for x in arguments)
48+
editable_txt += f"\n\ninstall({arguments_str})\n"
49+
return editable_txt
50+
51+
2452
def editable_redirect(
2553
*,
2654
modules: dict[str, str],

src/scikit_build_core/build/wheel.py

Lines changed: 32 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,12 @@
2323
from ..errors import FailedLiveProcessError
2424
from ..format import pyproject_format
2525
from ..settings.skbuild_read_settings import SettingsReader
26-
from ._editable import editable_redirect, libdir_to_installed, mapping_to_modules
26+
from ._editable import (
27+
editable_build_dir,
28+
editable_redirect,
29+
libdir_to_installed,
30+
mapping_to_modules,
31+
)
2732
from ._init import setup_logging
2833
from ._pathutil import (
2934
packages_to_file_mapping,
@@ -56,22 +61,36 @@ def _make_editable(
5661
settings: ScikitBuildSettings,
5762
wheel: WheelWriter,
5863
packages: Iterable[str],
64+
mode: Literal["redirect", "inplace", "build-dir"],
5965
) -> None:
6066
modules = mapping_to_modules(mapping, libdir)
6167
installed = libdir_to_installed(libdir)
6268
if settings.wheel.install_dir.startswith("/"):
6369
msg = "Editable installs cannot rebuild an absolute wheel.install-dir. Use an override to change if needed."
6470
raise AssertionError(msg)
65-
editable_txt = editable_redirect(
66-
modules=modules,
67-
installed=installed,
68-
reload_dir=reload_dir,
69-
rebuild=settings.editable.rebuild,
70-
verbose=settings.editable.verbose,
71-
build_options=build_options,
72-
install_options=install_options,
73-
install_dir=settings.wheel.install_dir,
74-
)
71+
if mode == "redirect":
72+
editable_txt = editable_redirect(
73+
modules=modules,
74+
installed=installed,
75+
reload_dir=reload_dir,
76+
rebuild=settings.editable.rebuild,
77+
verbose=settings.editable.verbose,
78+
build_options=build_options,
79+
install_options=install_options,
80+
install_dir=settings.wheel.install_dir,
81+
)
82+
elif mode == "build-dir":
83+
if not settings.build_dir:
84+
msg = "Editable mode build-dir must have the build-dir option set."
85+
raise ValueError(msg)
86+
source_files = modules
87+
# TODO: get the source files from the build-dir
88+
editable_txt = editable_build_dir(
89+
source_files=source_files,
90+
)
91+
else:
92+
msg = f"Unexpected editable mode used: {mode}"
93+
raise NotImplementedError(msg)
7594

7695
wheel.writestr(
7796
f"_{name}_editable.py",
@@ -500,7 +519,7 @@ def _build_wheel_impl_impl(
500519
str_pkgs = (
501520
str(Path.cwd().joinpath(p).parent.resolve()) for p in packages.values()
502521
)
503-
if editable and settings.editable.mode == "redirect":
522+
if editable and settings.editable.mode in ("redirect", "build-dir"):
504523
reload_dir = build_dir.resolve() if settings.build_dir else None
505524

506525
_make_editable(
@@ -513,6 +532,7 @@ def _build_wheel_impl_impl(
513532
wheel=wheel,
514533
name=normalized_name,
515534
packages=str_pkgs,
535+
mode=settings.editable.mode,
516536
)
517537
elif editable and settings.editable.mode == "inplace":
518538
if not packages:

0 commit comments

Comments
 (0)