Skip to content

Commit c71ce47

Browse files
committed
initial commit
1 parent 3f371ff commit c71ce47

File tree

7 files changed

+77
-25
lines changed

7 files changed

+77
-25
lines changed

docs/reference/configs.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -271,6 +271,15 @@ print(mk_skbuild_docs())
271271
:default: true
272272
273273
Turn on verbose output for the editable mode rebuilds.
274+
275+
```{eval-rst}
276+
.. confval:: editable.build-dir
277+
:type: ``str``
278+
:default: ""
279+
280+
Build directory to use when ``editable.mode`` is ``"inplace"``. If empty, the project
281+
source directory is used.
282+
```
274283
```
275284
276285
## generate[]

src/scikit_build_core/build/wheel.py

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -279,24 +279,29 @@ def _build_wheel_impl_impl(
279279
root_is_purelib=targetlib == "purelib",
280280
build_tag=settings.wheel.build_tag,
281281
)
282+
format_data = pyproject_format(
283+
settings=settings,
284+
tags=tags,
285+
state=state,
286+
)
282287

283288
# A build dir can be specified, otherwise use a temporary directory
289+
log_build_dir = True
284290
if cmake is not None and editable and settings.editable.mode == "inplace":
285-
build_dir = settings.cmake.source_dir
291+
if settings.editable.build_dir:
292+
build_dir = Path(
293+
settings.editable.build_dir.format(**format_data)
294+
)
295+
else:
296+
build_dir = settings.cmake.source_dir
297+
log_build_dir = False
286298
else:
287299
build_dir = (
288-
Path(
289-
settings.build_dir.format(
290-
**pyproject_format(
291-
settings=settings,
292-
tags=tags,
293-
state=state,
294-
)
295-
)
296-
)
300+
Path(settings.build_dir.format(**format_data))
297301
if settings.build_dir
298302
else build_tmp_folder / "build"
299303
)
304+
if log_build_dir:
300305
logger.info("Build directory: {}", build_dir.resolve())
301306

302307
wheel_dirs = {
@@ -426,6 +431,12 @@ def _build_wheel_impl_impl(
426431
f"SKBUILD_{k.upper()}_DIR": v for k, v in wheel_dirs.items()
427432
}
428433
cache_entries["SKBUILD_STATE"] = state
434+
if editable:
435+
cache_entries["SKBUILD_EDITABLE_MODE"] = settings.editable.mode
436+
if settings.editable.build_dir:
437+
cache_entries["SKBUILD_EDITABLE_BUILD_DIR"] = os.fspath(
438+
build_dir.resolve()
439+
)
429440
builder.configure(
430441
defines=defines,
431442
cache_entries=cache_entries,

src/scikit_build_core/resources/scikit-build.schema.json

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -274,6 +274,11 @@
274274
"type": "boolean",
275275
"default": false,
276276
"description": "Rebuild the project when the package is imported."
277+
},
278+
"build-dir": {
279+
"type": "string",
280+
"default": "",
281+
"description": "Build directory to use when ``editable.mode`` is \"inplace\". If empty, the project source directory is used."
277282
}
278283
}
279284
},

src/scikit_build_core/settings/skbuild_model.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -344,6 +344,13 @@ class EditableSettings:
344344
:confval:`build-dir` must be set.
345345
"""
346346

347+
build_dir: str = ""
348+
"""
349+
Build directory to use when :confval:`editable.mode` is ``inplace``.
350+
351+
If empty, the project source directory is used (the historical behaviour).
352+
"""
353+
347354

348355
@dataclasses.dataclass
349356
class BuildSettings:

tests/packages/simplest_c/CMakeLists.txt

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,15 @@ install(
1414
DESTINATION ${SKBUILD_PROJECT_NAME}
1515
COMPONENT PythonModule)
1616

17-
if("${CMAKE_CURRENT_SOURCE_DIR}" STREQUAL "${CMAKE_CURRENT_BINARY_DIR}"
18-
AND DEFINED SKBUILD)
19-
# Editable in-place builds. THe empty generator expression ensures
20-
# multi-config enerators keeps us from having to set
17+
if(DEFINED SKBUILD_EDITABLE_MODE AND SKBUILD_EDITABLE_MODE STREQUAL "inplace")
18+
# Editable in-place builds using a dedicated build directory.
19+
set_target_properties(
20+
_module PROPERTIES LIBRARY_OUTPUT_DIRECTORY
21+
"${CMAKE_SOURCE_DIR}/src/${SKBUILD_PROJECT_NAME}$<0:>")
22+
elseif("${CMAKE_CURRENT_SOURCE_DIR}" STREQUAL "${CMAKE_CURRENT_BINARY_DIR}"
23+
AND DEFINED SKBUILD)
24+
# Editable in-place builds with an in-source build directory. The empty generator
25+
# expression ensures multi-config generators keep us from having to set
2126
# LIBRARY_OUTPUT_DIRECTORY_<CONFIG> too.
2227
set_target_properties(
2328
_module PROPERTIES LIBRARY_OUTPUT_DIRECTORY

tests/test_editable.py

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -64,11 +64,13 @@ def test_navigate_editable(isolated, isolate, package):
6464
def test_cython_pxd(monkeypatch, tmp_path, editable, editable_mode, isolated):
6565
editable_flag = ["-e"] if editable else []
6666

67-
config_mode_flags = []
67+
config_mode_flags = ["--config-settings=build-dir=build/{wheel_tag}"]
6868
if editable:
6969
config_mode_flags.append(f"--config-settings=editable.mode={editable_mode}")
70-
if editable_mode != "inplace":
71-
config_mode_flags.append("--config-settings=build-dir=build/{wheel_tag}")
70+
if editable_mode == "inplace":
71+
config_mode_flags.append(
72+
"--config-settings=editable.build-dir=build/{wheel_tag}/editable"
73+
)
7274

7375
package1 = PackageInfo(
7476
"cython_pxd_editable/pkg1",
@@ -170,11 +172,13 @@ def _setup_package_for_editable_layout_tests(
170172
) -> None:
171173
editable_flag = ["-e"] if editable else []
172174

173-
config_mode_flags = []
175+
config_mode_flags = ["--config-settings=build-dir=build/{wheel_tag}"]
174176
if editable:
175177
config_mode_flags.append(f"--config-settings=editable.mode={editable_mode}")
176-
if editable_mode != "inplace":
177-
config_mode_flags.append("--config-settings=build-dir=build/{wheel_tag}")
178+
if editable_mode == "inplace":
179+
config_mode_flags.append(
180+
"--config-settings=editable.build-dir=build/{wheel_tag}/editable"
181+
)
178182

179183
# Use a context so that we only change into the directory up until the point where
180184
# we run the editable install. We do not want to be in that directory when importing

tests/test_pyproject_pep660.py

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,13 @@ def editable_mode(request: pytest.FixtureRequest) -> str:
2525
@pytest.mark.usefixtures("package_simplest_c")
2626
def test_pep660_wheel(editable_mode: str, tmp_path: Path):
2727
dist = tmp_path / "dist"
28-
out = build_editable(str(dist), {"editable.mode": editable_mode})
28+
config_settings = {
29+
"build-dir": "build/{wheel_tag}",
30+
"editable.mode": editable_mode,
31+
}
32+
if editable_mode == "inplace":
33+
config_settings["editable.build-dir"] = "build/{wheel_tag}/editable"
34+
out = build_editable(str(dist), config_settings)
2935
(wheel,) = dist.glob("simplest-0.0.1-*.whl")
3036
assert wheel == dist / out
3137

@@ -61,12 +67,17 @@ def test_pep660_pip_isolated(isolated, isolate, editable_mode: str):
6167
if not isolate:
6268
isolated.install("scikit-build-core")
6369

64-
build_dir = "" if editable_mode == "inplace" else "build/{wheel_tag}"
65-
70+
config_flags = [
71+
"--config-settings=build-dir=build/{wheel_tag}",
72+
f"--config-settings=editable.mode={editable_mode}",
73+
]
74+
if editable_mode == "inplace":
75+
config_flags.append(
76+
"--config-settings=editable.build-dir=build/{wheel_tag}/editable"
77+
)
6678
isolated.install(
6779
"-v",
68-
f"--config-settings=build-dir={build_dir}",
69-
f"--config-settings=editable.mode={editable_mode}",
80+
*config_flags,
7081
*isolate_args,
7182
"-e",
7283
".",

0 commit comments

Comments
 (0)