diff --git a/README.md b/README.md index 96d7cad34..62e0f8e5c 100644 --- a/README.md +++ b/README.md @@ -26,15 +26,12 @@ While cibuildwheel itself requires a recent Python version to run (we support th | | 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 | Pyodide | |----------------|----|-----|-----|-----|-----|----|-----|----|-----|-----|---|-----| -| CPython 3.6 | ✅ | N/A | ✅ | ✅ | N/A | ✅ | ✅ | ✅ | ✅ | ✅ | ✅⁵ | N/A | -| CPython 3.7 | ✅ | N/A | ✅ | ✅ | N/A | ✅ | ✅ | ✅ | ✅ | ✅ | ✅⁵ | N/A | | CPython 3.8 | ✅ | ✅ | ✅ | ✅ | N/A | ✅ | ✅ | ✅ | ✅ | ✅ | ✅⁵ | N/A | | CPython 3.9 | ✅ | ✅ | ✅ | ✅ | ✅² | ✅ | ✅ | ✅ | ✅ | ✅ | ✅⁵ | N/A | | CPython 3.10 | ✅ | ✅ | ✅ | ✅ | ✅² | ✅ | ✅ | ✅ | ✅ | ✅ | ✅⁵ | N/A | | CPython 3.11 | ✅ | ✅ | ✅ | ✅ | ✅² | ✅ | ✅ | ✅ | ✅ | ✅ | ✅⁵ | N/A | | CPython 3.12 | ✅ | ✅ | ✅ | ✅ | ✅² | ✅ | ✅ | ✅ | ✅ | ✅ | ✅⁵ | ✅⁴ | | CPython 3.13³ | ✅ | ✅ | ✅ | ✅ | ✅² | ✅ | ✅ | ✅ | ✅ | ✅ | ✅⁵ | N/A | -| PyPy 3.7 v7.3 | ✅ | N/A | ✅ | N/A | N/A | ✅¹ | ✅¹ | ✅¹ | N/A | N/A | N/A | N/A | | PyPy 3.8 v7.3 | ✅ | ✅ | ✅ | N/A | N/A | ✅¹ | ✅¹ | ✅¹ | N/A | N/A | N/A | N/A | | PyPy 3.9 v7.3 | ✅ | ✅ | ✅ | N/A | N/A | ✅¹ | ✅¹ | ✅¹ | N/A | N/A | N/A | N/A | | PyPy 3.10 v7.3 | ✅ | ✅ | ✅ | N/A | N/A | ✅¹ | ✅¹ | ✅¹ | N/A | N/A | N/A | N/A | diff --git a/cibuildwheel/linux.py b/cibuildwheel/linux.py index c9a3fc2a9..88fd4ba73 100644 --- a/cibuildwheel/linux.py +++ b/cibuildwheel/linux.py @@ -203,7 +203,7 @@ def build_in_container( log.build_start(config.identifier) build_options = options.build_options(config.identifier) build_frontend = build_options.build_frontend or BuildFrontendConfig("pip") - use_uv = build_frontend.name == "build[uv]" and Version(config.version) >= Version("3.8") + use_uv = build_frontend.name == "build[uv]" pip = ["uv", "pip"] if use_uv else ["pip"] dependency_constraint_flags: list[PathOrStr] = [] diff --git a/cibuildwheel/macos.py b/cibuildwheel/macos.py index e81e2fbc4..e73471157 100644 --- a/cibuildwheel/macos.py +++ b/cibuildwheel/macos.py @@ -191,11 +191,6 @@ def install_pypy(tmp: Path, url: str) -> Path: return installation_path / "bin" / "pypy3" -def can_use_uv(python_configuration: PythonConfiguration) -> bool: - conditions = (Version(python_configuration.version) >= Version("3.8"),) - return all(conditions) - - def setup_python( tmp: Path, python_configuration: PythonConfiguration, @@ -203,9 +198,6 @@ def setup_python( environment: ParsedEnvironment, build_frontend: BuildFrontendName, ) -> tuple[Path, dict[str, str]]: - if build_frontend == "build[uv]" and not can_use_uv(python_configuration): - build_frontend = "build" - uv_path = find_uv() use_uv = build_frontend == "build[uv]" @@ -315,20 +307,19 @@ def setup_python( ) env["MACOSX_DEPLOYMENT_TARGET"] = default_target - if python_configuration.version not in {"3.6", "3.7"}: - if config_is_arm64: - # macOS 11 is the first OS with arm64 support, so the wheels - # have that as a minimum. - env.setdefault("_PYTHON_HOST_PLATFORM", "macosx-11.0-arm64") - env.setdefault("ARCHFLAGS", "-arch arm64") - elif config_is_universal2: - env.setdefault("_PYTHON_HOST_PLATFORM", "macosx-10.9-universal2") - env.setdefault("ARCHFLAGS", "-arch arm64 -arch x86_64") - elif python_configuration.identifier.endswith("x86_64"): - # even on the macos11.0 Python installer, on the x86_64 side it's - # compatible back to 10.9. - env.setdefault("_PYTHON_HOST_PLATFORM", "macosx-10.9-x86_64") - env.setdefault("ARCHFLAGS", "-arch x86_64") + if config_is_arm64: + # macOS 11 is the first OS with arm64 support, so the wheels + # have that as a minimum. + env.setdefault("_PYTHON_HOST_PLATFORM", "macosx-11.0-arm64") + env.setdefault("ARCHFLAGS", "-arch arm64") + elif config_is_universal2: + env.setdefault("_PYTHON_HOST_PLATFORM", "macosx-10.9-universal2") + env.setdefault("ARCHFLAGS", "-arch arm64 -arch x86_64") + elif python_configuration.identifier.endswith("x86_64"): + # even on the macos11.0 Python installer, on the x86_64 side it's + # compatible back to 10.9. + env.setdefault("_PYTHON_HOST_PLATFORM", "macosx-10.9-x86_64") + env.setdefault("ARCHFLAGS", "-arch x86_64") building_arm64 = config_is_arm64 or config_is_universal2 if building_arm64 and get_macos_version() < (10, 16) and "SDKROOT" not in env: @@ -416,7 +407,7 @@ def build(options: Options, tmp_path: Path) -> None: for config in python_configurations: build_options = options.build_options(config.identifier) build_frontend = build_options.build_frontend or BuildFrontendConfig("pip") - use_uv = build_frontend.name == "build[uv]" and can_use_uv(config) + use_uv = build_frontend.name == "build[uv]" uv_path = find_uv() if use_uv and uv_path is None: msg = "uv not found" diff --git a/cibuildwheel/options.py b/cibuildwheel/options.py index 6c9766803..8b545466f 100644 --- a/cibuildwheel/options.py +++ b/cibuildwheel/options.py @@ -980,7 +980,12 @@ def _get_pinned_container_images() -> Mapping[str, Mapping[str, str]]: def deprecated_selectors(name: str, selector: str, *, error: bool = False) -> None: if "p2" in selector or "p35" in selector: - msg = f"cibuildwheel 2.x no longer supports Python < 3.6. Please use the 1.x series or update {name}" + msg = f"cibuildwheel 3.x no longer supports Python < 3.8. Please use the 1.x series or update {name}" + if error: + raise errors.DeprecationError(msg) + log.warning(msg) + 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 {name}" if error: raise errors.DeprecationError(msg) log.warning(msg) diff --git a/cibuildwheel/resources/build-platforms.toml b/cibuildwheel/resources/build-platforms.toml index b2a83445c..504486f7e 100644 --- a/cibuildwheel/resources/build-platforms.toml +++ b/cibuildwheel/resources/build-platforms.toml @@ -1,7 +1,5 @@ [linux] python_configurations = [ - { identifier = "cp36-manylinux_x86_64", version = "3.6", path_str = "/opt/python/cp36-cp36m" }, - { identifier = "cp37-manylinux_x86_64", version = "3.7", path_str = "/opt/python/cp37-cp37m" }, { identifier = "cp38-manylinux_x86_64", version = "3.8", path_str = "/opt/python/cp38-cp38" }, { identifier = "cp39-manylinux_x86_64", version = "3.9", path_str = "/opt/python/cp39-cp39" }, { identifier = "cp310-manylinux_x86_64", version = "3.10", path_str = "/opt/python/cp310-cp310" }, @@ -9,8 +7,6 @@ python_configurations = [ { 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 = "cp36-manylinux_i686", version = "3.6", path_str = "/opt/python/cp36-cp36m" }, - { identifier = "cp37-manylinux_i686", version = "3.7", path_str = "/opt/python/cp37-cp37m" }, { identifier = "cp38-manylinux_i686", version = "3.8", path_str = "/opt/python/cp38-cp38" }, { identifier = "cp39-manylinux_i686", version = "3.9", path_str = "/opt/python/cp39-cp39" }, { identifier = "cp310-manylinux_i686", version = "3.10", path_str = "/opt/python/cp310-cp310" }, @@ -18,13 +14,10 @@ python_configurations = [ { 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 = "pp37-manylinux_x86_64", version = "3.7", path_str = "/opt/python/pp37-pypy37_pp73" }, { identifier = "pp38-manylinux_x86_64", version = "3.8", path_str = "/opt/python/pp38-pypy38_pp73" }, { identifier = "pp39-manylinux_x86_64", version = "3.9", path_str = "/opt/python/pp39-pypy39_pp73" }, { identifier = "pp310-manylinux_x86_64", version = "3.10", path_str = "/opt/python/pp310-pypy310_pp73" }, { identifier = "pp311-manylinux_x86_64", version = "3.11", path_str = "/opt/python/pp311-pypy311_pp73" }, - { identifier = "cp36-manylinux_aarch64", version = "3.6", path_str = "/opt/python/cp36-cp36m" }, - { identifier = "cp37-manylinux_aarch64", version = "3.7", path_str = "/opt/python/cp37-cp37m" }, { identifier = "cp38-manylinux_aarch64", version = "3.8", path_str = "/opt/python/cp38-cp38" }, { identifier = "cp39-manylinux_aarch64", version = "3.9", path_str = "/opt/python/cp39-cp39" }, { identifier = "cp310-manylinux_aarch64", version = "3.10", path_str = "/opt/python/cp310-cp310" }, @@ -32,8 +25,6 @@ python_configurations = [ { 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 = "cp36-manylinux_ppc64le", version = "3.6", path_str = "/opt/python/cp36-cp36m" }, - { identifier = "cp37-manylinux_ppc64le", version = "3.7", path_str = "/opt/python/cp37-cp37m" }, { identifier = "cp38-manylinux_ppc64le", version = "3.8", path_str = "/opt/python/cp38-cp38" }, { identifier = "cp39-manylinux_ppc64le", version = "3.9", path_str = "/opt/python/cp39-cp39" }, { identifier = "cp310-manylinux_ppc64le", version = "3.10", path_str = "/opt/python/cp310-cp310" }, @@ -41,8 +32,6 @@ python_configurations = [ { 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 = "cp36-manylinux_s390x", version = "3.6", path_str = "/opt/python/cp36-cp36m" }, - { identifier = "cp37-manylinux_s390x", version = "3.7", path_str = "/opt/python/cp37-cp37m" }, { identifier = "cp38-manylinux_s390x", version = "3.8", path_str = "/opt/python/cp38-cp38" }, { identifier = "cp39-manylinux_s390x", version = "3.9", path_str = "/opt/python/cp39-cp39" }, { identifier = "cp310-manylinux_s390x", version = "3.10", path_str = "/opt/python/cp310-cp310" }, @@ -50,8 +39,6 @@ python_configurations = [ { 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 = "cp36-manylinux_armv7l", version = "3.6", path_str = "/opt/python/cp36-cp36m" }, - { identifier = "cp37-manylinux_armv7l", version = "3.7", path_str = "/opt/python/cp37-cp37m" }, { identifier = "cp38-manylinux_armv7l", version = "3.8", path_str = "/opt/python/cp38-cp38" }, { identifier = "cp39-manylinux_armv7l", version = "3.9", path_str = "/opt/python/cp39-cp39" }, { identifier = "cp310-manylinux_armv7l", version = "3.10", path_str = "/opt/python/cp310-cp310" }, @@ -59,18 +46,14 @@ python_configurations = [ { 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 = "pp37-manylinux_aarch64", version = "3.7", path_str = "/opt/python/pp37-pypy37_pp73" }, { identifier = "pp38-manylinux_aarch64", version = "3.8", path_str = "/opt/python/pp38-pypy38_pp73" }, { identifier = "pp39-manylinux_aarch64", version = "3.9", path_str = "/opt/python/pp39-pypy39_pp73" }, { identifier = "pp310-manylinux_aarch64", version = "3.10", path_str = "/opt/python/pp310-pypy310_pp73" }, { identifier = "pp311-manylinux_aarch64", version = "3.11", path_str = "/opt/python/pp311-pypy311_pp73" }, - { identifier = "pp37-manylinux_i686", version = "3.7", path_str = "/opt/python/pp37-pypy37_pp73" }, { identifier = "pp38-manylinux_i686", version = "3.8", path_str = "/opt/python/pp38-pypy38_pp73" }, { identifier = "pp39-manylinux_i686", version = "3.9", path_str = "/opt/python/pp39-pypy39_pp73" }, { identifier = "pp310-manylinux_i686", version = "3.10", path_str = "/opt/python/pp310-pypy310_pp73" }, { identifier = "pp311-manylinux_i686", version = "3.11", path_str = "/opt/python/pp311-pypy311_pp73" }, - { identifier = "cp36-musllinux_x86_64", version = "3.6", path_str = "/opt/python/cp36-cp36m" }, - { identifier = "cp37-musllinux_x86_64", version = "3.7", path_str = "/opt/python/cp37-cp37m" }, { identifier = "cp38-musllinux_x86_64", version = "3.8", path_str = "/opt/python/cp38-cp38" }, { identifier = "cp39-musllinux_x86_64", version = "3.9", path_str = "/opt/python/cp39-cp39" }, { identifier = "cp310-musllinux_x86_64", version = "3.10", path_str = "/opt/python/cp310-cp310" }, @@ -78,8 +61,6 @@ python_configurations = [ { 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 = "cp36-musllinux_i686", version = "3.6", path_str = "/opt/python/cp36-cp36m" }, - { identifier = "cp37-musllinux_i686", version = "3.7", path_str = "/opt/python/cp37-cp37m" }, { identifier = "cp38-musllinux_i686", version = "3.8", path_str = "/opt/python/cp38-cp38" }, { identifier = "cp39-musllinux_i686", version = "3.9", path_str = "/opt/python/cp39-cp39" }, { identifier = "cp310-musllinux_i686", version = "3.10", path_str = "/opt/python/cp310-cp310" }, @@ -87,8 +68,6 @@ python_configurations = [ { 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 = "cp36-musllinux_aarch64", version = "3.6", path_str = "/opt/python/cp36-cp36m" }, - { identifier = "cp37-musllinux_aarch64", version = "3.7", path_str = "/opt/python/cp37-cp37m" }, { identifier = "cp38-musllinux_aarch64", version = "3.8", path_str = "/opt/python/cp38-cp38" }, { identifier = "cp39-musllinux_aarch64", version = "3.9", path_str = "/opt/python/cp39-cp39" }, { identifier = "cp310-musllinux_aarch64", version = "3.10", path_str = "/opt/python/cp310-cp310" }, @@ -96,8 +75,6 @@ python_configurations = [ { 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 = "cp36-musllinux_ppc64le", version = "3.6", path_str = "/opt/python/cp36-cp36m" }, - { identifier = "cp37-musllinux_ppc64le", version = "3.7", path_str = "/opt/python/cp37-cp37m" }, { identifier = "cp38-musllinux_ppc64le", version = "3.8", path_str = "/opt/python/cp38-cp38" }, { identifier = "cp39-musllinux_ppc64le", version = "3.9", path_str = "/opt/python/cp39-cp39" }, { identifier = "cp310-musllinux_ppc64le", version = "3.10", path_str = "/opt/python/cp310-cp310" }, @@ -105,8 +82,6 @@ python_configurations = [ { 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 = "cp36-musllinux_s390x", version = "3.6", path_str = "/opt/python/cp36-cp36m" }, - { identifier = "cp37-musllinux_s390x", version = "3.7", path_str = "/opt/python/cp37-cp37m" }, { identifier = "cp38-musllinux_s390x", version = "3.8", path_str = "/opt/python/cp38-cp38" }, { identifier = "cp39-musllinux_s390x", version = "3.9", path_str = "/opt/python/cp39-cp39" }, { identifier = "cp310-musllinux_s390x", version = "3.10", path_str = "/opt/python/cp310-cp310" }, @@ -114,8 +89,6 @@ python_configurations = [ { 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 = "cp36-musllinux_armv7l", version = "3.6", path_str = "/opt/python/cp36-cp36m" }, - { identifier = "cp37-musllinux_armv7l", version = "3.7", path_str = "/opt/python/cp37-cp37m" }, { identifier = "cp38-musllinux_armv7l", version = "3.8", path_str = "/opt/python/cp38-cp38" }, { identifier = "cp39-musllinux_armv7l", version = "3.9", path_str = "/opt/python/cp39-cp39" }, { identifier = "cp310-musllinux_armv7l", version = "3.10", path_str = "/opt/python/cp310-cp310" }, @@ -127,8 +100,6 @@ python_configurations = [ [macos] python_configurations = [ - { identifier = "cp36-macosx_x86_64", version = "3.6", url = "https://www.python.org/ftp/python/3.6.8/python-3.6.8-macosx10.9.pkg" }, - { identifier = "cp37-macosx_x86_64", version = "3.7", url = "https://www.python.org/ftp/python/3.7.9/python-3.7.9-macosx10.9.pkg" }, { identifier = "cp38-macosx_x86_64", version = "3.8", url = "https://www.python.org/ftp/python/3.8.10/python-3.8.10-macosx10.9.pkg" }, { identifier = "cp38-macosx_arm64", version = "3.8", url = "https://www.python.org/ftp/python/3.8.10/python-3.8.10-macosx10.9.pkg" }, { identifier = "cp38-macosx_universal2", version = "3.8", url = "https://www.python.org/ftp/python/3.8.10/python-3.8.10-macosx10.9.pkg" }, @@ -150,7 +121,6 @@ python_configurations = [ { identifier = "cp313t-macosx_x86_64", version = "3.13", url = "https://www.python.org/ftp/python/3.13.2/python-3.13.2-macos11.pkg" }, { identifier = "cp313t-macosx_arm64", version = "3.13", url = "https://www.python.org/ftp/python/3.13.2/python-3.13.2-macos11.pkg" }, { identifier = "cp313t-macosx_universal2", version = "3.13", url = "https://www.python.org/ftp/python/3.13.2/python-3.13.2-macos11.pkg" }, - { identifier = "pp37-macosx_x86_64", version = "3.7", url = "https://downloads.python.org/pypy/pypy3.7-v7.3.9-osx64.tar.bz2" }, { identifier = "pp38-macosx_x86_64", version = "3.8", url = "https://downloads.python.org/pypy/pypy3.8-v7.3.11-macos_x86_64.tar.bz2" }, { identifier = "pp38-macosx_arm64", version = "3.8", url = "https://downloads.python.org/pypy/pypy3.8-v7.3.11-macos_arm64.tar.bz2" }, { identifier = "pp39-macosx_x86_64", version = "3.9", url = "https://downloads.python.org/pypy/pypy3.9-v7.3.16-macos_x86_64.tar.bz2" }, @@ -163,10 +133,6 @@ python_configurations = [ [windows] python_configurations = [ - { identifier = "cp36-win32", version = "3.6.8", arch = "32" }, - { identifier = "cp36-win_amd64", version = "3.6.8", arch = "64" }, - { identifier = "cp37-win32", version = "3.7.9", arch = "32" }, - { identifier = "cp37-win_amd64", version = "3.7.9", arch = "64" }, { identifier = "cp38-win32", version = "3.8.10", arch = "32" }, { identifier = "cp38-win_amd64", version = "3.8.10", arch = "64" }, { identifier = "cp39-win32", version = "3.9.13", arch = "32" }, @@ -187,7 +153,6 @@ python_configurations = [ { identifier = "cp312-win_arm64", version = "3.12.9", arch = "ARM64" }, { identifier = "cp313-win_arm64", version = "3.13.2", arch = "ARM64" }, { identifier = "cp313t-win_arm64", version = "3.13.2", arch = "ARM64" }, - { identifier = "pp37-win_amd64", version = "3.7", arch = "64", url = "https://downloads.python.org/pypy/pypy3.7-v7.3.9-win64.zip" }, { identifier = "pp38-win_amd64", version = "3.8", arch = "64", url = "https://downloads.python.org/pypy/pypy3.8-v7.3.11-win64.zip" }, { identifier = "pp39-win_amd64", version = "3.9", arch = "64", url = "https://downloads.python.org/pypy/pypy3.9-v7.3.16-win64.zip" }, { identifier = "pp310-win_amd64", version = "3.10", arch = "64", url = "https://downloads.python.org/pypy/pypy3.10-v7.3.18-win64.zip" }, diff --git a/cibuildwheel/resources/constraints-python36.txt b/cibuildwheel/resources/constraints-python36.txt deleted file mode 100644 index 409e75c10..000000000 --- a/cibuildwheel/resources/constraints-python36.txt +++ /dev/null @@ -1,52 +0,0 @@ -# -# This file is autogenerated by pip-compile with python 3.6 -# To update, run: -# -# nox -s update_constraints-3.6 -# -build==0.9.0 - # via -r cibuildwheel/resources/constraints.in -delocate==0.10.2 - # via -r cibuildwheel/resources/constraints.in -distlib==0.3.8 - # via virtualenv -filelock==3.4.1 - # via virtualenv -importlib-metadata==4.8.3 - # via - # build - # pep517 - # virtualenv -importlib-resources==5.4.0 - # via virtualenv -packaging==21.3 - # via build -pep517==0.13.1 - # via build -platformdirs==2.4.0 - # via virtualenv -pyparsing==3.1.1 - # via packaging -tomli==1.2.3 - # via - # build - # pep517 -typing-extensions==4.1.1 - # via - # delocate - # importlib-metadata -virtualenv==20.17.1 - # via -r cibuildwheel/resources/constraints.in -wheel==0.37.1 - # via delocate -zipp==3.6.0 - # via - # importlib-metadata - # importlib-resources - # pep517 - -# The following packages are considered to be unsafe in a requirements file: -pip==21.3.1 - # via -r cibuildwheel/resources/constraints.in -setuptools==59.6.0 - # via -r cibuildwheel/resources/constraints.in diff --git a/cibuildwheel/resources/constraints-python37.txt b/cibuildwheel/resources/constraints-python37.txt deleted file mode 100644 index 55e33eec5..000000000 --- a/cibuildwheel/resources/constraints-python37.txt +++ /dev/null @@ -1,39 +0,0 @@ -# This file was autogenerated by uv via the following command: -# nox -s update_constraints -altgraph==0.17.4 - # via macholib -build==1.1.1 - # via -r cibuildwheel/resources/constraints.in -delocate==0.12.0 - # via -r cibuildwheel/resources/constraints.in -distlib==0.3.9 - # via virtualenv -filelock==3.12.2 - # via virtualenv -importlib-metadata==6.7.0 - # via - # build - # virtualenv -macholib==1.16.3 - # via delocate -packaging==24.0 - # via - # build - # delocate -pip==24.0 - # via -r cibuildwheel/resources/constraints.in -platformdirs==4.0.0 - # via virtualenv -pyproject-hooks==1.2.0 - # via build -tomli==2.0.1 - # via build -typing-extensions==4.7.1 - # via - # delocate - # importlib-metadata - # platformdirs -virtualenv==20.26.6 - # via -r cibuildwheel/resources/constraints.in -zipp==3.15.0 - # via importlib-metadata diff --git a/cibuildwheel/resources/virtualenv.toml b/cibuildwheel/resources/virtualenv.toml index cb13b37a9..962c0f45d 100644 --- a/cibuildwheel/resources/virtualenv.toml +++ b/cibuildwheel/resources/virtualenv.toml @@ -1,2 +1 @@ -py36 = { version = "20.21.1", url = "https://github.com/pypa/get-virtualenv/blob/20.21.1/public/virtualenv.pyz?raw=true" } default = { version = "20.29.1", url = "https://github.com/pypa/get-virtualenv/blob/20.29.1/public/virtualenv.pyz?raw=true" } diff --git a/cibuildwheel/windows.py b/cibuildwheel/windows.py index 233ad2ff8..e8f9c20ea 100644 --- a/cibuildwheel/windows.py +++ b/cibuildwheel/windows.py @@ -212,10 +212,7 @@ def setup_rust_cross_compile( def can_use_uv(python_configuration: PythonConfiguration) -> bool: - conditions = ( - Version(python_configuration.version) >= Version("3.8"), - not python_configuration.identifier.startswith("pp38-"), - ) + conditions = (not python_configuration.identifier.startswith("pp38-"),) return all(conditions) diff --git a/docs/options.md b/docs/options.md index 13b87e08c..d36091227 100644 --- a/docs/options.md +++ b/docs/options.md @@ -161,15 +161,15 @@ which means it can be given multiple times. manylinux-x86_64-image = "manylinux2014" [[tool.cibuildwheel.overrides]] -select = "cp36-*" +select = "cp38-*" manylinux-x86_64-image = "manylinux1" [[tool.cibuildwheel.overrides]] -select = "cp3{7,8,9}-*" +select = "cp3{9,10}-*" manylinux-x86_64-image = "manylinux2010" ``` -This example will build CPython 3.6 wheels on manylinux1, CPython 3.7-3.9 +This example will build CPython 3.8 wheels on manylinux1, CPython 3.9-3.10 wheels on manylinux2010, and manylinux2014 wheels for any newer Python (like 3.10). @@ -290,15 +290,12 @@ When setting the options, you can use shell-style globbing syntax, as per [fnmat | | macOS | Windows | Linux Intel | Linux Other | |---------------|------------------------------------------------------------------------|-----------------------------------------------------|-----------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| Python 3.6 | cp36-macosx_x86_64 | cp36-win_amd64
cp36-win32 | cp36-manylinux_x86_64
cp36-manylinux_i686
cp36-musllinux_x86_64
cp36-musllinux_i686 | cp36-manylinux_aarch64
cp36-manylinux_ppc64le
cp36-manylinux_s390x
cp36-manylinux_armv7l
cp36-musllinux_aarch64
cp36-musllinux_ppc64le
cp36-musllinux_s390x
cp36-musllinux_armv7l | -| Python 3.7 | cp37-macosx_x86_64 | cp37-win_amd64
cp37-win32 | cp37-manylinux_x86_64
cp37-manylinux_i686
cp37-musllinux_x86_64
cp37-musllinux_i686 | cp37-manylinux_aarch64
cp37-manylinux_ppc64le
cp37-manylinux_s390x
cp37-manylinux_armv7l
cp37-musllinux_aarch64
cp37-musllinux_ppc64le
cp37-musllinux_s390x
cp37-musllinux_armv7l | | Python 3.8 | cp38-macosx_x86_64
cp38-macosx_universal2
cp38-macosx_arm64 | cp38-win_amd64
cp38-win32 | cp38-manylinux_x86_64
cp38-manylinux_i686
cp38-musllinux_x86_64
cp38-musllinux_i686 | cp38-manylinux_aarch64
cp38-manylinux_ppc64le
cp38-manylinux_s390x
cp38-manylinux_armv7l
cp38-musllinux_aarch64
cp38-musllinux_ppc64le
cp38-musllinux_s390x
cp38-musllinux_armv7l | | Python 3.9 | cp39-macosx_x86_64
cp39-macosx_universal2
cp39-macosx_arm64 | cp39-win_amd64
cp39-win32
cp39-win_arm64 | cp39-manylinux_x86_64
cp39-manylinux_i686
cp39-musllinux_x86_64
cp39-musllinux_i686 | cp39-manylinux_aarch64
cp39-manylinux_ppc64le
cp39-manylinux_s390x
cp39-manylinux_armv7l
cp39-musllinux_aarch64
cp39-musllinux_ppc64le
cp39-musllinux_s390x
cp39-musllinux_armv7l | | 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-musllinux_aarch64
cp310-musllinux_ppc64le
cp310-musllinux_s390x
cp310-musllinux_armv7l | | 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-musllinux_aarch64
cp311-musllinux_ppc64le
cp311-musllinux_s390x
cp311-musllinux_armv7l | | 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-musllinux_armv7l
cp312-musllinux_ppc64le
cp312-musllinux_s390x
cp312-musllinux_armv7l | | 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-musllinux_aarch64
cp313-musllinux_ppc64le
cp313-musllinux_s390x
cp313-musllinux_armv7l | -| PyPy3.7 v7.3 | pp37-macosx_x86_64 | pp37-win_amd64 | pp37-manylinux_x86_64
pp37-manylinux_i686 | pp37-manylinux_aarch64 | | 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 | | PyPy3.10 v7.3 | pp310-macosx_x86_64
pp310-macosx_arm64 | pp310-win_amd64 | pp310-manylinux_x86_64
pp310-manylinux_i686 | pp310-manylinux_aarch64 | @@ -311,10 +308,10 @@ The lowest value you can set `MACOSX_DEPLOYMENT_TARGET` is as follows: | Arch | Python version range | Minimum target | |-------|----------------------|----------------| -| Intel | CPython 3.6-3.11 | 10.9 | +| Intel | CPython 3.8-3.11 | 10.9 | | Intel | CPython 3.12+ | 10.13 | | AS | CPython or PyPy | 11 | -| Intel | PyPy 3.7-3.8 | 10.13 | +| Intel | PyPy 3.8 | 10.13 | | Intel | PyPy 3.9+ | 10.15 | If you set the value lower, cibuildwheel will cap it to the lowest supported value for each target as needed. @@ -331,29 +328,26 @@ See the [cibuildwheel 1 documentation](https://cibuildwheel.pypa.io/en/1.x/) for !!! tab examples "Environment variables" ```yaml - # Only build on CPython 3.6 - CIBW_BUILD: cp36-* - - # Skip building on CPython 3.6 on the Mac - CIBW_SKIP: cp36-macosx_x86_64 + # Only build on CPython 3.8 + CIBW_BUILD: cp38-* # Skip building on CPython 3.8 on the Mac CIBW_SKIP: cp38-macosx_x86_64 - # Skip building on CPython 3.6 on all platforms - CIBW_SKIP: cp36-* + # Skip building on CPython 3.8 on all platforms + CIBW_SKIP: cp38-* - # Skip CPython 3.6 on Windows - CIBW_SKIP: cp36-win* + # Skip CPython 3.8 on Windows + CIBW_SKIP: cp38-win* - # Skip CPython 3.6 on 32-bit Windows - CIBW_SKIP: cp36-win32 + # Skip CPython 3.8 on 32-bit Windows + CIBW_SKIP: cp38-win32 - # Skip CPython 3.6 and CPython 3.7 - CIBW_SKIP: cp36-* cp37-* + # Skip CPython 3.8 and CPython 3.9 + CIBW_SKIP: cp38-* cp39-* - # Skip Python 3.6 on Linux - CIBW_SKIP: cp36-manylinux* + # Skip Python 3.8 on Linux + CIBW_SKIP: cp38-manylinux* # Skip 32-bit builds CIBW_SKIP: "*-win32 *-manylinux_i686" @@ -368,29 +362,26 @@ See the [cibuildwheel 1 documentation](https://cibuildwheel.pypa.io/en/1.x/) for ```toml [tool.cibuildwheel] - # Only build on CPython 3.6 - build = "cp36-*" - - # Skip building on CPython 3.6 on the Mac - skip = "cp36-macosx_x86_64" + # Only build on CPython 3.8 + build = "cp38-*" # Skip building on CPython 3.8 on the Mac skip = "cp38-macosx_x86_64" - # Skip building on CPython 3.6 on all platforms - skip = "cp36-*" + # Skip building on CPython 3.8 on all platforms + skip = "cp38-*" - # Skip CPython 3.6 on Windows - skip = "cp36-win*" + # Skip CPython 3.8 on Windows + skip = "cp38-win*" - # Skip CPython 3.6 on 32-bit Windows - skip = "cp36-win32" + # Skip CPython 3.8 on 32-bit Windows + skip = "cp38-win32" - # Skip CPython 3.6 and CPython 3.7 - skip = ["cp36-*", "cp37-*"] + # Skip CPython 3.8 and CPython 3.9 + skip = ["cp38-*", "cp39-*"] - # Skip Python 3.6 on Linux - skip = "cp36-manylinux*" + # Skip Python 3.8 on Linux + skip = "cp38-manylinux*" # Skip 32-bit builds skip = ["*-win32", "*-manylinux_i686"] @@ -518,7 +509,7 @@ simple keyword assignment in a top level function call. If you need to override this behaviour for some reason, you can use this option. When setting this option, the syntax is the same as `project.requires-python`, -using 'version specifiers' like `>=3.6`, according to +using 'version specifiers' like `>=3.8`, according to [PEP440](https://www.python.org/dev/peps/pep-0440/#version-specifiers). Default: reads your package's Python compatibility from `pyproject.toml` @@ -539,7 +530,7 @@ the package is compatible with all versions of Python that it can build. ```toml [project] ... - requires-python = ">=3.6" + requires-python = ">=3.8" ``` Note that not all build backends fully support using a `[project]` table yet; @@ -555,7 +546,7 @@ the package is compatible with all versions of Python that it can build. !!! tab examples "Environment variables" ```yaml - CIBW_PROJECT_REQUIRES_PYTHON: ">=3.6" + CIBW_PROJECT_REQUIRES_PYTHON: ">=3.8" ``` ### `CIBW_ENABLE` {: #enable} @@ -683,10 +674,9 @@ possible, both through `--installer=uv` passed to build, as well as when making all build and test environments. This will generally speed up cibuildwheel. Make sure you have an external uv on Windows and macOS, either by pre-installing it, or installing cibuildwheel with the uv extra, -`cibuildwheel[uv]`. `uv` will not be used for Python 3.6 or Python 3.7. You -cannot use uv currently on Windows for ARM or for musllinux on s390x as -binaries are not provided by uv. Legacy dependencies like setuptools on Python -< 3.12 and pip are not installed if using uv. +`cibuildwheel[uv]`. You cannot use uv currently on Windows for ARM or for +musllinux on s390x as binaries are not provided by uv. Legacy dependencies like +setuptools on Python < 3.12 and pip are not installed if using uv. Pyodide ignores this setting, as only "build" is supported. @@ -1389,7 +1379,7 @@ here and it will be used instead. If you need different dependencies for each python version, provide them in the same folder with a `-pythonXY` suffix. e.g. if your `CIBW_DEPENDENCY_VERSIONS=./constraints.txt`, cibuildwheel will use - `./constraints-python37.txt` on Python 3.7, or fallback to + `./constraints-python38.txt` on Python 3.8, or fallback to `./constraints.txt` if that's not found. Platform-specific environment variables are also available:
diff --git a/docs/setup.md b/docs/setup.md index e118bb94d..9832c1ce3 100644 --- a/docs/setup.md +++ b/docs/setup.md @@ -100,11 +100,11 @@ You can override the cache folder using the ``CIBW_CACHE_PATH`` environment vari CPython: ```console - Error: CPython 3.6 is not installed. + Error: CPython 3.9 is not installed. cibuildwheel will not perform system-wide installs when running outside of CI. - To build locally, install CPython 3.6 on this machine, or, disable this version of Python using CIBW_SKIP=cp36-macosx_* + To build locally, install CPython 3.9 on this machine, or, disable this version of Python using CIBW_SKIP=cp39-macosx_* - Download link: https://www.python.org/ftp/python/3.6.8/python-3.6.8-macosx10.9.pkg + Download link: https://www.python.org/ftp/python/3.9.8/python-3.9.8-macosx10.9.pkg ``` ### Pyodide (WebAssembly) builds (experimental) diff --git a/test/test_container_images.py b/test/test_container_images.py index 12d486418..fb55469f0 100644 --- a/test/test_container_images.py +++ b/test/test_container_images.py @@ -40,7 +40,7 @@ def test(tmp_path): add_env={ "CIBW_MANYLINUX_X86_64_IMAGE": "dockcross/manylinux2014-x64", "CIBW_MANYLINUX_I686_IMAGE": "dockcross/manylinux2014-x86", - "CIBW_BUILD": "cp3{6,7,8,9}-manylinux*", + "CIBW_BUILD": "cp3{8,9}-manylinux*", }, ) @@ -48,6 +48,6 @@ def test(tmp_path): expected_wheels = [ w for w in utils.expected_wheels("spam", "0.1.0", musllinux_versions=[]) - if "-cp36-" in w or "-cp37-" in w or "-cp38-" in w or "-cp39-" in w + if "-cp38-" in w or "-cp39-" in w ] assert set(actual_wheels) == set(expected_wheels) diff --git a/test/test_dependency_versions.py b/test/test_dependency_versions.py index bd449f23f..54d394671 100644 --- a/test/test_dependency_versions.py +++ b/test/test_dependency_versions.py @@ -1,6 +1,5 @@ from __future__ import annotations -import platform import re import textwrap from pathlib import Path @@ -53,12 +52,10 @@ def get_versions_from_constraint_file(constraint_file: Path) -> dict[str, str]: return dict(re.findall(VERSION_REGEX, constraint_file_text)) -@pytest.mark.parametrize("python_version", ["3.6", "3.8", "3.12"]) +@pytest.mark.parametrize("python_version", ["3.8", "3.12"]) def test_pinned_versions(tmp_path, python_version, build_frontend_env_nouv): if utils.platform == "linux": pytest.skip("linux doesn't pin individual tool versions, it pins manylinux images instead") - if python_version == "3.6" and utils.platform == "macos" and platform.machine() == "arm64": - pytest.skip("macOS arm64 does not support Python 3.6") if python_version != "3.12" and utils.platform == "pyodide": pytest.skip(f"pyodide does not support Python {python_version}") @@ -132,12 +129,11 @@ def test_dependency_constraints_file(tmp_path, build_frontend_env_nouv): add_env={ "CIBW_ENVIRONMENT": cibw_environment_option, "CIBW_DEPENDENCY_VERSIONS": str(constraints_file), - "CIBW_SKIP": "cp36-*", **build_frontend_env_nouv, }, ) # also check that we got the right wheels - expected_wheels = [w for w in utils.expected_wheels("spam", "0.1.0") if "-cp36" not in w] + expected_wheels = utils.expected_wheels("spam", "0.1.0") assert set(actual_wheels) == set(expected_wheels) diff --git a/test/utils.py b/test/utils.py index cc441706e..21543b876 100644 --- a/test/utils.py +++ b/test/utils.py @@ -198,8 +198,6 @@ def expected_wheels( python_abi_tags = ["cp312-cp312"] if python_abi_tags is None: python_abi_tags = [ - "cp36-cp36m", - "cp37-cp37m", "cp38-cp38", "cp39-cp39", "cp310-cp310", @@ -211,7 +209,6 @@ def expected_wheels( if machine_arch in ["x86_64", "AMD64", "x86", "aarch64"]: python_abi_tags += [ - "pp37-pypy37_pp73", "pp38-pypy38_pp73", "pp39-pypy39_pp73", "pp310-pypy310_pp73", @@ -297,12 +294,12 @@ def expected_wheels( elif platform == "macos": if python_abi_tag.startswith("pp"): - if python_abi_tag.startswith(("pp37", "pp38")): + if python_abi_tag.startswith("pp38"): min_macosx = macosx_deployment_target else: min_macosx = _floor_macosx(macosx_deployment_target, "10.15") elif python_abi_tag.startswith("cp"): - if python_abi_tag.startswith(("cp36", "cp37", "cp38", "cp39", "cp310", "cp311")): + if python_abi_tag.startswith(("cp38", "cp39", "cp310", "cp311")): min_macosx = macosx_deployment_target else: min_macosx = _floor_macosx(macosx_deployment_target, "10.13") diff --git a/unit_test/dependency_constraints_test.py b/unit_test/dependency_constraints_test.py index 44eb7c743..2263d4f3d 100644 --- a/unit_test/dependency_constraints_test.py +++ b/unit_test/dependency_constraints_test.py @@ -18,6 +18,6 @@ def test_defaults(): assert dependency_constraints.get_for_python_version("3.9").samefile( resources_dir / "constraints-python39.txt" ) - assert dependency_constraints.get_for_python_version("3.6").samefile( - resources_dir / "constraints-python36.txt" + assert dependency_constraints.get_for_python_version("3.13").samefile( + resources_dir / "constraints-python313.txt" ) diff --git a/unit_test/linux_build_steps_test.py b/unit_test/linux_build_steps_test.py index ee608d0c7..df187d4f9 100644 --- a/unit_test/linux_build_steps_test.py +++ b/unit_test/linux_build_steps_test.py @@ -30,7 +30,7 @@ def test_linux_container_split(tmp_path: Path, monkeypatch: pytest.MonkeyPatch) archs = "x86_64 i686" [[tool.cibuildwheel.overrides]] - select = "cp{37,38,39,310}-*" + select = "cp{38,39,310}-*" manylinux-x86_64-image = "other_container_image" manylinux-i686-image = "other_container_image" @@ -68,29 +68,28 @@ def container_engines(step: cibuildwheel.linux.BuildStep) -> list[OCIContainerEn default_container_engine = OCIContainerEngineConfig(name="docker") - assert build_steps[0].container_image == "normal_container_image" - assert identifiers(build_steps[0]) == [ - "cp36-manylinux_x86_64", - "cp311-manylinux_x86_64", - "cp312-manylinux_x86_64", - "cp313-manylinux_x86_64", - ] - assert before_alls(build_steps[0]) == [""] * 4 - assert container_engines(build_steps[0]) == [default_container_engine] * 4 + assert build_steps[0].container_image == "other_container_image" + assert identifiers(build_steps[0]) == ["cp38-manylinux_x86_64"] + assert before_alls(build_steps[0]) == [""] + assert container_engines(build_steps[0]) == [default_container_engine] assert build_steps[1].container_image == "other_container_image" - assert identifiers(build_steps[1]) == ["cp37-manylinux_x86_64", "cp38-manylinux_x86_64"] - assert before_alls(build_steps[1]) == [""] * 2 - assert container_engines(build_steps[1]) == [default_container_engine] * 2 + assert identifiers(build_steps[1]) == ["cp39-manylinux_x86_64"] + assert before_alls(build_steps[1]) == ["echo 'a cp39-only command'"] + assert container_engines(build_steps[1]) == [default_container_engine] assert build_steps[2].container_image == "other_container_image" - assert identifiers(build_steps[2]) == ["cp39-manylinux_x86_64"] - assert before_alls(build_steps[2]) == ["echo 'a cp39-only command'"] - assert container_engines(build_steps[2]) == [default_container_engine] - - assert build_steps[3].container_image == "other_container_image" - assert identifiers(build_steps[3]) == ["cp310-manylinux_x86_64"] - assert before_alls(build_steps[3]) == [""] - assert container_engines(build_steps[3]) == [ + assert identifiers(build_steps[2]) == ["cp310-manylinux_x86_64"] + assert before_alls(build_steps[2]) == [""] + assert container_engines(build_steps[2]) == [ OCIContainerEngineConfig(name="docker", create_args=("--privileged",)) ] + + assert build_steps[3].container_image == "normal_container_image" + assert identifiers(build_steps[3]) == [ + "cp311-manylinux_x86_64", + "cp312-manylinux_x86_64", + "cp313-manylinux_x86_64", + ] + assert before_alls(build_steps[3]) == [""] * 3 + assert container_engines(build_steps[3]) == [default_container_engine] * 3 diff --git a/unit_test/main_tests/main_options_test.py b/unit_test/main_tests/main_options_test.py index 9f1a380eb..6b5d51f66 100644 --- a/unit_test/main_tests/main_options_test.py +++ b/unit_test/main_tests/main_options_test.py @@ -309,6 +309,7 @@ def test_config_settings(platform_specific, platform, intercepted_build_args, mo [ "cp27-*", "cp35-*", + "?p36-*", "?p27*", "?p2*", "?p35*", @@ -327,7 +328,8 @@ def test_build_selector_deprecated_error(monkeypatch, selector, pattern, capsys) main() stderr = capsys.readouterr().err - msg = f"cibuildwheel 2.x no longer supports Python < 3.6. Please use the 1.x series or update {selector}" + 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 {selector}" assert msg in stderr diff --git a/unit_test/option_prepare_test.py b/unit_test/option_prepare_test.py index 463fb62cc..db0bc206e 100644 --- a/unit_test/option_prepare_test.py +++ b/unit_test/option_prepare_test.py @@ -15,8 +15,8 @@ from cibuildwheel.oci_container import OCIPlatform from cibuildwheel.util import file -DEFAULT_IDS = {"cp36", "cp37", "cp38", "cp39", "cp310", "cp311", "cp312", "cp313"} -ALL_IDS = DEFAULT_IDS | {"cp313t", "pp37", "pp38", "pp39", "pp310", "pp311"} +DEFAULT_IDS = {"cp38", "cp39", "cp310", "cp311", "cp312", "cp313"} +ALL_IDS = DEFAULT_IDS | {"cp313t", "pp38", "pp39", "pp310", "pp311"} @pytest.fixture @@ -114,7 +114,7 @@ def test_build_with_override_launches(monkeypatch, tmp_path): musllinux-x86_64-image = "musllinux_1_1" [[tool.cibuildwheel.overrides]] -select = "cp36-manylinux_x86_64" +select = "cp38-manylinux_x86_64" before-all = "true" """ ) @@ -134,8 +134,8 @@ def test_build_with_override_launches(monkeypatch, tmp_path): assert kwargs["container"]["oci_platform"] == OCIPlatform.AMD64 identifiers = {x.identifier for x in kwargs["platform_configs"]} - assert identifiers == {"cp36-manylinux_x86_64"} - assert kwargs["options"].build_options("cp36-manylinux_x86_64").before_all == "true" + assert identifiers == {"cp38-manylinux_x86_64"} + assert kwargs["options"].build_options("cp38-manylinux_x86_64").before_all == "true" kwargs = build_in_container.call_args_list[1][1] assert "quay.io/pypa/manylinux2014_x86_64" in kwargs["container"]["image"] @@ -147,20 +147,19 @@ def test_build_with_override_launches(monkeypatch, tmp_path): f"{x}-manylinux_x86_64" for x in ALL_IDS - { - "cp36", + "cp38", "cp310", "cp311", "cp312", "cp313", "cp313t", - "pp37", "pp38", "pp39", "pp310", "pp311", } } - assert kwargs["options"].build_options("cp37-manylinux_x86_64").before_all == "" + assert kwargs["options"].build_options("cp39-manylinux_x86_64").before_all == "" kwargs = build_in_container.call_args_list[2][1] assert "quay.io/pypa/manylinux_2_28_x86_64" in kwargs["container"]["image"] @@ -175,7 +174,6 @@ def test_build_with_override_launches(monkeypatch, tmp_path): "cp312", "cp313", "cp313t", - "pp37", "pp38", "pp39", "pp310", @@ -198,7 +196,7 @@ def test_build_with_override_launches(monkeypatch, tmp_path): identifiers = {x.identifier for x in kwargs["platform_configs"]} assert identifiers == { - f"{x}-musllinux_x86_64" for x in ALL_IDS & {"cp36", "cp37", "cp38", "cp39"} if "pp" not in x + f"{x}-musllinux_x86_64" for x in ALL_IDS & {"cp38", "cp39"} if "pp" not in x } kwargs = build_in_container.call_args_list[5][1] @@ -207,7 +205,7 @@ def test_build_with_override_launches(monkeypatch, tmp_path): assert kwargs["container"]["oci_platform"] == OCIPlatform.AMD64 identifiers = {x.identifier for x in kwargs["platform_configs"]} assert identifiers == { - f"{x}-musllinux_x86_64" for x in ALL_IDS - {"cp36", "cp37", "cp38", "cp39"} if "pp" not in x + f"{x}-musllinux_x86_64" for x in ALL_IDS - {"cp38", "cp39"} if "pp" not in x } kwargs = build_in_container.call_args_list[6][1] diff --git a/unit_test/options_test.py b/unit_test/options_test.py index 99b484044..603e07949 100644 --- a/unit_test/options_test.py +++ b/unit_test/options_test.py @@ -19,7 +19,7 @@ PYPROJECT_1 = """ [tool.cibuildwheel] -build = ["cp38*", "cp37*"] +build = ["cp38-*", "cp313-*"] skip = ["*musllinux*"] environment = {FOO="BAR"} @@ -34,7 +34,7 @@ test-requires = "else" [[tool.cibuildwheel.overrides]] -select = "cp37*" +select = "cp313-*" test-command = "pyproject-override" manylinux-x86_64-image = "manylinux2014" """ @@ -60,7 +60,7 @@ def test_options_1(tmp_path, monkeypatch): override_display = """\ *: pyproject - cp37-manylinux_x86_64, cp37-manylinux_i686: pyproject-override""" + cp313-manylinux_x86_64, cp313-manylinux_i686: pyproject-override""" print(options.summary(identifiers)) assert override_display in options.summary(identifiers) @@ -78,7 +78,7 @@ def test_options_1(tmp_path, monkeypatch): assert local.test_sources == ["test", "other dir"] assert local.manylinux_images["x86_64"] == pinned_x86_64_container_image["manylinux1"] - local = options.build_options("cp37-manylinux_x86_64") + local = options.build_options("cp313-manylinux_x86_64") assert local.manylinux_images is not None assert local.test_command == "pyproject-override" assert local.test_sources == ["test", "other dir"]