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,23 +601,46 @@ 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
+ enable = {EnableGroups (group ) for group in enable_groups .split ()}
610
+
602
611
free_threaded_support = strtobool (
603
612
self .reader .get ("free-threaded-support" , env_plat = False , ignore_empty = True )
604
613
)
605
614
606
- allow_empty = args .allow_empty or strtobool (self .env .get ("CIBW_ALLOW_EMPTY" , "0" ))
607
-
608
615
prerelease_pythons = args .prerelease_pythons or strtobool (
609
616
self .env .get ("CIBW_PRERELEASE_PYTHONS" , "0" )
610
617
)
611
618
619
+ if enable and (free_threaded_support or prerelease_pythons ):
620
+ msg = (
621
+ "free-threaded-support and prerelease-pythons should be specified by enable instead"
622
+ )
623
+ raise OptionsReaderError (msg )
624
+
625
+ if free_threaded_support :
626
+ enable .add (EnableGroups .CPythonFreeThreaded )
627
+ if prerelease_pythons :
628
+ enable .add (EnableGroups .CPythonPrerelease )
629
+
630
+ # For backwards compatibility, we are adding EoL Python versions to the enable group for one more release.
631
+ enable |= {EnableGroups .CPythonEoL , EnableGroups .PyPyEoL }
632
+
612
633
# This is not supported in tool.cibuildwheel, as it comes from a standard location.
613
634
# Passing this in as an environment variable will override pyproject.toml, setup.cfg, or setup.py
614
635
requires_python_str : str | None = (
615
636
self .env .get ("CIBW_PROJECT_REQUIRES_PYTHON" ) or self .package_requires_python_str
616
637
)
617
638
requires_python = None if requires_python_str is None else SpecifierSet (requires_python_str )
618
639
640
+ # Requires-python overrides cpython-eol
641
+ if requires_python is not None :
642
+ enable .add (EnableGroups .CPythonEoL )
643
+
619
644
archs_config_str = args .archs or self .reader .get ("archs" , option_format = ListFormat (sep = " " ))
620
645
architectures = Architecture .parse_config (archs_config_str , platform = self .platform )
621
646
@@ -624,15 +649,13 @@ def globals(self) -> GlobalOptions:
624
649
build_config = args .only
625
650
skip_config = ""
626
651
architectures = Architecture .all_archs (self .platform )
627
- prerelease_pythons = True
628
- free_threaded_support = True
652
+ enable = set (EnableGroups )
629
653
630
654
build_selector = BuildSelector (
631
655
build_config = build_config ,
632
656
skip_config = skip_config ,
633
657
requires_python = requires_python ,
634
- prerelease_pythons = prerelease_pythons ,
635
- free_threaded_support = free_threaded_support ,
658
+ enable = frozenset (enable ),
636
659
)
637
660
test_selector = TestSelector (skip_config = test_skip )
638
661
0 commit comments