30
30
BuildFrontendConfig ,
31
31
BuildSelector ,
32
32
DependencyConstraints ,
33
+ EnableGroups ,
33
34
TestSelector ,
34
35
format_safe ,
35
36
resources_dir ,
@@ -511,6 +512,7 @@ def get(
511
512
env_plat : bool = True ,
512
513
option_format : OptionFormat | None = None ,
513
514
ignore_empty : bool = False ,
515
+ env_rule : InheritRule = InheritRule .NONE ,
514
516
) -> str :
515
517
"""
516
518
Get and return the value for the named option from environment,
@@ -542,8 +544,8 @@ def get(
542
544
(o .options .get (name ), o .inherit .get (name , InheritRule .NONE ))
543
545
for o in self .active_config_overrides
544
546
],
545
- (self .env .get (envvar ), InheritRule . NONE ),
546
- (self .env .get (plat_envvar ) if env_plat else None , InheritRule . NONE ),
547
+ (self .env .get (envvar ), env_rule ),
548
+ (self .env .get (plat_envvar ) if env_plat else None , env_rule ),
547
549
ignore_empty = ignore_empty ,
548
550
option_format = option_format ,
549
551
)
@@ -599,16 +601,36 @@ def globals(self) -> GlobalOptions:
599
601
skip_config = self .reader .get ("skip" , env_plat = False , option_format = ListFormat (sep = " " ))
600
602
test_skip = self .reader .get ("test-skip" , env_plat = False , option_format = ListFormat (sep = " " ))
601
603
604
+ allow_empty = args .allow_empty or strtobool (self .env .get ("CIBW_ALLOW_EMPTY" , "0" ))
605
+
606
+ enable_groups = self .reader .get (
607
+ "enable" , env_plat = False , option_format = ListFormat (sep = " " ), env_rule = InheritRule .APPEND
608
+ )
609
+ if enable_groups :
610
+ enable = {EnableGroups (group ) for group in enable_groups .split ()}
611
+
602
612
free_threaded_support = strtobool (
603
613
self .reader .get ("free-threaded-support" , env_plat = False , ignore_empty = True )
604
614
)
605
615
606
- allow_empty = args .allow_empty or strtobool (self .env .get ("CIBW_ALLOW_EMPTY" , "0" ))
607
-
608
616
prerelease_pythons = args .prerelease_pythons or strtobool (
609
617
self .env .get ("CIBW_PRERELEASE_PYTHONS" , "0" )
610
618
)
611
619
620
+ if enable and (free_threaded_support or prerelease_pythons ):
621
+ msg = (
622
+ "free-threaded-support and prerelease-pythons should be specified by enable instead"
623
+ )
624
+ raise OptionsReaderError (msg )
625
+
626
+ if free_threaded_support :
627
+ enable .add (EnableGroups .CPythonFreeThreaded )
628
+ if prerelease_pythons :
629
+ enable .add (EnableGroups .CPythonPrerelease )
630
+
631
+ # For backwards compatibility, we are adding EoL Python versions to the enable group for one more release.
632
+ enable |= {EnableGroups .CPythonEoL , EnableGroups .PyPyEoL }
633
+
612
634
# This is not supported in tool.cibuildwheel, as it comes from a standard location.
613
635
# Passing this in as an environment variable will override pyproject.toml, setup.cfg, or setup.py
614
636
requires_python_str : str | None = (
@@ -624,15 +646,13 @@ def globals(self) -> GlobalOptions:
624
646
build_config = args .only
625
647
skip_config = ""
626
648
architectures = Architecture .all_archs (self .platform )
627
- prerelease_pythons = True
628
- free_threaded_support = True
649
+ enable = set (EnableGroups )
629
650
630
651
build_selector = BuildSelector (
631
652
build_config = build_config ,
632
653
skip_config = skip_config ,
633
654
requires_python = requires_python ,
634
- prerelease_pythons = prerelease_pythons ,
635
- free_threaded_support = free_threaded_support ,
655
+ enable = frozenset (enable ),
636
656
)
637
657
test_selector = TestSelector (skip_config = test_skip )
638
658
0 commit comments