10
10
import packaging .tags
11
11
from packaging .specifiers import SpecifierSet
12
12
13
+ from .. import __version__
13
14
from .._compat import tomllib
14
15
from .._logging import logger
15
16
from ..builder .sysconfig import get_abi_flags
@@ -78,10 +79,12 @@ def override_match(
78
79
system_cmake : str | None = None ,
79
80
cmake_wheel : bool | None = None ,
80
81
abi_flags : str | None = None ,
81
- ) -> tuple [dict [str , str ], set [str ]]:
82
+ scikit_build_version : str | None = None ,
83
+ ** unknown : Any ,
84
+ ) -> tuple [dict [str , str ], set [str ], dict [str , Any ]]:
82
85
"""
83
- Check if the current environment matches the overrides. Returns a dict
84
- of passed matches, with reasons for values, and a set of non-matches.
86
+ Check if the current environment matches the overrides. Returns a dict of
87
+ passed matches, with reasons for values, and a set of non-matches.
85
88
"""
86
89
87
90
passed_dict = {}
@@ -90,6 +93,16 @@ def override_match(
90
93
if current_env is None :
91
94
current_env = os .environ
92
95
96
+ if scikit_build_version is not None :
97
+ current_version = __version__
98
+ match_msg = version_match (
99
+ current_version , scikit_build_version , "scikit-build-core"
100
+ )
101
+ if match_msg :
102
+ passed_dict ["scikit-build-version" ] = match_msg
103
+ else :
104
+ failed_set .add ("scikit-build-version" )
105
+
93
106
if python_version is not None :
94
107
current_python_version = "." .join (str (x ) for x in sys .version_info [:2 ])
95
108
match_msg = version_match (current_python_version , python_version , "Python" )
@@ -219,11 +232,11 @@ def override_match(
219
232
else :
220
233
failed_set .add (f"env.{ key } " )
221
234
222
- if not passed_dict and not failed_set :
235
+ if len ( passed_dict ) + len ( failed_set ) + len ( unknown ) < 1 :
223
236
msg = "At least one override must be provided"
224
237
raise ValueError (msg )
225
238
226
- return passed_dict , failed_set
239
+ return passed_dict , failed_set , unknown
227
240
228
241
229
242
def inherit_join (
@@ -261,7 +274,9 @@ def process_overides(
261
274
for override in tool_skb .pop ("overrides" , []):
262
275
passed_any : dict [str , str ] | None = None
263
276
passed_all : dict [str , str ] | None = None
264
- failed : set [str ] = set ()
277
+ unknown : set [str ] = set ()
278
+ failed_any : set [str ] = set ()
279
+ failed_all : set [str ] = set ()
265
280
if_override = override .pop ("if" , None )
266
281
if not if_override :
267
282
msg = "At least one 'if' override must be provided"
@@ -272,13 +287,14 @@ def process_overides(
272
287
if "any" in if_override :
273
288
any_override = if_override .pop ("any" )
274
289
select = {k .replace ("-" , "_" ): v for k , v in any_override .items ()}
275
- passed_any , _ = override_match (
290
+ passed_any , failed_any , unknown_any = override_match (
276
291
current_env = env ,
277
292
current_state = state ,
278
293
has_dist_info = has_dist_info ,
279
294
retry = retry ,
280
295
** select ,
281
296
)
297
+ unknown |= set (unknown_any )
282
298
283
299
inherit_override = override .pop ("inherit" , {})
284
300
if not isinstance (inherit_override , dict ):
@@ -287,20 +303,32 @@ def process_overides(
287
303
288
304
select = {k .replace ("-" , "_" ): v for k , v in if_override .items ()}
289
305
if select :
290
- passed_all , failed = override_match (
306
+ passed_all , failed_all , unknown_all = override_match (
291
307
current_env = env ,
292
308
current_state = state ,
293
309
has_dist_info = has_dist_info ,
294
310
retry = retry ,
295
311
** select ,
296
312
)
313
+ unknown |= set (unknown_all )
314
+
315
+ # Verify no unknown options are present unless scikit-build-version is specified
316
+ passed_or_failed = {
317
+ * (passed_all or {}),
318
+ * (passed_any or {}),
319
+ * failed_all ,
320
+ * failed_any ,
321
+ }
322
+ if "scikit-build-version" not in passed_or_failed and unknown :
323
+ msg = f"Unknown overrides: { ', ' .join (unknown )} "
324
+ raise TypeError (msg )
297
325
298
326
# If no overrides are passed, do nothing
299
327
if passed_any is None and passed_all is None :
300
328
continue
301
329
302
330
# If normal overrides are passed and one or more fails, do nothing
303
- if passed_all is not None and failed :
331
+ if passed_all is not None and failed_all :
304
332
continue
305
333
306
334
# If any is passed, at least one always needs to pass.
@@ -310,6 +338,10 @@ def process_overides(
310
338
local_matched = set (passed_any or []) | set (passed_all or [])
311
339
global_matched |= local_matched
312
340
if local_matched :
341
+ if unknown :
342
+ msg = f"Unknown overrides: { ', ' .join (unknown )} "
343
+ raise TypeError (msg )
344
+
313
345
all_str = " and " .join (
314
346
[
315
347
* (passed_all or {}).values (),
0 commit comments