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 }  ,
@@ -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