Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 0 additions & 16 deletions .cirrus.yml
Original file line number Diff line number Diff line change
Expand Up @@ -73,19 +73,3 @@ macos_arm64_task:
- brew install python@3.12
- python3.12 -m venv ${VENV_ROOT}
<<: *RUN_TESTS

macos_arm64_cp38_task:
macos_instance:
image: ghcr.io/cirruslabs/macos-runner:sequoia
env:
VENV_ROOT: ${HOME}/venv-cibuildwheel
PATH: ${VENV_ROOT}/bin:${PATH}
PYTEST_ADDOPTS: --run-cp38-universal2 -k 'test_cp38_arm64_testing_universal2_installer or test_arch_auto or test_dummy_serial'
install_pre_requirements_script:
- brew install python@3.12
- python3.12 -m venv ${VENV_ROOT}
- curl -fsSLO https://www.python.org/ftp/python/3.8.10/python-3.8.10-macos11.pkg
- sudo installer -pkg python-3.8.10-macos11.pkg -target /
- rm python-3.8.10-macos11.pkg
- sh "/Applications/Python 3.8/Install Certificates.command"
<<: *RUN_TESTS
2 changes: 0 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,14 +24,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<br/>musllinux x86_64 | manylinux<br/>musllinux i686 | manylinux<br/>musllinux aarch64 | manylinux<br/>musllinux ppc64le | manylinux<br/>musllinux s390x | manylinux<br/>musllinux armv7l | Android | iOS | Pyodide |
|--------------------|----|-----|----|-----|-----|----|-----|----|-----|-----|---|-----|-----|-----|
| CPython 3.8 | ✅ | ✅ | ✅ | ✅ | N/A | ✅ | ✅ | ✅ | ✅ | ✅ | ✅⁵ | N/A | N/A | N/A |
| CPython 3.9 | ✅ | ✅ | ✅ | ✅ | ✅² | ✅ | ✅ | ✅ | ✅ | ✅ | ✅⁵ | N/A | N/A | N/A |
| CPython 3.10 | ✅ | ✅ | ✅ | ✅ | ✅² | ✅ | ✅ | ✅ | ✅ | ✅ | ✅⁵ | N/A | N/A | N/A |
| CPython 3.11 | ✅ | ✅ | ✅ | ✅ | ✅² | ✅ | ✅ | ✅ | ✅ | ✅ | ✅⁵ | N/A | N/A | N/A |
| CPython 3.12 | ✅ | ✅ | ✅ | ✅ | ✅² | ✅ | ✅ | ✅ | ✅ | ✅ | ✅⁵ | N/A | N/A | ✅⁴ |
| CPython 3.13³ | ✅ | ✅ | ✅ | ✅ | ✅² | ✅ | ✅ | ✅ | ✅ | ✅ | ✅⁵ | ✅ | ✅ | ✅⁴ |
| CPython 3.14 | ✅ | ✅ | ✅ | ✅ | ✅² | ✅ | ✅ | ✅ | ✅ | ✅ | ✅⁵ | ✅ | ✅ | N/A |
| PyPy 3.8 v7.3 | ✅ | ✅ | ✅ | N/A | N/A | ✅¹ | ✅¹ | ✅¹ | 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 | N/A | N/A |
| PyPy 3.10 v7.3 | ✅ | ✅ | ✅ | N/A | N/A | ✅¹ | ✅¹ | ✅¹ | N/A | N/A | N/A | N/A | N/A | N/A |
| PyPy 3.11 v7.3 | ✅ | ✅ | ✅ | N/A | N/A | ✅¹ | ✅¹ | ✅¹ | N/A | N/A | N/A | N/A | N/A | N/A |
Expand Down
7 changes: 5 additions & 2 deletions cibuildwheel/__main__.py
Original file line number Diff line number Diff line change
Expand Up @@ -534,10 +534,13 @@ def check_for_invalid_selectors(
msg += "This selector matches a group that wasn't enabled. Enable it using the `enable` option or remove this selector. "

if "p2" in selector_ or "p35" in selector_:
msg += f"cibuildwheel 3.x no longer supports Python < 3.8. Please use the 1.x series or update `{selector_name}`. "
msg += f"cibuildwheel 4.x no longer supports Python < 3.9. Please use the 1.x series or update `{selector_name}`. "
error_type = errors.DeprecationError
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}`. "
msg += f"cibuildwheel 4.x no longer supports Python < 3.9. Please use the 2.x series or update `{selector_name}`. "
error_type = errors.DeprecationError
if "p38" in selector_:
msg += f"cibuildwheel 4.x no longer supports Python < 3.9. Please use the 3.x series or update `{selector_name}`. "
error_type = errors.DeprecationError

if selector_name == "build":
Expand Down
11 changes: 3 additions & 8 deletions cibuildwheel/frontend.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
from collections.abc import Sequence
from typing import Literal, Self, get_args

from .logger import log
from .util.helpers import parse_key_value_string

BuildFrontendName = Literal["pip", "build", "build[uv]", "uv"]
Expand Down Expand Up @@ -36,12 +35,8 @@ def options_summary(self) -> str | dict[str, str]:
return {"name": self.name, "args": repr(self.args)}


def _get_verbosity_flags(level: int, frontend: BuildFrontendName, *, py38: bool) -> list[str]:
def _get_verbosity_flags(level: int, frontend: BuildFrontendName) -> list[str]:
if level < 0:
if frontend.startswith("build") and py38:
msg = f"build_verbosity {level} is not supported for {frontend} frontend. Ignoring."
log.warning(msg)
return []
return ["-" + -level * "q"]

if level > 0:
Expand Down Expand Up @@ -75,10 +70,10 @@ def parse_config_settings(config_settings_str: str) -> dict[str, str | list[str]


def get_build_frontend_extra_flags(
build_frontend: BuildFrontendConfig, verbosity_level: int, config_settings: str, *, py38: bool
build_frontend: BuildFrontendConfig, verbosity_level: int, config_settings: str
) -> list[str]:
return [
*_split_config_settings(config_settings),
*build_frontend.args,
*_get_verbosity_flags(verbosity_level, build_frontend.name, py38=py38),
*_get_verbosity_flags(verbosity_level, build_frontend.name),
]
2 changes: 0 additions & 2 deletions cibuildwheel/platforms/android.py
Original file line number Diff line number Diff line change
Expand Up @@ -457,7 +457,6 @@ def build_wheel(state: BuildState) -> Path:
state.options.build_frontend,
state.options.build_verbosity,
state.options.config_settings,
py38=False,
),
env=state.android_env,
)
Expand All @@ -475,7 +474,6 @@ def build_wheel(state: BuildState) -> Path:
state.options.build_frontend,
state.options.build_verbosity,
state.options.config_settings,
py38=False,
),
env=state.android_env,
)
Expand Down
1 change: 0 additions & 1 deletion cibuildwheel/platforms/ios.py
Original file line number Diff line number Diff line change
Expand Up @@ -490,7 +490,6 @@ def build(options: Options, tmp_path: Path) -> None:
build_frontend,
build_options.build_verbosity,
build_options.config_settings,
py38=False,
)

match build_frontend.name:
Expand Down
1 change: 0 additions & 1 deletion cibuildwheel/platforms/linux.py
Original file line number Diff line number Diff line change
Expand Up @@ -277,7 +277,6 @@ def build_in_container(
build_frontend,
build_options.build_verbosity,
build_options.config_settings,
py38=config.identifier[1:].startswith("p38"),
)

match build_frontend.name:
Expand Down
47 changes: 2 additions & 45 deletions cibuildwheel/platforms/macos.py
Original file line number Diff line number Diff line change
Expand Up @@ -475,7 +475,6 @@ def build(options: Options, tmp_path: Path) -> None:
build_frontend,
build_options.build_verbosity,
build_options.config_settings,
py38=config.identifier[1:].startswith("p38"),
)

build_env = env.copy()
Expand Down Expand Up @@ -568,13 +567,6 @@ def build(options: Options, tmp_path: Path) -> None:

if build_options.test_command and build_options.test_selector(config.identifier):
machine_arch = platform.machine()
python_arch = call(
"python",
"-sSc",
"import platform; print(platform.machine())",
env=env,
capture_stdout=True,
).strip()
testing_archs: list[Literal["x86_64", "arm64"]]

if config_is_arm64:
Expand Down Expand Up @@ -622,24 +614,6 @@ def build(options: Options, tmp_path: Path) -> None:
# skip this test
continue

is_cp38 = config.identifier.startswith("cp38-")
if testing_arch == "arm64" and is_cp38 and python_arch != "arm64":
log.warning(
unwrap(
"""
While cibuildwheel can build CPython 3.8 universal2/arm64 wheels, we
cannot test the arm64 part of them, even when running on an Apple
Silicon machine. This is because we use the x86_64 installer of
CPython 3.8. See the discussion in
https://github.com/pypa/cibuildwheel/pull/1169 for the details. To
silence this warning, set `CIBW_TEST_SKIP: "cp38-macosx_*:arm64"`.
"""
)
)

# skip this test
continue

log.step(
"Testing wheel..."
if testing_arch == machine_arch
Expand Down Expand Up @@ -696,33 +670,16 @@ def build(options: Options, tmp_path: Path) -> None:
shell_with_arch(before_test_prepared, env=virtualenv_env)

# install the wheel
if is_cp38 and python_arch == "x86_64":
virtualenv_env_install_wheel = virtualenv_env.copy()
virtualenv_env_install_wheel["SYSTEM_VERSION_COMPAT"] = "0"
log.notice(
unwrap(
"""
Setting SYSTEM_VERSION_COMPAT=0 to ensure CPython 3.8 can get
correct macOS version and allow installation of wheels with
MACOSX_DEPLOYMENT_TARGET >= 11.0.
See https://github.com/pypa/cibuildwheel/issues/1767 for the
details.
"""
)
)
else:
virtualenv_env_install_wheel = virtualenv_env

pip_install(
f"{repaired_wheel}{build_options.test_extras}",
env=virtualenv_env_install_wheel,
env=virtualenv_env,
)

# test the wheel
if build_options.test_requires:
pip_install(
*build_options.test_requires,
env=virtualenv_env_install_wheel,
env=virtualenv_env,
)

# run the tests from a temp dir, with an absolute path in the command
Expand Down
1 change: 0 additions & 1 deletion cibuildwheel/platforms/pyodide.py
Original file line number Diff line number Diff line change
Expand Up @@ -419,7 +419,6 @@ def build(options: Options, tmp_path: Path) -> None:
build_frontend,
build_options.build_verbosity,
build_options.config_settings,
py38=False,
)

call(
Expand Down
11 changes: 1 addition & 10 deletions cibuildwheel/platforms/windows.py
Original file line number Diff line number Diff line change
Expand Up @@ -232,11 +232,6 @@ def setup_rust_cross_compile(
)


def can_use_uv(python_configuration: PythonConfiguration) -> bool:
conditions = (not python_configuration.identifier.startswith("pp38-"),)
return all(conditions)


def setup_python(
tmp: Path,
python_configuration: PythonConfiguration,
Expand Down Expand Up @@ -268,9 +263,6 @@ def setup_python(
raise ValueError(msg)
assert base_python.exists()

if build_frontend == "build[uv]" and not can_use_uv(python_configuration):
build_frontend = "build"

use_uv = build_frontend in {"build[uv]", "uv"}
uv_path = find_uv()

Expand Down Expand Up @@ -405,7 +397,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
use_uv = build_frontend.name in {"build[uv]", "uv"} and can_use_uv(config)
use_uv = build_frontend.name in {"build[uv]", "uv"}
log.build_start(config.identifier)

identifier_tmp_dir = tmp_path / config.identifier
Expand Down Expand Up @@ -453,7 +445,6 @@ def build(options: Options, tmp_path: Path) -> None:
build_frontend,
build_options.build_verbosity,
build_options.config_settings,
py38=config.identifier[1:].startswith("p38"),
)

if (
Expand Down
Loading
Loading