diff --git a/README.md b/README.md
index 2caeeaa76..e6f6b4aa5 100644
--- a/README.md
+++ b/README.md
@@ -22,27 +22,26 @@ What does it do?
While cibuildwheel itself requires a recent Python version to run (we support the last three releases), it can target the following versions to build wheels:
-| | macOS Intel | macOS Apple Silicon | Windows 64bit | Windows 32bit | Windows Arm64 | manylinux
musllinux x86_64 | manylinux
musllinux i686 | manylinux
musllinux aarch64 | manylinux
musllinux ppc64le | manylinux
musllinux s390x | manylinux
musllinux armv7l | Android | iOS | Pyodide |
-| ------------------------ | ----------- | ------------------- | ------------- | ------------- | -------------- | ------------------------------ | ---------------------------- | ------------------------------- | ------------------------------- | ----------------------------- | ------------------------------ | ------- | --- | -------------- |
-| CPython 3.8 | ✅ | ✅ | ✅ | ✅ | N/A | ✅ | ✅ | ✅ | ✅ | ✅ | ✅5 | N/A | N/A | N/A |
-| CPython 3.9 | ✅ | ✅ | ✅ | ✅ | ✅2 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅5 | N/A | N/A | N/A |
-| CPython 3.10 | ✅ | ✅ | ✅ | ✅ | ✅2 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅5 | N/A | N/A | N/A |
-| CPython 3.11 | ✅ | ✅ | ✅ | ✅ | ✅2 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅5 | N/A | N/A | N/A |
-| CPython 3.12 | ✅ | ✅ | ✅ | ✅ | ✅2 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅5 | N/A | N/A | ✅4 |
-| CPython 3.133 | ✅ | ✅ | ✅ | ✅ | ✅2 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅5 | ✅ | ✅ | ✅4 |
-| CPython 3.14 | ✅ | ✅ | ✅ | ✅ | ✅2 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅5 | ✅ | ✅ | N/A |
-| PyPy 3.8 v7.3 | ✅ | ✅ | ✅ | N/A | N/A | ✅1 | ✅1 | ✅1 | N/A | N/A | N/A | N/A | N/A | N/A |
-| PyPy 3.9 v7.3 | ✅ | ✅ | ✅ | N/A | N/A | ✅1 | ✅1 | ✅1 | N/A | N/A | N/A | N/A | N/A | N/A |
-| PyPy 3.10 v7.3 | ✅ | ✅ | ✅ | N/A | N/A | ✅1 | ✅1 | ✅1 | N/A | N/A | N/A | N/A | N/A | N/A |
-| PyPy 3.11 v7.3 | ✅ | ✅ | ✅ | N/A | N/A | ✅1 | ✅1 | ✅1 | N/A | N/A | N/A | N/A | N/A | N/A |
-| GraalPy 3.11 v24.2 | ✅ | ✅ | ✅ | N/A | N/A | ✅1 | N/A | ✅1 | N/A | N/A | N/A | N/A | N/A | N/A |
-| GraalPy 3.12 v25.0 | ✅ | ✅ | ✅ | N/A | N/A | ✅1 | N/A | ✅1 | N/A | N/A | N/A | N/A | N/A | N/A |
+| | macOS Intel | macOS Apple Silicon | Windows 64bit | Windows 32bit | Windows Arm64 | manylinux
musllinux x86_64 | manylinux
musllinux i686 | manylinux
musllinux aarch64 | manylinux
musllinux ppc64le | manylinux
musllinux s390x | manylinux
musllinux armv7l | Android | iOS | Pyodide |
+| ------------------ | ----------- | ------------------- | ------------- | ------------- | -------------- | ------------------------------ | ---------------------------- | ------------------------------- | ------------------------------- | ----------------------------- | ------------------------------ | ------- | --- | -------------- |
+| CPython 3.8 | ✅ | ✅ | ✅ | ✅ | N/A | ✅ | ✅ | ✅ | ✅ | ✅ | ✅4 | N/A | N/A | N/A |
+| CPython 3.9 | ✅ | ✅ | ✅ | ✅ | ✅2 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅4 | N/A | N/A | N/A |
+| CPython 3.10 | ✅ | ✅ | ✅ | ✅ | ✅2 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅4 | N/A | N/A | N/A |
+| CPython 3.11 | ✅ | ✅ | ✅ | ✅ | ✅2 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅4 | N/A | N/A | N/A |
+| CPython 3.12 | ✅ | ✅ | ✅ | ✅ | ✅2 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅4 | N/A | N/A | ✅3 |
+| CPython 3.13 | ✅ | ✅ | ✅ | ✅ | ✅2 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅4 | ✅ | ✅ | ✅3 |
+| CPython 3.14 | ✅ | ✅ | ✅ | ✅ | ✅2 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅4 | ✅ | ✅ | N/A |
+| PyPy 3.8 v7.3 | ✅ | ✅ | ✅ | N/A | N/A | ✅1 | ✅1 | ✅1 | N/A | N/A | N/A | N/A | N/A | N/A |
+| PyPy 3.9 v7.3 | ✅ | ✅ | ✅ | N/A | N/A | ✅1 | ✅1 | ✅1 | N/A | N/A | N/A | N/A | N/A | N/A |
+| PyPy 3.10 v7.3 | ✅ | ✅ | ✅ | N/A | N/A | ✅1 | ✅1 | ✅1 | N/A | N/A | N/A | N/A | N/A | N/A |
+| PyPy 3.11 v7.3 | ✅ | ✅ | ✅ | N/A | N/A | ✅1 | ✅1 | ✅1 | N/A | N/A | N/A | N/A | N/A | N/A |
+| GraalPy 3.11 v24.2 | ✅ | ✅ | ✅ | N/A | N/A | ✅1 | N/A | ✅1 | N/A | N/A | N/A | N/A | N/A | N/A |
+| GraalPy 3.12 v25.0 | ✅ | ✅ | ✅ | N/A | N/A | ✅1 | N/A | ✅1 | N/A | N/A | N/A | N/A | N/A | N/A |
**1** PyPy & GraalPy are only supported for manylinux wheels.
**2** Windows arm64 support is experimental.
-**3** Free-threaded mode requires opt-in on 3.13 using [`enable`](https://cibuildwheel.pypa.io/en/stable/options/#enable).
-**4** Experimental, not yet supported on PyPI, but can be used directly in web deployment. Use `--platform pyodide` to build.
-**5** manylinux armv7l support is experimental. As there are no RHEL based image for this architecture, it's using an Ubuntu based image instead.
+**3** Experimental, not yet supported on PyPI, but can be used directly in web deployment. Use `--platform pyodide` to build.
+**4** manylinux armv7l support is experimental. As there are no RHEL based image for this architecture, it's using an Ubuntu based image instead.
- Builds manylinux, musllinux, macOS, and Windows wheels for CPython, PyPy, and GraalPy
- Works on GitHub Actions, Azure Pipelines, CircleCI, and GitLab CI
diff --git a/bin/generate_schema.py b/bin/generate_schema.py
index 022ffe356..6d0826be6 100755
--- a/bin/generate_schema.py
+++ b/bin/generate_schema.py
@@ -28,7 +28,6 @@
description: How to inherit the parent's value.
enable:
enum:
- - cpython-freethreading
- cpython-prerelease
- graalpy
- pyodide-prerelease
diff --git a/cibuildwheel/__main__.py b/cibuildwheel/__main__.py
index ab15f60c1..0584e77a4 100644
--- a/cibuildwheel/__main__.py
+++ b/cibuildwheel/__main__.py
@@ -468,13 +468,6 @@ def detect_warnings(*, options: Options) -> Generator[str, None, None]:
build_selector = options.globals.build_selector
test_selector = options.globals.test_selector
- if EnableGroup.CPythonFreeThreading in build_selector.enable:
- yield (
- "'cpython-freethreading' enable is deprecated and will be removed in a future version. "
- "It should be removed from tool.cibuildwheel.enable in pyproject.toml "
- "or CIBW_ENABLE environment variable."
- )
-
all_valid_identifiers = [
config.identifier
for module in ALL_PLATFORM_MODULES.values()
@@ -545,6 +538,9 @@ def check_for_invalid_selectors(
if "p36" in selector_ or "p37" in selector_:
msg += f"cibuildwheel 3.x no longer supports Python < 3.8. Please use the 2.x series or update `{selector_name}`. "
error_type = errors.DeprecationError
+ if "cp313t" in selector_:
+ msg += f"cibuildwheel 4.x no longer supports Python 3.13 free-threading. Please use the 3.x series or update `{selector_name}`. "
+ error_type = errors.DeprecationError
if selector_name == "build":
raise error_type(msg)
diff --git a/cibuildwheel/options.py b/cibuildwheel/options.py
index 972c7b2c6..705c2db00 100644
--- a/cibuildwheel/options.py
+++ b/cibuildwheel/options.py
@@ -686,8 +686,6 @@ def globals(self) -> GlobalOptions:
skip_config = ""
architectures = Architecture.all_archs(self.platform)
enable |= EnableGroup.all_groups()
- if args.only.startswith("cp313t-"):
- enable.add(EnableGroup.CPythonFreeThreading)
build_selector = BuildSelector(
build_config=build_config,
diff --git a/cibuildwheel/platforms/macos.py b/cibuildwheel/platforms/macos.py
index 37c3d799c..3aea15b90 100644
--- a/cibuildwheel/platforms/macos.py
+++ b/cibuildwheel/platforms/macos.py
@@ -151,10 +151,7 @@ def install_cpython(_tmp: Path, version: str, url: str, free_threading: bool) ->
if not pkg_path.exists():
download(url, pkg_path)
args = []
- if version.startswith("3.13"):
- # Python 3.13 is the first version to have a free-threading option
- args += ["-applyChoiceChangesXML", str(resources.FREE_THREAD_ENABLE_313.resolve())]
- elif version.startswith("3.14"):
+ if version.startswith("3.14"):
args += ["-applyChoiceChangesXML", str(resources.FREE_THREAD_ENABLE_314.resolve())]
call("sudo", "installer", "-pkg", pkg_path, *args, "-target", "/")
pkg_path.unlink()
diff --git a/cibuildwheel/resources/build-platforms.toml b/cibuildwheel/resources/build-platforms.toml
index 5a284b103..a408c4350 100644
--- a/cibuildwheel/resources/build-platforms.toml
+++ b/cibuildwheel/resources/build-platforms.toml
@@ -6,7 +6,6 @@ python_configurations = [
{ identifier = "cp311-manylinux_x86_64", version = "3.11", path_str = "/opt/python/cp311-cp311" },
{ identifier = "cp312-manylinux_x86_64", version = "3.12", path_str = "/opt/python/cp312-cp312" },
{ identifier = "cp313-manylinux_x86_64", version = "3.13", path_str = "/opt/python/cp313-cp313" },
- { identifier = "cp313t-manylinux_x86_64", version = "3.13", path_str = "/opt/python/cp313-cp313t" },
{ identifier = "cp314-manylinux_x86_64", version = "3.14", path_str = "/opt/python/cp314-cp314" },
{ identifier = "cp314t-manylinux_x86_64", version = "3.14", path_str = "/opt/python/cp314-cp314t" },
{ identifier = "cp38-manylinux_i686", version = "3.8", path_str = "/opt/python/cp38-cp38" },
@@ -15,7 +14,6 @@ python_configurations = [
{ identifier = "cp311-manylinux_i686", version = "3.11", path_str = "/opt/python/cp311-cp311" },
{ identifier = "cp312-manylinux_i686", version = "3.12", path_str = "/opt/python/cp312-cp312" },
{ identifier = "cp313-manylinux_i686", version = "3.13", path_str = "/opt/python/cp313-cp313" },
- { identifier = "cp313t-manylinux_i686", version = "3.13", path_str = "/opt/python/cp313-cp313t" },
{ identifier = "cp314-manylinux_i686", version = "3.14", path_str = "/opt/python/cp314-cp314" },
{ identifier = "cp314t-manylinux_i686", version = "3.14", path_str = "/opt/python/cp314-cp314t" },
{ identifier = "pp38-manylinux_x86_64", version = "3.8", path_str = "/opt/python/pp38-pypy38_pp73" },
@@ -30,7 +28,6 @@ python_configurations = [
{ identifier = "cp311-manylinux_aarch64", version = "3.11", path_str = "/opt/python/cp311-cp311" },
{ identifier = "cp312-manylinux_aarch64", version = "3.12", path_str = "/opt/python/cp312-cp312" },
{ identifier = "cp313-manylinux_aarch64", version = "3.13", path_str = "/opt/python/cp313-cp313" },
- { identifier = "cp313t-manylinux_aarch64", version = "3.13", path_str = "/opt/python/cp313-cp313t" },
{ identifier = "cp314-manylinux_aarch64", version = "3.14", path_str = "/opt/python/cp314-cp314" },
{ identifier = "cp314t-manylinux_aarch64", version = "3.14", path_str = "/opt/python/cp314-cp314t" },
{ identifier = "cp38-manylinux_ppc64le", version = "3.8", path_str = "/opt/python/cp38-cp38" },
@@ -39,7 +36,6 @@ python_configurations = [
{ identifier = "cp311-manylinux_ppc64le", version = "3.11", path_str = "/opt/python/cp311-cp311" },
{ identifier = "cp312-manylinux_ppc64le", version = "3.12", path_str = "/opt/python/cp312-cp312" },
{ identifier = "cp313-manylinux_ppc64le", version = "3.13", path_str = "/opt/python/cp313-cp313" },
- { identifier = "cp313t-manylinux_ppc64le", version = "3.13", path_str = "/opt/python/cp313-cp313t" },
{ identifier = "cp314-manylinux_ppc64le", version = "3.14", path_str = "/opt/python/cp314-cp314" },
{ identifier = "cp314t-manylinux_ppc64le", version = "3.14", path_str = "/opt/python/cp314-cp314t" },
{ identifier = "cp38-manylinux_s390x", version = "3.8", path_str = "/opt/python/cp38-cp38" },
@@ -48,7 +44,6 @@ python_configurations = [
{ identifier = "cp311-manylinux_s390x", version = "3.11", path_str = "/opt/python/cp311-cp311" },
{ identifier = "cp312-manylinux_s390x", version = "3.12", path_str = "/opt/python/cp312-cp312" },
{ identifier = "cp313-manylinux_s390x", version = "3.13", path_str = "/opt/python/cp313-cp313" },
- { identifier = "cp313t-manylinux_s390x", version = "3.13", path_str = "/opt/python/cp313-cp313t" },
{ identifier = "cp314-manylinux_s390x", version = "3.14", path_str = "/opt/python/cp314-cp314" },
{ identifier = "cp314t-manylinux_s390x", version = "3.14", path_str = "/opt/python/cp314-cp314t" },
{ identifier = "cp38-manylinux_armv7l", version = "3.8", path_str = "/opt/python/cp38-cp38" },
@@ -57,7 +52,6 @@ python_configurations = [
{ identifier = "cp311-manylinux_armv7l", version = "3.11", path_str = "/opt/python/cp311-cp311" },
{ identifier = "cp312-manylinux_armv7l", version = "3.12", path_str = "/opt/python/cp312-cp312" },
{ identifier = "cp313-manylinux_armv7l", version = "3.13", path_str = "/opt/python/cp313-cp313" },
- { identifier = "cp313t-manylinux_armv7l", version = "3.13", path_str = "/opt/python/cp313-cp313t" },
{ identifier = "cp314-manylinux_armv7l", version = "3.14", path_str = "/opt/python/cp314-cp314" },
{ identifier = "cp314t-manylinux_armv7l", version = "3.14", path_str = "/opt/python/cp314-cp314t" },
{ identifier = "cp38-manylinux_riscv64", version = "3.8", path_str = "/opt/python/cp38-cp38" },
@@ -66,7 +60,6 @@ python_configurations = [
{ identifier = "cp311-manylinux_riscv64", version = "3.11", path_str = "/opt/python/cp311-cp311" },
{ identifier = "cp312-manylinux_riscv64", version = "3.12", path_str = "/opt/python/cp312-cp312" },
{ identifier = "cp313-manylinux_riscv64", version = "3.13", path_str = "/opt/python/cp313-cp313" },
- { identifier = "cp313t-manylinux_riscv64", version = "3.13", path_str = "/opt/python/cp313-cp313t" },
{ identifier = "cp314-manylinux_riscv64", version = "3.14", path_str = "/opt/python/cp314-cp314" },
{ identifier = "cp314t-manylinux_riscv64", version = "3.14", path_str = "/opt/python/cp314-cp314t" },
{ identifier = "pp38-manylinux_aarch64", version = "3.8", path_str = "/opt/python/pp38-pypy38_pp73" },
@@ -85,7 +78,6 @@ python_configurations = [
{ identifier = "cp311-musllinux_x86_64", version = "3.11", path_str = "/opt/python/cp311-cp311" },
{ identifier = "cp312-musllinux_x86_64", version = "3.12", path_str = "/opt/python/cp312-cp312" },
{ identifier = "cp313-musllinux_x86_64", version = "3.13", path_str = "/opt/python/cp313-cp313" },
- { identifier = "cp313t-musllinux_x86_64", version = "3.13", path_str = "/opt/python/cp313-cp313t" },
{ identifier = "cp314-musllinux_x86_64", version = "3.14", path_str = "/opt/python/cp314-cp314" },
{ identifier = "cp314t-musllinux_x86_64", version = "3.14", path_str = "/opt/python/cp314-cp314t" },
{ identifier = "cp38-musllinux_i686", version = "3.8", path_str = "/opt/python/cp38-cp38" },
@@ -94,7 +86,6 @@ python_configurations = [
{ identifier = "cp311-musllinux_i686", version = "3.11", path_str = "/opt/python/cp311-cp311" },
{ identifier = "cp312-musllinux_i686", version = "3.12", path_str = "/opt/python/cp312-cp312" },
{ identifier = "cp313-musllinux_i686", version = "3.13", path_str = "/opt/python/cp313-cp313" },
- { identifier = "cp313t-musllinux_i686", version = "3.13", path_str = "/opt/python/cp313-cp313t" },
{ identifier = "cp314-musllinux_i686", version = "3.14", path_str = "/opt/python/cp314-cp314" },
{ identifier = "cp314t-musllinux_i686", version = "3.14", path_str = "/opt/python/cp314-cp314t" },
{ identifier = "cp38-musllinux_aarch64", version = "3.8", path_str = "/opt/python/cp38-cp38" },
@@ -103,7 +94,6 @@ python_configurations = [
{ identifier = "cp311-musllinux_aarch64", version = "3.11", path_str = "/opt/python/cp311-cp311" },
{ identifier = "cp312-musllinux_aarch64", version = "3.12", path_str = "/opt/python/cp312-cp312" },
{ identifier = "cp313-musllinux_aarch64", version = "3.13", path_str = "/opt/python/cp313-cp313" },
- { identifier = "cp313t-musllinux_aarch64", version = "3.13", path_str = "/opt/python/cp313-cp313t" },
{ identifier = "cp314-musllinux_aarch64", version = "3.14", path_str = "/opt/python/cp314-cp314" },
{ identifier = "cp314t-musllinux_aarch64", version = "3.14", path_str = "/opt/python/cp314-cp314t" },
{ identifier = "cp38-musllinux_ppc64le", version = "3.8", path_str = "/opt/python/cp38-cp38" },
@@ -112,7 +102,6 @@ python_configurations = [
{ identifier = "cp311-musllinux_ppc64le", version = "3.11", path_str = "/opt/python/cp311-cp311" },
{ identifier = "cp312-musllinux_ppc64le", version = "3.12", path_str = "/opt/python/cp312-cp312" },
{ identifier = "cp313-musllinux_ppc64le", version = "3.13", path_str = "/opt/python/cp313-cp313" },
- { identifier = "cp313t-musllinux_ppc64le", version = "3.13", path_str = "/opt/python/cp313-cp313t" },
{ identifier = "cp314-musllinux_ppc64le", version = "3.14", path_str = "/opt/python/cp314-cp314" },
{ identifier = "cp314t-musllinux_ppc64le", version = "3.14", path_str = "/opt/python/cp314-cp314t" },
{ identifier = "cp38-musllinux_s390x", version = "3.8", path_str = "/opt/python/cp38-cp38" },
@@ -121,7 +110,6 @@ python_configurations = [
{ identifier = "cp311-musllinux_s390x", version = "3.11", path_str = "/opt/python/cp311-cp311" },
{ identifier = "cp312-musllinux_s390x", version = "3.12", path_str = "/opt/python/cp312-cp312" },
{ identifier = "cp313-musllinux_s390x", version = "3.13", path_str = "/opt/python/cp313-cp313" },
- { identifier = "cp313t-musllinux_s390x", version = "3.13", path_str = "/opt/python/cp313-cp313t" },
{ identifier = "cp314-musllinux_s390x", version = "3.14", path_str = "/opt/python/cp314-cp314" },
{ identifier = "cp314t-musllinux_s390x", version = "3.14", path_str = "/opt/python/cp314-cp314t" },
{ identifier = "cp38-musllinux_armv7l", version = "3.8", path_str = "/opt/python/cp38-cp38" },
@@ -130,7 +118,6 @@ python_configurations = [
{ identifier = "cp311-musllinux_armv7l", version = "3.11", path_str = "/opt/python/cp311-cp311" },
{ identifier = "cp312-musllinux_armv7l", version = "3.12", path_str = "/opt/python/cp312-cp312" },
{ identifier = "cp313-musllinux_armv7l", version = "3.13", path_str = "/opt/python/cp313-cp313" },
- { identifier = "cp313t-musllinux_armv7l", version = "3.13", path_str = "/opt/python/cp313-cp313t" },
{ identifier = "cp314-musllinux_armv7l", version = "3.14", path_str = "/opt/python/cp314-cp314" },
{ identifier = "cp314t-musllinux_armv7l", version = "3.14", path_str = "/opt/python/cp314-cp314t" },
{ identifier = "cp38-musllinux_riscv64", version = "3.8", path_str = "/opt/python/cp38-cp38" },
@@ -139,7 +126,6 @@ python_configurations = [
{ identifier = "cp311-musllinux_riscv64", version = "3.11", path_str = "/opt/python/cp311-cp311" },
{ identifier = "cp312-musllinux_riscv64", version = "3.12", path_str = "/opt/python/cp312-cp312" },
{ identifier = "cp313-musllinux_riscv64", version = "3.13", path_str = "/opt/python/cp313-cp313" },
- { identifier = "cp313t-musllinux_riscv64", version = "3.13", path_str = "/opt/python/cp313-cp313t" },
{ identifier = "cp314-musllinux_riscv64", version = "3.14", path_str = "/opt/python/cp314-cp314" },
{ identifier = "cp314t-musllinux_riscv64", version = "3.14", path_str = "/opt/python/cp314-cp314t" },
]
@@ -164,9 +150,6 @@ python_configurations = [
{ identifier = "cp313-macosx_x86_64", version = "3.13", url = "https://www.python.org/ftp/python/3.13.13/python-3.13.13-macos11.pkg" },
{ identifier = "cp313-macosx_arm64", version = "3.13", url = "https://www.python.org/ftp/python/3.13.13/python-3.13.13-macos11.pkg" },
{ identifier = "cp313-macosx_universal2", version = "3.13", url = "https://www.python.org/ftp/python/3.13.13/python-3.13.13-macos11.pkg" },
- { identifier = "cp313t-macosx_x86_64", version = "3.13", url = "https://www.python.org/ftp/python/3.13.13/python-3.13.13-macos11.pkg" },
- { identifier = "cp313t-macosx_arm64", version = "3.13", url = "https://www.python.org/ftp/python/3.13.13/python-3.13.13-macos11.pkg" },
- { identifier = "cp313t-macosx_universal2", version = "3.13", url = "https://www.python.org/ftp/python/3.13.13/python-3.13.13-macos11.pkg" },
{ identifier = "cp314-macosx_x86_64", version = "3.14", url = "https://www.python.org/ftp/python/3.14.4/python-3.14.4-macos11.pkg" },
{ identifier = "cp314-macosx_arm64", version = "3.14", url = "https://www.python.org/ftp/python/3.14.4/python-3.14.4-macos11.pkg" },
{ identifier = "cp314-macosx_universal2", version = "3.14", url = "https://www.python.org/ftp/python/3.14.4/python-3.14.4-macos11.pkg" },
@@ -200,9 +183,7 @@ python_configurations = [
{ identifier = "cp312-win32", version = "3.12.10" },
{ identifier = "cp312-win_amd64", version = "3.12.10" },
{ identifier = "cp313-win32", version = "3.13.13" },
- { identifier = "cp313t-win32", version = "3.13.13" },
{ identifier = "cp313-win_amd64", version = "3.13.13" },
- { identifier = "cp313t-win_amd64", version = "3.13.13" },
{ identifier = "cp314-win32", version = "3.14.4" },
{ identifier = "cp314t-win32", version = "3.14.4" },
{ identifier = "cp314-win_amd64", version = "3.14.4" },
@@ -212,7 +193,6 @@ python_configurations = [
{ identifier = "cp311-win_arm64", version = "3.11.9" },
{ identifier = "cp312-win_arm64", version = "3.12.10" },
{ identifier = "cp313-win_arm64", version = "3.13.13" },
- { identifier = "cp313t-win_arm64", version = "3.13.13" },
{ identifier = "cp314-win_arm64", version = "3.14.4" },
{ identifier = "cp314t-win_arm64", version = "3.14.4" },
{ identifier = "pp38-win_amd64", version = "3.8", url = "https://downloads.python.org/pypy/pypy3.8-v7.3.11-win64.zip" },
diff --git a/cibuildwheel/resources/cibuildwheel.schema.json b/cibuildwheel/resources/cibuildwheel.schema.json
index a82518f4b..c5cefc828 100644
--- a/cibuildwheel/resources/cibuildwheel.schema.json
+++ b/cibuildwheel/resources/cibuildwheel.schema.json
@@ -13,7 +13,6 @@
},
"enable": {
"enum": [
- "cpython-freethreading",
"cpython-prerelease",
"graalpy",
"pyodide-prerelease",
diff --git a/cibuildwheel/resources/free-threaded-enable-313.xml b/cibuildwheel/resources/free-threaded-enable-313.xml
deleted file mode 100644
index 0c1c6c78c..000000000
--- a/cibuildwheel/resources/free-threaded-enable-313.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-
-
-
-
-
- attributeSetting
- 1
- choiceAttribute
- selected
- choiceIdentifier
- org.python.Python.PythonTFramework-3.13
-
-
-
diff --git a/cibuildwheel/selector.py b/cibuildwheel/selector.py
index 8b390e986..5efe28a19 100644
--- a/cibuildwheel/selector.py
+++ b/cibuildwheel/selector.py
@@ -29,7 +29,6 @@ class EnableGroup(StrEnum):
Groups of build selectors that are not enabled by default.
"""
- CPythonFreeThreading = "cpython-freethreading"
CPythonPrerelease = "cpython-prerelease"
GraalPy = "graalpy"
PyPy = "pypy"
@@ -38,7 +37,7 @@ class EnableGroup(StrEnum):
@classmethod
def all_groups(cls) -> frozenset[Self]:
- return frozenset(set(cls) - {cls.CPythonFreeThreading})
+ return frozenset(cls)
@classmethod
def parse_option_value(cls, value: str) -> frozenset[Self]:
@@ -84,8 +83,6 @@ def __call__(self, build_id: str) -> bool:
return False
# filter out groups that are not enabled
- if EnableGroup.CPythonFreeThreading not in self.enable and fnmatch(build_id, "cp313t-*"):
- return False
if EnableGroup.CPythonPrerelease not in self.enable and fnmatch(build_id, "cp315*"):
return False
is_pypy_eol = fnmatch(build_id, "pp3?-*") or fnmatch(build_id, "pp310-*")
diff --git a/cibuildwheel/util/resources.py b/cibuildwheel/util/resources.py
index c69fd949b..d06fc058d 100644
--- a/cibuildwheel/util/resources.py
+++ b/cibuildwheel/util/resources.py
@@ -7,7 +7,6 @@
PATH: Final[Path] = Path(__file__).parent.parent / "resources"
INSTALL_CERTIFI_SCRIPT: Final[Path] = PATH / "install_certifi.py"
-FREE_THREAD_ENABLE_313: Final[Path] = PATH / "free-threaded-enable-313.xml"
FREE_THREAD_ENABLE_314: Final[Path] = PATH / "free-threaded-enable-314.xml"
NODEJS: Final[Path] = PATH / "nodejs.toml"
DEFAULTS: Final[Path] = PATH / "defaults.toml"
diff --git a/docs/contributing.md b/docs/contributing.md
index 31c879a79..03b5e67e8 100644
--- a/docs/contributing.md
+++ b/docs/contributing.md
@@ -82,7 +82,7 @@ A few notes-
- Running the macOS integration tests requires _system installs_ of Python from python.org for all the versions that are tested. We won't attempt to install these when running locally, but you can do so manually using the URL in the error message that is printed when the install is not found.
-- The ['enable groups'](options.md#enable) run by default are just 'cpython-prerelease' and 'cpython-freethreading'. You can add other groups like pypy or graalpy by passing the `--enable` argument to pytest, i.e. `nox -s tests -- test --enable pypy`. On GitHub PRs, you can add a label to the PR to enable these groups.
+- The ['enable groups'](options.md#enable) run by default is just 'cpython-prerelease'. You can add other groups like pypy or graalpy by passing the `--enable` argument to pytest, i.e. `nox -s tests -- test --enable pypy`. On GitHub PRs, you can add a label to the PR to enable these groups.
#### Running pytest directly
diff --git a/docs/options.md b/docs/options.md
index fd84d83c0..e14359c78 100644
--- a/docs/options.md
+++ b/docs/options.md
@@ -59,7 +59,7 @@ When setting the options, you can use shell-style globbing syntax, as per [fnmat
| Python 3.10 | cp310-macosx_x86_64
cp310-macosx_universal2
cp310-macosx_arm64 | cp310-win_amd64
cp310-win32
cp310-win_arm64 | cp310-manylinux_x86_64
cp310-manylinux_i686
cp310-musllinux_x86_64
cp310-musllinux_i686 | cp310-manylinux_aarch64
cp310-manylinux_ppc64le
cp310-manylinux_s390x
cp310-manylinux_armv7l
cp310-manylinux_riscv64
cp310-musllinux_aarch64
cp310-musllinux_ppc64le
cp310-musllinux_s390x
cp310-musllinux_armv7l
cp310-musllinux_riscv64 | | | |
| Python 3.11 | cp311-macosx_x86_64
cp311-macosx_universal2
cp311-macosx_arm64 | cp311-win_amd64
cp311-win32
cp311-win_arm64 | cp311-manylinux_x86_64
cp311-manylinux_i686
cp311-musllinux_x86_64
cp311-musllinux_i686 | cp311-manylinux_aarch64
cp311-manylinux_ppc64le
cp311-manylinux_s390x
cp311-manylinux_armv7l
cp311-manylinux_riscv64
cp311-musllinux_aarch64
cp311-musllinux_ppc64le
cp311-musllinux_s390x
cp311-musllinux_armv7l
cp311-musllinux_riscv64 | | | |
| Python 3.12 | cp312-macosx_x86_64
cp312-macosx_universal2
cp312-macosx_arm64 | cp312-win_amd64
cp312-win32
cp312-win_arm64 | cp312-manylinux_x86_64
cp312-manylinux_i686
cp312-musllinux_x86_64
cp312-musllinux_i686 | cp312-manylinux_aarch64
cp312-manylinux_ppc64le
cp312-manylinux_s390x
cp312-manylinux_armv7l
cp312-manylinux_riscv64
cp312-musllinux_aarch64
cp312-musllinux_ppc64le
cp312-musllinux_s390x
cp312-musllinux_armv7l
cp312-musllinux_riscv64 | | | cp312-pyodide_wasm32 |
-| Python 3.13 | cp313-macosx_x86_64
cp313-macosx_universal2
cp313-macosx_arm64
cp313t-macosx_x86_64
cp313t-macosx_universal2
cp313t-macosx_arm64 | cp313-win_amd64
cp313-win32
cp313-win_arm64
cp313t-win_amd64
cp313t-win32
cp313t-win_arm64 | cp313-manylinux_x86_64
cp313-manylinux_i686
cp313-musllinux_x86_64
cp313-musllinux_i686
cp313t-manylinux_x86_64
cp313t-manylinux_i686
cp313t-musllinux_x86_64
cp313t-musllinux_i686 | cp313-manylinux_aarch64
cp313-manylinux_ppc64le
cp313-manylinux_s390x
cp313-manylinux_armv7l
cp313-manylinux_riscv64
cp313-musllinux_aarch64
cp313-musllinux_ppc64le
cp313-musllinux_s390x
cp313-musllinux_armv7l
cp313-musllinux_riscv64
cp313t-manylinux_aarch64
cp313t-manylinux_ppc64le
cp313t-manylinux_s390x
cp313t-manylinux_armv7l
cp313t-manylinux_riscv64
cp313t-musllinux_aarch64
cp313t-musllinux_ppc64le
cp313t-musllinux_s390x
cp313t-musllinux_armv7l
cp313t-musllinux_riscv64 | cp313-android_arm64_v8a
cp313-android_x86_64 | cp313-ios_arm64_iphoneos
cp313-ios_arm64_iphonesimulator
cp313-ios_x86_64_iphonesimulator | cp313-pyodide_wasm32 |
+| Python 3.13 | cp313-macosx_x86_64
cp313-macosx_universal2
cp313-macosx_arm64 | cp313-win_amd64
cp313-win32
cp313-win_arm64 | cp313-manylinux_x86_64
cp313-manylinux_i686
cp313-musllinux_x86_64
cp313-musllinux_i686 | cp313-manylinux_aarch64
cp313-manylinux_ppc64le
cp313-manylinux_s390x
cp313-manylinux_armv7l
cp313-manylinux_riscv64
cp313-musllinux_aarch64
cp313-musllinux_ppc64le
cp313-musllinux_s390x
cp313-musllinux_armv7l
cp313-musllinux_riscv64 | cp313-android_arm64_v8a
cp313-android_x86_64 | cp313-ios_arm64_iphoneos
cp313-ios_arm64_iphonesimulator
cp313-ios_x86_64_iphonesimulator | cp313-pyodide_wasm32 |
| Python 3.14 | cp314-macosx_x86_64
cp314-macosx_universal2
cp314-macosx_arm64
cp314t-macosx_x86_64
cp314t-macosx_universal2
cp314t-macosx_arm64 | cp314-win_amd64
cp314-win32
cp314-win_arm64
cp314t-win_amd64
cp314t-win32
cp314t-win_arm64 | cp314-manylinux_x86_64
cp314-manylinux_i686
cp314-musllinux_x86_64
cp314-musllinux_i686
cp314t-manylinux_x86_64
cp314t-manylinux_i686
cp314t-musllinux_x86_64
cp314t-musllinux_i686 | cp314-manylinux_aarch64
cp314-manylinux_ppc64le
cp314-manylinux_s390x
cp314-manylinux_armv7l
cp314-manylinux_riscv64
cp314-musllinux_aarch64
cp314-musllinux_ppc64le
cp314-musllinux_s390x
cp314-musllinux_armv7l
cp314-musllinux_riscv64
cp314t-manylinux_aarch64
cp314t-manylinux_ppc64le
cp314t-manylinux_s390x
cp314t-manylinux_armv7l
cp314t-manylinux_riscv64
cp314t-musllinux_aarch64
cp314t-musllinux_ppc64le
cp314t-musllinux_s390x
cp314t-musllinux_armv7l
cp314t-musllinux_riscv64 | cp314-android_arm64_v8a
cp314-android_x86_64 | cp314-ios_arm64_iphoneos
cp314-ios_arm64_iphonesimulator
cp314-ios_x86_64_iphonesimulator | |
| PyPy3.8 v7.3 | pp38-macosx_x86_64
pp38-macosx_arm64 | pp38-win_amd64 | pp38-manylinux_x86_64
pp38-manylinux_i686 | pp38-manylinux_aarch64 | | | |
| PyPy3.9 v7.3 | pp39-macosx_x86_64
pp39-macosx_arm64 | pp39-win_amd64 | pp39-manylinux_x86_64
pp39-manylinux_i686 | pp39-manylinux_aarch64 | | | |
@@ -355,9 +355,6 @@ values are:
- `cpython-prerelease`: Enables beta versions of Pythons if any are available
(May-July, approximately).
-- `cpython-freethreading`: Enable experimental free-threaded builds for CPython 3.13.
- Free-threading wheels for 3.14+ are available without this flag, as it's [no
- longer considered experimental](https://peps.python.org/pep-0779/).
- `pypy`: Enable PyPy.
- `pypy-eol`: Enable PyPy versions that have passed end of life (if still available).
- `graalpy`: Enable GraalPy.
@@ -379,9 +376,7 @@ values are:
CPython that can be built without the Global Interpreter Lock (GIL). Those
variants are also known as free-threaded / no-gil. The build identifiers for
those variants have a `t` suffix in their `python_tag` (e.g.
- `cp313t-manylinux_x86_64`).
-
- Free threading was [experimental in 3.13](https://docs.python.org/3.13/whatsnew/3.13.html#free-threaded-cpython), so it required an explicit enable flag. But, as noted above, free-threading doesn't require an enable flag for 3.14+.
+ `cp314t-manylinux_x86_64`).
For more info on building for free-threading, see the [Python Free-Threading Guide](https://py-free-threading.github.io/).
@@ -407,9 +402,6 @@ without disabling your other enables.
```toml
[tool.cibuildwheel]
- # Enable free-threaded support for CPython 3.13
- enable = ["cpython-freethreading"]
-
# Include all PyPy versions
enable = ["pypy", "pypy-eol"]
```
@@ -421,14 +413,11 @@ without disabling your other enables.
# Include latest Python beta
CIBW_ENABLE: cpython-prerelease
- # Include free-threaded support for CPython 3.13
- CIBW_ENABLE: cpython-freethreading
-
- # Include both
- CIBW_ENABLE: cpython-prerelease cpython-freethreading
-
# Include all PyPy versions
CIBW_ENABLE: pypy pypy-eol
+
+ # Include both
+ CIBW_ENABLE: cpython-prerelease pypy pypy-eol
```
diff --git a/test/test_0_basic.py b/test/test_0_basic.py
index 6c805b1bb..ec9b6f166 100644
--- a/test/test_0_basic.py
+++ b/test/test_0_basic.py
@@ -70,9 +70,7 @@ def test_sample_build(tmp_path: Path, capfd: pytest.CaptureFixture[str]) -> None
logger.step_end()
-@pytest.mark.parametrize(
- "enable_setting", ["", "cpython-prerelease", "pypy", "cpython-freethreading"]
-)
+@pytest.mark.parametrize("enable_setting", ["", "cpython-prerelease", "pypy"])
def test_build_identifiers(
tmp_path: Path, enable_setting: str, monkeypatch: pytest.MonkeyPatch
) -> None:
diff --git a/test/utils.py b/test/utils.py
index 7bf3d184f..4c25ded04 100644
--- a/test/utils.py
+++ b/test/utils.py
@@ -54,7 +54,7 @@ def get_platform() -> str:
raise Exception(msg)
-DEFAULT_CIBW_ENABLE = "cpython-freethreading cpython-prerelease"
+DEFAULT_CIBW_ENABLE = "cpython-prerelease"
def get_enable_groups() -> frozenset[EnableGroup]:
@@ -291,8 +291,6 @@ def _expected_wheels(
]
enable_groups = get_enable_groups()
- if EnableGroup.CPythonFreeThreading in enable_groups:
- python_abi_tags.append("cp313-cp313t")
if EnableGroup.CPythonPrerelease in enable_groups:
... # Add cp315 here when available
diff --git a/unit_test/build_selector_test.py b/unit_test/build_selector_test.py
index 71a6fcd6c..32c0fb0a6 100644
--- a/unit_test/build_selector_test.py
+++ b/unit_test/build_selector_test.py
@@ -52,7 +52,7 @@ def test_build_filter_pre() -> None:
assert build_selector("cp313-manylinux_x86_64")
assert build_selector("cp37-win_amd64")
assert build_selector("cp313-win_amd64")
- assert not build_selector("cp313t-manylinux_x86_64")
+ assert build_selector("cp314t-manylinux_x86_64")
def test_build_filter_pypy() -> None:
@@ -210,12 +210,6 @@ def test_build_limited_python_patch() -> None:
assert build_selector("cp37-manylinux_x86_64")
-def test_build_free_threaded_python() -> None:
- build_selector = BuildSelector(build_config="*", skip_config="", enable=frozenset(EnableGroup))
-
- assert build_selector("cp313t-manylinux_x86_64")
-
-
def test_testing_selector() -> None:
# This is not a global import to keep pytest from collecting it as a test
test_selector = cibuildwheel.selector.TestSelector(skip_config="cp36-*")
diff --git a/unit_test/main_tests/main_options_test.py b/unit_test/main_tests/main_options_test.py
index 8e3794d6b..7f2706fbc 100644
--- a/unit_test/main_tests/main_options_test.py
+++ b/unit_test/main_tests/main_options_test.py
@@ -1,4 +1,3 @@
-import os
import sys
import tomllib
from collections.abc import Mapping
@@ -168,78 +167,6 @@ def test_empty_selector(monkeypatch: pytest.MonkeyPatch) -> None:
assert e.value.code == 3
-@pytest.mark.usefixtures("platform", "intercepted_build_args")
-def test_cp313t_warning1(
- monkeypatch: pytest.MonkeyPatch, capsys: pytest.CaptureFixture[str]
-) -> None:
- monkeypatch.setenv("CIBW_ENABLE", "cpython-freethreading")
-
- main()
-
- _, err = capsys.readouterr()
- print(err)
- assert "'cpython-freethreading' enable is deprecated" in err
-
-
-@pytest.mark.usefixtures("platform", "intercepted_build_args")
-def test_cp313t_warning2(
- monkeypatch: pytest.MonkeyPatch, capsys: pytest.CaptureFixture[str], tmp_path: Path
-) -> None:
- local_path = tmp_path / "tmp_project"
- os.mkdir(local_path) # noqa:PTH102 Path.mkdir has been monkeypatched already
- local_path.joinpath("setup.py").touch()
-
- monkeypatch.setattr(
- sys, "argv", ["cibuildwheel", "--only", "cp313t-manylinux_x86_64", str(local_path)]
- )
- monkeypatch.setenv("CIBW_ENABLE", "cpython-freethreading")
-
- main()
-
- _, err = capsys.readouterr()
- print(err)
- assert "'cpython-freethreading' enable is deprecated" in err
-
-
-@pytest.mark.usefixtures("platform", "intercepted_build_args")
-def test_cp313t_warning3(
- monkeypatch: pytest.MonkeyPatch, capsys: pytest.CaptureFixture[str], tmp_path: Path
-) -> None:
- local_path = tmp_path / "tmp_project"
- os.mkdir(local_path) # noqa:PTH102 Path.mkdir has been monkeypatched already
- local_path.joinpath("setup.py").touch()
-
- monkeypatch.setattr(
- sys, "argv", ["cibuildwheel", "--only", "cp313t-manylinux_x86_64", str(local_path)]
- )
-
- main()
-
- _, err = capsys.readouterr()
- print(err)
- assert "'cpython-freethreading' enable is deprecated" in err
-
-
-@pytest.mark.usefixtures("platform", "intercepted_build_args")
-def test_cp313t_warning4(
- monkeypatch: pytest.MonkeyPatch, capsys: pytest.CaptureFixture[str], tmp_path: Path
-) -> None:
- local_path = tmp_path / "tmp_project"
- os.mkdir(local_path) # noqa:PTH102 Path.mkdir has been monkeypatched already
- local_path.joinpath("setup.py").touch()
-
- monkeypatch.setattr(
- sys, "argv", ["cibuildwheel", "--only", "cp313t-manylinux_x86_64", str(local_path)]
- )
- monkeypatch.setenv("CIBW_ENABLE", "all")
-
- main()
-
- _, err = capsys.readouterr()
- print(err)
- assert "'cpython-freethreading' enable is deprecated" in err
-
-
@pytest.mark.parametrize(
("architecture", "image", "full_image"),
[
@@ -514,6 +441,7 @@ def test_config_settings(
"?p27*",
"?p2*",
"?p35*",
+ "cp313t*",
],
)
@pytest.mark.usefixtures("platform", "intercepted_build_args", "allow_empty")
@@ -532,8 +460,11 @@ def test_build_selector_deprecated_error(
main()
stderr = capsys.readouterr().err
- series = "2" if "6" in pattern else "1"
- msg = f"cibuildwheel 3.x no longer supports Python < 3.8. Please use the {series}.x series or update"
+ if pattern == "cp313t*":
+ msg = "cibuildwheel 4.x no longer supports Python 3.13 free-threading. Please use the 3.x series or update"
+ else:
+ series = "2" if "6" in pattern else "1"
+ msg = f"cibuildwheel 3.x no longer supports Python < 3.8. Please use the {series}.x series or update"
assert msg in stderr
diff --git a/unit_test/option_prepare_test.py b/unit_test/option_prepare_test.py
index 43fecd3a6..0c23edf9e 100644
--- a/unit_test/option_prepare_test.py
+++ b/unit_test/option_prepare_test.py
@@ -14,7 +14,7 @@
from cibuildwheel.util import file
DEFAULT_IDS = {"cp38", "cp39", "cp310", "cp311", "cp312", "cp313", "cp314", "cp314t"}
-ALL_IDS = DEFAULT_IDS | {"cp313t", "pp38", "pp39", "pp310", "pp311", "gp311_242", "gp312_250"}
+ALL_IDS = DEFAULT_IDS | {"pp38", "pp39", "pp310", "pp311", "gp311_242", "gp312_250"}
@pytest.fixture
@@ -105,7 +105,7 @@ def test_build_with_override_launches(monkeypatch: pytest.MonkeyPatch, tmp_path:
[tool.cibuildwheel]
manylinux-x86_64-image = "manylinux_2_28"
musllinux-x86_64-image = "musllinux_1_2"
-enable = ["pypy", "pypy-eol", "graalpy", "cpython-freethreading"]
+enable = ["pypy", "pypy-eol", "graalpy"]
archs = ["auto64", "auto32"]
# Before Python 3.10, use manylinux2014
@@ -154,7 +154,6 @@ def test_build_with_override_launches(monkeypatch: pytest.MonkeyPatch, tmp_path:
"cp311",
"cp312",
"cp313",
- "cp313t",
"cp314",
"cp314t",
"pp38",
@@ -179,7 +178,6 @@ def test_build_with_override_launches(monkeypatch: pytest.MonkeyPatch, tmp_path:
"cp311",
"cp312",
"cp313",
- "cp313t",
"cp314",
"cp314t",
"pp38",
diff --git a/unit_test/options_test.py b/unit_test/options_test.py
index 0c42b1f9a..e6e225e49 100644
--- a/unit_test/options_test.py
+++ b/unit_test/options_test.py
@@ -18,7 +18,6 @@
_get_pinned_container_images,
)
from cibuildwheel.platforms import ALL_PLATFORM_MODULES, get_build_identifiers
-from cibuildwheel.selector import EnableGroup
from cibuildwheel.util import resources
from cibuildwheel.util.packaging import DependencyConstraints
@@ -446,50 +445,6 @@ def test_override_inherit_environment_with_references(tmp_path: Path) -> None:
}
-@pytest.mark.parametrize(
- ("toml_assignment", "env", "enable_args", "expected_result"),
- [
- ("", {}, [], False),
- ("enable = ['cpython-freethreading']", {}, [], True),
- ("enable = []", {}, [], False),
- ("", {}, ["cpython-freethreading"], True),
- ("", {}, ["cpython-freethreading", "pypy"], True),
- ("", {"CIBW_ENABLE": "pypy"}, [], False),
- ("", {"CIBW_ENABLE": "cpython-freethreading"}, [], True),
- ("enable = []", {"CIBW_ENABLE": "cpython-freethreading"}, [], True),
- ("enable = ['cpython-freethreading']", {"CIBW_ENABLE": "pypy"}, [], True),
- ("enable = ['cpython-freethreading']", {}, ["pypy"], True),
- ("enable = ['cpython-freethreading']", {"CIBW_ENABLE": ""}, [], True),
- ("enable = []", {"CIBW_ENABLE": ""}, [], False),
- ],
-)
-def test_free_threaded_support(
- tmp_path: Path,
- toml_assignment: str,
- env: dict[str, str],
- enable_args: list[str],
- expected_result: bool,
-) -> None:
- args = CommandLineArguments.defaults()
- args.package_dir = tmp_path
- args.enable = enable_args
-
- pyproject_toml: Path = tmp_path / "pyproject.toml"
- pyproject_toml.write_text(
- textwrap.dedent(
- f"""\
- [tool.cibuildwheel]
- {toml_assignment}
- """
- )
- )
- options = Options(platform="linux", command_line_arguments=args, env=env)
- if expected_result:
- assert EnableGroup.CPythonFreeThreading in options.globals.build_selector.enable
- else:
- assert EnableGroup.CPythonFreeThreading not in options.globals.build_selector.enable
-
-
@pytest.mark.parametrize(
("toml_assignment", "base_file_path", "packages"),
[