2323from ..errors import FailedLiveProcessError
2424from ..format import pyproject_format
2525from ..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+ )
2732from ._init import setup_logging
2833from ._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