Skip to content

Commit 00cc872

Browse files
committed
Initial support for cmake.preset
Signed-off-by: Cristian Le <[email protected]>
1 parent b898308 commit 00cc872

File tree

13 files changed

+103
-4
lines changed

13 files changed

+103
-4
lines changed

README.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,9 @@ cmake.build-type = "Release"
172172
# The source directory to use when building the project.
173173
cmake.source-dir = "."
174174

175+
# Configure preset to use. ``cmake.source-dir`` must still be appropriately defined
176+
cmake.preset = ""
177+
175178
# The versions of Ninja to allow.
176179
ninja.version = ">=1.5"
177180

docs/reference/configs.md

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,17 @@ print(mk_skbuild_docs())
199199
DEPRECATED in 0.8; use version instead.
200200
```
201201

202+
```{eval-rst}
203+
.. confval:: cmake.preset
204+
:type: ``str``
205+
206+
Configure preset to use. ``cmake.source-dir`` must still be appropriately defined
207+
and it must contain a ``CMake(User)Presets.json``. The preset's ``binaryDir`` is
208+
ignored and is always overwritten by the ``build-dir`` defined by scikit-build-core.
209+
``cmake.define``, generator values are still passed if defined and take precedence
210+
over preset's value according to CMake logic.
211+
```
212+
202213
```{eval-rst}
203214
.. confval:: cmake.source-dir
204215
:type: ``Path``

src/scikit_build_core/builder/builder.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -292,6 +292,7 @@ def configure(
292292
cmake_defines.update(self.settings.cmake.define)
293293

294294
self.config.configure(
295+
preset=self.settings.cmake.preset,
295296
defines=cmake_defines,
296297
cmake_args=[*self.get_cmake_args(), *configure_args],
297298
)

src/scikit_build_core/builder/generator.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@ def set_environment_for_gen(
9090
9191
If gen is not None, then that will be the target generator.
9292
"""
93+
# TODO: How does make_fallback interact when `preset` is set?
9394
allow_make_fallback = ninja_settings.make_fallback
9495

9596
if generator:

src/scikit_build_core/cmake.py

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,18 @@
1212
from pathlib import Path
1313
from typing import TYPE_CHECKING, Any
1414

15+
from packaging.version import Version
16+
1517
from . import __version__
1618
from ._compat.builtins import ExceptionGroup
1719
from ._logging import logger
1820
from ._shutil import Run
19-
from .errors import CMakeConfigError, CMakeNotFoundError, FailedLiveProcessError
21+
from .errors import (
22+
CMakeConfigError,
23+
CMakeNotFoundError,
24+
CMakeVersionError,
25+
FailedLiveProcessError,
26+
)
2027
from .file_api.query import stateless_query
2128
from .file_api.reply import load_reply_dir
2229
from .program_search import Program, best_program, get_cmake_program, get_cmake_programs
@@ -25,7 +32,6 @@
2532
from collections.abc import Generator, Iterable, Mapping, Sequence
2633

2734
from packaging.specifiers import SpecifierSet
28-
from packaging.version import Version
2935

3036
from ._compat.typing import Self
3137
from .file_api.model.index import Index
@@ -242,12 +248,19 @@ def get_generator(self, *args: str) -> str | None:
242248
def configure(
243249
self,
244250
*,
251+
preset: str | None = None,
245252
defines: Mapping[str, str | os.PathLike[str] | bool] | None = None,
246253
cmake_args: Sequence[str] = (),
247254
) -> None:
248255
_cmake_args = self._compute_cmake_args(defines or {})
249256
all_args = [*_cmake_args, *cmake_args]
250257

258+
if preset:
259+
if self.cmake.version < Version("3.19"):
260+
msg = f"CMake version ({self.cmake.version}) is too old to support presets."
261+
raise CMakeVersionError(msg)
262+
all_args.append(f"--preset={preset}")
263+
251264
gen = self.get_generator(*all_args)
252265
if gen:
253266
self.single_config = gen == "Ninja" or "Makefiles" in gen

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,10 @@
102102
},
103103
"description": "DEPRECATED in 0.10; use build.targets instead.",
104104
"deprecated": true
105+
},
106+
"preset": {
107+
"type": "string",
108+
"description": "Configure preset to use. ``cmake.source-dir`` must still be appropriately defined"
105109
}
106110
}
107111
},

src/scikit_build_core/settings/skbuild_model.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,15 @@ class CMakeSettings:
133133
DEPRECATED in 0.10; use build.targets instead.
134134
"""
135135

136+
preset: Optional[str] = None
137+
"""
138+
Configure preset to use. ``cmake.source-dir`` must still be appropriately defined
139+
and it must contain a ``CMake(User)Presets.json``. The preset's ``binaryDir`` is
140+
ignored and is always overwritten by the ``build-dir`` defined by scikit-build-core.
141+
``cmake.define``, generator values are still passed if defined and take precedence
142+
over preset's value according to CMake logic.
143+
"""
144+
136145

137146
@dataclasses.dataclass
138147
class SearchSettings:

src/scikit_build_core/settings/skbuild_read_settings.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -285,8 +285,12 @@ def __init__(
285285
new_min_cmake = "3.15"
286286
self.settings.cmake.version = SpecifierSet(f">={new_min_cmake}")
287287

288+
default_cmake_minimum = "3.15"
289+
if self.settings.cmake.preset:
290+
default_cmake_minimum = "3.19"
291+
288292
_handle_minimum_version(
289-
self.settings.cmake, self.settings.minimum_version, "3.15"
293+
self.settings.cmake, self.settings.minimum_version, default_cmake_minimum
290294
)
291295
_handle_minimum_version(self.settings.ninja, self.settings.minimum_version)
292296

tests/packages/cmake_defines/CMakeLists.txt

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,19 @@ set(ONE_LEVEL_LIST
77
set(NESTED_LIST
88
""
99
CACHE STRING "")
10+
set(PRESET_ONLY_VAR
11+
""
12+
CACHE STRING "")
13+
set(OVERWRITTEN_VAR
14+
""
15+
CACHE STRING "")
1016

1117
set(out_file "${CMAKE_CURRENT_BINARY_DIR}/log.txt")
1218
file(WRITE "${out_file}" "")
1319

20+
file(APPEND "${out_file}" "PRESET_ONLY_VAR=${PRESET_ONLY_VAR}\n")
21+
file(APPEND "${out_file}" "OVERWRITTEN_VAR=${OVERWRITTEN_VAR}\n")
22+
1423
foreach(list IN ITEMS ONE_LEVEL_LIST NESTED_LIST)
1524
list(LENGTH ${list} length)
1625
file(APPEND "${out_file}" "${list}.LENGTH = ${length}\n")
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
{
2+
"version": 1,
3+
"configurePresets": [
4+
{
5+
"name": "scikit",
6+
"cacheVariables": {
7+
"PRESET_ONLY_VAR": "defined",
8+
"OVERWRITTEN_VAR": "original"
9+
},
10+
"binaryDir": "/dev/null",
11+
"generator": "Ninja"
12+
}
13+
]
14+
}

0 commit comments

Comments
 (0)