From 920081014e8b136b4565824771dee1d489e046ef Mon Sep 17 00:00:00 2001 From: Andrew Murray <3112309+radarhere@users.noreply.github.com> Date: Tue, 1 Jul 2025 00:32:25 +1000 Subject: [PATCH] feat: added Python 3.14 preview for iOS (#2475) * Added Python 3.14 preview for iOS * Test all Python versions with iOS * add cp314-ios to the build selector table --------- Co-authored-by: Andrew Murray Co-authored-by: Joe Rickerby --- cibuildwheel/resources/build-platforms.toml | 3 +++ docs/options.md | 2 +- test/test_ios.py | 16 ++++------------ 3 files changed, 8 insertions(+), 13 deletions(-) diff --git a/cibuildwheel/resources/build-platforms.toml b/cibuildwheel/resources/build-platforms.toml index dd8aef45..7a5a7628 100644 --- a/cibuildwheel/resources/build-platforms.toml +++ b/cibuildwheel/resources/build-platforms.toml @@ -229,4 +229,7 @@ python_configurations = [ { identifier = "cp313-ios_arm64_iphoneos", version = "3.13", url = "https://github.com/beeware/Python-Apple-support/releases/download/3.13-b9/Python-3.13-iOS-support.b9.tar.gz" }, { identifier = "cp313-ios_x86_64_iphonesimulator", version = "3.13", url = "https://github.com/beeware/Python-Apple-support/releases/download/3.13-b9/Python-3.13-iOS-support.b9.tar.gz" }, { identifier = "cp313-ios_arm64_iphonesimulator", version = "3.13", url = "https://github.com/beeware/Python-Apple-support/releases/download/3.13-b9/Python-3.13-iOS-support.b9.tar.gz" }, + { identifier = "cp314-ios_arm64_iphoneos", version = "3.14", url = "https://github.com/beeware/Python-Apple-support/releases/download/3.14-b5/Python-3.14-iOS-support.b5.tar.gz" }, + { identifier = "cp314-ios_x86_64_iphonesimulator", version = "3.14", url = "https://github.com/beeware/Python-Apple-support/releases/download/3.14-b5/Python-3.14-iOS-support.b5.tar.gz" }, + { identifier = "cp314-ios_arm64_iphonesimulator", version = "3.14", url = "https://github.com/beeware/Python-Apple-support/releases/download/3.14-b5/Python-3.14-iOS-support.b5.tar.gz" }, ] diff --git a/docs/options.md b/docs/options.md index bd99997c..6718c64f 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.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 | 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-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 | cp314-win_amd64
cp314-win32
cp314-win_arm64 | cp314-manylinux_x86_64
cp314-manylinux_i686
cp314-musllinux_x86_64
cp314-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 | | | +| Python 3.14 | cp314-macosx_x86_64
cp314-macosx_universal2
cp314-macosx_arm64 | cp314-win_amd64
cp314-win32
cp314-win_arm64 | cp314-manylinux_x86_64
cp314-manylinux_i686
cp314-musllinux_x86_64
cp314-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 | 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 | | | | PyPy3.10 v7.3 | pp310-macosx_x86_64
pp310-macosx_arm64 | pp310-win_amd64 | pp310-manylinux_x86_64
pp310-manylinux_i686 | pp310-manylinux_aarch64 | | | diff --git a/test/test_ios.py b/test/test_ios.py index b2d7e892..f727db56 100644 --- a/test/test_ios.py +++ b/test/test_ios.py @@ -83,7 +83,6 @@ def test_ios_platforms(tmp_path, build_config, monkeypatch, capfd): project_dir, add_env={ "CIBW_BEFORE_BUILD": "does-exist", - "CIBW_BUILD": "cp313-*", "CIBW_XBUILD_TOOLS": "does-exist", "CIBW_TEST_SOURCES": "tests", "CIBW_TEST_COMMAND": "python -m this && python -m unittest discover tests test_platform.py", @@ -94,7 +93,7 @@ def test_ios_platforms(tmp_path, build_config, monkeypatch, capfd): # The expected wheels were produced. expected_wheels = utils.expected_wheels( - "spam", "0.1.0", platform="ios", python_abi_tags=["cp313-cp313"] + "spam", "0.1.0", platform="ios", python_abi_tags=["cp313-cp313", "cp314-cp314"] ) assert set(actual_wheels) == set(expected_wheels) @@ -121,7 +120,6 @@ def test_no_test_sources(tmp_path, capfd): project_dir, add_env={ "CIBW_PLATFORM": "ios", - "CIBW_BUILD": "cp313-*", "CIBW_TEST_REQUIRES": "pytest", "CIBW_TEST_COMMAND": "python -m pytest", "CIBW_XBUILD_TOOLS": "", @@ -153,7 +151,6 @@ def test_ios_testing_with_placeholder(tmp_path, capfd): project_dir, add_env={ "CIBW_PLATFORM": "ios", - "CIBW_BUILD": "cp313-*", "CIBW_TEST_REQUIRES": "pytest", "CIBW_TEST_COMMAND": "pytest {project}/tests", "CIBW_XBUILD_TOOLS": "", @@ -180,7 +177,6 @@ def test_ios_test_command_short_circuit(tmp_path, capfd): project_dir, add_env={ "CIBW_PLATFORM": "ios", - "CIBW_BUILD": "cp313-*", "CIBW_XBUILD_TOOLS": "", "CIBW_TEST_SOURCES": "tests", "CIBW_TEST_COMMAND": "python -m not_a_module && python -m this", @@ -209,7 +205,6 @@ def test_missing_xbuild_tool(tmp_path, capfd): project_dir, add_env={ "CIBW_PLATFORM": "ios", - "CIBW_BUILD": "cp313-*", "CIBW_TEST_COMMAND": "python -m tests", "CIBW_XBUILD_TOOLS": "does-not-exist", }, @@ -235,7 +230,6 @@ def test_no_xbuild_tool_definition(tmp_path, capfd): project_dir, add_env={ "CIBW_PLATFORM": "ios", - "CIBW_BUILD": "cp313-*", "CIBW_TEST_SKIP": "*", }, ) @@ -245,7 +239,7 @@ def test_no_xbuild_tool_definition(tmp_path, capfd): "spam", "0.1.0", platform="ios", - python_abi_tags=["cp313-cp313"], + python_abi_tags=["cp313-cp313", "cp314-cp314"], ) assert set(actual_wheels) == set(expected_wheels) @@ -269,14 +263,13 @@ def test_empty_xbuild_tool_definition(tmp_path, capfd): project_dir, add_env={ "CIBW_PLATFORM": "ios", - "CIBW_BUILD": "cp313-*", "CIBW_TEST_SKIP": "*", "CIBW_XBUILD_TOOLS": "", }, ) expected_wheels = utils.expected_wheels( - "spam", "0.1.0", platform="ios", python_abi_tags=["cp313-cp313"] + "spam", "0.1.0", platform="ios", python_abi_tags=["cp313-cp313", "cp314-cp314"] ) assert set(actual_wheels) == set(expected_wheels) @@ -306,7 +299,6 @@ def test_ios_test_command_without_python_dash_m(tmp_path, capfd): project_dir, add_env={ "CIBW_PLATFORM": "ios", - "CIBW_BUILD": "cp313-*", "CIBW_TEST_COMMAND": "pytest ./tests", "CIBW_TEST_SOURCES": "tests", "CIBW_TEST_REQUIRES": "pytest", @@ -315,7 +307,7 @@ def test_ios_test_command_without_python_dash_m(tmp_path, capfd): ) expected_wheels = utils.expected_wheels( - "spam", "0.1.0", platform="ios", python_abi_tags=["cp313-cp313"] + "spam", "0.1.0", platform="ios", python_abi_tags=["cp313-cp313", "cp314-cp314"] ) assert set(actual_wheels) == set(expected_wheels)