1010import packaging .tags
1111from packaging .specifiers import SpecifierSet
1212
13+ from .. import __version__
1314from .._compat import tomllib
1415from .._logging import logger
1516from ..builder .sysconfig import get_abi_flags
@@ -78,10 +79,12 @@ def override_match(
7879 system_cmake : str | None = None ,
7980 cmake_wheel : bool | None = None ,
8081 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 ]]:
8285 """
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.
8588 """
8689
8790 passed_dict = {}
@@ -90,6 +93,16 @@ def override_match(
9093 if current_env is None :
9194 current_env = os .environ
9295
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+
93106 if python_version is not None :
94107 current_python_version = "." .join (str (x ) for x in sys .version_info [:2 ])
95108 match_msg = version_match (current_python_version , python_version , "Python" )
@@ -219,11 +232,11 @@ def override_match(
219232 else :
220233 failed_set .add (f"env.{ key } " )
221234
222- if not passed_dict and not failed_set :
235+ if len ( passed_dict ) + len ( failed_set ) + len ( unknown ) < 1 :
223236 msg = "At least one override must be provided"
224237 raise ValueError (msg )
225238
226- return passed_dict , failed_set
239+ return passed_dict , failed_set , unknown
227240
228241
229242def inherit_join (
@@ -261,7 +274,9 @@ def process_overides(
261274 for override in tool_skb .pop ("overrides" , []):
262275 passed_any : dict [str , str ] | None = None
263276 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 ()
265280 if_override = override .pop ("if" , None )
266281 if not if_override :
267282 msg = "At least one 'if' override must be provided"
@@ -272,13 +287,14 @@ def process_overides(
272287 if "any" in if_override :
273288 any_override = if_override .pop ("any" )
274289 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 (
276291 current_env = env ,
277292 current_state = state ,
278293 has_dist_info = has_dist_info ,
279294 retry = retry ,
280295 ** select ,
281296 )
297+ unknown |= set (unknown_any )
282298
283299 inherit_override = override .pop ("inherit" , {})
284300 if not isinstance (inherit_override , dict ):
@@ -287,20 +303,32 @@ def process_overides(
287303
288304 select = {k .replace ("-" , "_" ): v for k , v in if_override .items ()}
289305 if select :
290- passed_all , failed = override_match (
306+ passed_all , failed_all , unknown_all = override_match (
291307 current_env = env ,
292308 current_state = state ,
293309 has_dist_info = has_dist_info ,
294310 retry = retry ,
295311 ** select ,
296312 )
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 )
297325
298326 # If no overrides are passed, do nothing
299327 if passed_any is None and passed_all is None :
300328 continue
301329
302330 # 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 :
304332 continue
305333
306334 # If any is passed, at least one always needs to pass.
@@ -310,6 +338,10 @@ def process_overides(
310338 local_matched = set (passed_any or []) | set (passed_all or [])
311339 global_matched |= local_matched
312340 if local_matched :
341+ if unknown :
342+ msg = f"Unknown overrides: { ', ' .join (unknown )} "
343+ raise TypeError (msg )
344+
313345 all_str = " and " .join (
314346 [
315347 * (passed_all or {}).values (),
0 commit comments