From 3b488c13f8ef4ac96223ca9cfad1af567d075f71 Mon Sep 17 00:00:00 2001 From: Zanie Blue Date: Tue, 8 Apr 2025 13:45:46 -0500 Subject: [PATCH 01/18] Bump to 3.14.0a7 --- pythonbuild/downloads.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pythonbuild/downloads.py b/pythonbuild/downloads.py index 89f3ce08..7bb6cbd6 100644 --- a/pythonbuild/downloads.py +++ b/pythonbuild/downloads.py @@ -82,10 +82,10 @@ "python_tag": "cp313", }, "cpython-3.14": { - "url": "https://www.python.org/ftp/python/3.14.0/Python-3.14.0a6.tar.xz", - "size": 22956068, - "sha256": "8d6181e5331d9a2cd6ca405ae1230e88589a043f4768ebb443d3889d45c1c35c", - "version": "3.14.0a6", + "url": "https://www.python.org/ftp/python/3.14.0/Python-3.14.0a7.tar.xz", + "size": 23015952, + "sha256": "71adbcec3ac9edf93308e55cfb4184f2eb4b16fda2bb0a5a382929ed29c8386d", + "version": "3.14.0a7", "licenses": ["Python-2.0", "CNRI-Python"], "license_file": "LICENSE.cpython.txt", "python_tag": "cp314", From 8c18873bdd58a1611f32ebb8c7357f9b7d5a02bc Mon Sep 17 00:00:00 2001 From: Zanie Blue Date: Wed, 9 Apr 2025 08:52:14 -0500 Subject: [PATCH 02/18] Add minimal definitions for new extension modules --- cpython-unix/extension-modules.yml | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/cpython-unix/extension-modules.yml b/cpython-unix/extension-modules.yml index a8ff460f..396386f8 100644 --- a/cpython-unix/extension-modules.yml +++ b/cpython-unix/extension-modules.yml @@ -311,6 +311,13 @@ _heapq: sources: - _heapqmodule.c +_hmac: + minimum-python-version: '3.14' + sources: + - hmacmodule.c + includes: + - Modules/_hacl/include + _imp: config-c-only: true @@ -700,6 +707,11 @@ _tracemalloc: required-targets: - .* +_types: + minimum-python-version: "3.14" + sources: + - _typesmodule.c + _typing: minimum-python-version: "3.11" setup-enabled-conditional: From 6d821d73cad6446a69fca369fdeeeb201e9721da Mon Sep 17 00:00:00 2001 From: Zanie Blue Date: Wed, 9 Apr 2025 09:50:16 -0500 Subject: [PATCH 03/18] Add setup-enabled annotation --- cpython-unix/extension-modules.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/cpython-unix/extension-modules.yml b/cpython-unix/extension-modules.yml index 396386f8..4d8bc406 100644 --- a/cpython-unix/extension-modules.yml +++ b/cpython-unix/extension-modules.yml @@ -709,6 +709,7 @@ _tracemalloc: _types: minimum-python-version: "3.14" + setup-enabled: true sources: - _typesmodule.c From 5a2f7b6813ee6445ea05401026edf59fdd1ec273 Mon Sep 17 00:00:00 2001 From: Zanie Blue Date: Wed, 9 Apr 2025 09:59:50 -0500 Subject: [PATCH 04/18] Toggle zlib to zlib-ng on 3.14+ --- cpython-windows/build.py | 18 +++++++++++++++--- pythonbuild/downloads.py | 9 +++++++++ 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/cpython-windows/build.py b/cpython-windows/build.py index 7e4d78ac..fd81f933 100644 --- a/cpython-windows/build.py +++ b/cpython-windows/build.py @@ -346,16 +346,18 @@ def hack_props( pcbuild_path: pathlib.Path, arch: str, python_version: str, + zlib_entry: str ): # TODO can we pass props into msbuild.exe? # Our dependencies are in different directories from what CPython's # build system expects. Modify the config file appropriately. + bzip2_version = DOWNLOADS["bzip2"]["version"] sqlite_version = DOWNLOADS["sqlite"]["version"] xz_version = DOWNLOADS["xz"]["version"] - zlib_version = DOWNLOADS["zlib"]["version"] + zlib_version = DOWNLOADS[zlib_entry]["version"] mpdecimal_version = DOWNLOADS["mpdecimal"]["version"] @@ -369,7 +371,7 @@ def hack_props( libffi_path = td / "libffi" tcltk_path = td / ("cpython-bin-deps-%s" % tcltk_commit) xz_path = td / ("xz-%s" % xz_version) - zlib_path = td / ("zlib-%s" % zlib_version) + zlib_path = td / ("%s-%s" % (zlib_entry, zlib_version)) mpdecimal_path = td / ("mpdecimal-%s" % mpdecimal_version) openssl_root = td / "openssl" / arch @@ -484,6 +486,7 @@ def hack_project_files( cpython_source_path: pathlib.Path, build_directory: str, python_version: str, + zlib_entry: str ): """Hacks Visual Studio project files to work with our build.""" @@ -494,6 +497,7 @@ def hack_project_files( pcbuild_path, build_directory, python_version, + zlib_entry, ) # Our SQLite directory is named weirdly. This throws off version detection @@ -913,6 +917,7 @@ def collect_python_build_artifacts( arch: str, config: str, openssl_entry: str, + zlib_entry: str, freethreaded: bool, ): """Collect build artifacts from Python. @@ -1142,6 +1147,9 @@ def find_additional_dependencies(project: pathlib.Path): if name == "openssl": name = openssl_entry + if name == "zlib": + name = zlib_entry + # On 3.14+, we use the latest tcl/tk version if ext == "_tkinter" and python_majmin == "314": name = name.replace("-8612", "") @@ -1213,10 +1221,12 @@ def build_cpython( # The python.props file keys off MSBUILD, so it needs to be set. os.environ["MSBUILD"] = str(msbuild) + zlib_entry = "zlib-ng" if meets_python_minimum_version("3.14") else "zlib" + bzip2_archive = download_entry("bzip2", BUILD) sqlite_archive = download_entry("sqlite", BUILD) xz_archive = download_entry("xz", BUILD) - zlib_archive = download_entry("zlib", BUILD) + zlib_archive = download_entry(zlib_entry, BUILD) python_archive = download_entry(python_entry_name, BUILD) entry = DOWNLOADS[python_entry_name] @@ -1328,6 +1338,7 @@ def build_cpython( cpython_source_path, build_directory, python_version=python_version, + zlib_entry=zlib_entry, ) if pgo: @@ -1528,6 +1539,7 @@ def build_cpython( build_directory, artifact_config, openssl_entry=openssl_entry, + zlib_entry=zlib_entry, freethreaded=freethreaded, ) diff --git a/pythonbuild/downloads.py b/pythonbuild/downloads.py index 7bb6cbd6..6954efa6 100644 --- a/pythonbuild/downloads.py +++ b/pythonbuild/downloads.py @@ -446,4 +446,13 @@ "licenses": ["Zlib"], "license_file": "LICENSE.zlib.txt", }, + "zlib-ng": { + "url": "https://github.com/python/cpython-source-deps/archive/refs/tags/zlib-ng-2.2.4.tar.gz", + "size": 2415819, + "sha256": "00bbd88709bc416cb96160ab61d3e1c8f76e106799af7328d0fe434dc7dd5004", + "version": "2.2.4", + "library_names": ["z"], + "licenses": ["Zlib"], + "license_file": "LICENSE.zlib-ng.txt", + } } From 7b3797d51e7496c541e7e377552532d38860f502 Mon Sep 17 00:00:00 2001 From: Zanie Blue Date: Wed, 9 Apr 2025 11:15:53 -0500 Subject: [PATCH 05/18] Poke at hmac definition --- cpython-unix/extension-modules.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/cpython-unix/extension-modules.yml b/cpython-unix/extension-modules.yml index 4d8bc406..ca9e166c 100644 --- a/cpython-unix/extension-modules.yml +++ b/cpython-unix/extension-modules.yml @@ -316,7 +316,9 @@ _hmac: sources: - hmacmodule.c includes: - - Modules/_hacl/include + - Modules/_hacl + links: + - :libHacl_Hash_Blake2.a _imp: config-c-only: true From 686674c2afe2e24ef96f7f0f1afa7edc773a116c Mon Sep 17 00:00:00 2001 From: Zanie Blue Date: Wed, 9 Apr 2025 12:48:27 -0500 Subject: [PATCH 06/18] Fix Python version --- cpython-windows/build.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/cpython-windows/build.py b/cpython-windows/build.py index fd81f933..0c0b4ac5 100644 --- a/cpython-windows/build.py +++ b/cpython-windows/build.py @@ -1221,18 +1221,17 @@ def build_cpython( # The python.props file keys off MSBUILD, so it needs to be set. os.environ["MSBUILD"] = str(msbuild) - zlib_entry = "zlib-ng" if meets_python_minimum_version("3.14") else "zlib" + python_archive = download_entry(python_entry_name, BUILD) + entry = DOWNLOADS[python_entry_name] + python_version = entry["version"] + + zlib_entry = "zlib-ng" if meets_python_minimum_version(python_version, "3.14") else "zlib" bzip2_archive = download_entry("bzip2", BUILD) sqlite_archive = download_entry("sqlite", BUILD) xz_archive = download_entry("xz", BUILD) zlib_archive = download_entry(zlib_entry, BUILD) - python_archive = download_entry(python_entry_name, BUILD) - entry = DOWNLOADS[python_entry_name] - - python_version = entry["version"] - setuptools_wheel = download_entry("setuptools", BUILD) pip_wheel = download_entry("pip", BUILD) From fe88d12e45aa460cf45a7b1fbb3886ee10ddaff8 Mon Sep 17 00:00:00 2001 From: Zanie Blue Date: Wed, 9 Apr 2025 12:48:40 -0500 Subject: [PATCH 07/18] Format --- cpython-windows/build.py | 9 +++++---- pythonbuild/downloads.py | 4 ++-- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/cpython-windows/build.py b/cpython-windows/build.py index 0c0b4ac5..a9d82bef 100644 --- a/cpython-windows/build.py +++ b/cpython-windows/build.py @@ -346,14 +346,13 @@ def hack_props( pcbuild_path: pathlib.Path, arch: str, python_version: str, - zlib_entry: str + zlib_entry: str, ): # TODO can we pass props into msbuild.exe? # Our dependencies are in different directories from what CPython's # build system expects. Modify the config file appropriately. - bzip2_version = DOWNLOADS["bzip2"]["version"] sqlite_version = DOWNLOADS["sqlite"]["version"] xz_version = DOWNLOADS["xz"]["version"] @@ -486,7 +485,7 @@ def hack_project_files( cpython_source_path: pathlib.Path, build_directory: str, python_version: str, - zlib_entry: str + zlib_entry: str, ): """Hacks Visual Studio project files to work with our build.""" @@ -1225,7 +1224,9 @@ def build_cpython( entry = DOWNLOADS[python_entry_name] python_version = entry["version"] - zlib_entry = "zlib-ng" if meets_python_minimum_version(python_version, "3.14") else "zlib" + zlib_entry = ( + "zlib-ng" if meets_python_minimum_version(python_version, "3.14") else "zlib" + ) bzip2_archive = download_entry("bzip2", BUILD) sqlite_archive = download_entry("sqlite", BUILD) diff --git a/pythonbuild/downloads.py b/pythonbuild/downloads.py index 6954efa6..8a5bb89f 100644 --- a/pythonbuild/downloads.py +++ b/pythonbuild/downloads.py @@ -448,11 +448,11 @@ }, "zlib-ng": { "url": "https://github.com/python/cpython-source-deps/archive/refs/tags/zlib-ng-2.2.4.tar.gz", - "size": 2415819, + "size": 2415819, "sha256": "00bbd88709bc416cb96160ab61d3e1c8f76e106799af7328d0fe434dc7dd5004", "version": "2.2.4", "library_names": ["z"], "licenses": ["Zlib"], "license_file": "LICENSE.zlib-ng.txt", - } + }, } From 289b1e8cb3783c849c83cc69fb7e78470b4f8cf2 Mon Sep 17 00:00:00 2001 From: Zanie Blue Date: Fri, 16 May 2025 17:07:33 -0400 Subject: [PATCH 08/18] debug: update hacl hmac extension module setup --- cpython-unix/extension-modules.yml | 30 +++++++++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/cpython-unix/extension-modules.yml b/cpython-unix/extension-modules.yml index ca9e166c..089f15a2 100644 --- a/cpython-unix/extension-modules.yml +++ b/cpython-unix/extension-modules.yml @@ -315,10 +315,18 @@ _hmac: minimum-python-version: '3.14' sources: - hmacmodule.c + - _hacl/Hacl_HMAC.c + - _hacl/Hacl_Streaming_HMAC.c includes: - - Modules/_hacl + - Modules/_hacl/ + - Modules/_hacl/include/ + - Modules/_hacl/include/krml/ links: - :libHacl_Hash_Blake2.a + - :libHacl_Hash_SHA1.a + - :libHacl_Hash_SHA2.a + - :libHacl_Hash_SHA3.a + - :libHacl_Hash_MD5.a _imp: config-c-only: true @@ -371,6 +379,10 @@ _md5: sources-conditional: - source: _hacl/Hacl_Hash_MD5.c minimum-python-version: "3.12" + maximum-python-version: "3.13" + links-conditional: + - name: :libHacl_Hash_MD5.a + minimum-python-version: "3.14" defines-conditional: - define: _BSD_SOURCE minimum-python-version: "3.12" @@ -447,6 +459,10 @@ _sha1: sources-conditional: - source: _hacl/Hacl_Hash_SHA1.c minimum-python-version: "3.12" + maximum-python-version: "3.13" + links-conditional: + - name: :libHacl_Hash_SHA1.a + minimum-python-version: "3.14" includes: - Modules/_hacl/include defines-conditional: @@ -466,7 +482,12 @@ _sha2: minimum-python-version: "3.12" sources: - sha2module.c - - _hacl/Hacl_Hash_SHA2.c + sources-conditional: + - source: _hacl/Hacl_Hash_SHA2.c + maximum-python-version: "3.13" + links-conditional: + - name: :libHacl_Hash_SHA2.a + minimum-python-version: "3.14" includes: - Modules/_hacl/include defines: @@ -480,9 +501,12 @@ _sha3: maximum-python-version: "3.11" - source: sha3module.c minimum-python-version: "3.12" - - source: _hacl/Hacl_Hash_SHA3.c minimum-python-version: "3.12" + maximum-python-version: "3.13" + links-conditional: + - name: :libHacl_Hash_SHA3.a + minimum-python-version: "3.14" includes: - Modules/_hacl/include defines-conditional: From 23daf98f52976736159eee041ca859431d8f9856 Mon Sep 17 00:00:00 2001 From: Zanie Blue Date: Fri, 16 May 2025 17:40:12 -0400 Subject: [PATCH 09/18] Update the prop hacks path for zlib-ng --- cpython-windows/build.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/cpython-windows/build.py b/cpython-windows/build.py index a9d82bef..dc253f07 100644 --- a/cpython-windows/build.py +++ b/cpython-windows/build.py @@ -411,6 +411,10 @@ def hack_props( elif b"%s\\" % zlib_path + # On 3.14+, it's zlib-ng and the name changed + elif b"%s\\" % zlib_path + elif b"%s\\" % mpdecimal_path From 12c1ebe37965c02c7eed0442fad26b0be2bca24e Mon Sep 17 00:00:00 2001 From: Zanie Blue Date: Fri, 16 May 2025 17:50:03 -0400 Subject: [PATCH 10/18] Remove the extra krml include --- cpython-unix/extension-modules.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/cpython-unix/extension-modules.yml b/cpython-unix/extension-modules.yml index 089f15a2..50b70576 100644 --- a/cpython-unix/extension-modules.yml +++ b/cpython-unix/extension-modules.yml @@ -320,7 +320,6 @@ _hmac: includes: - Modules/_hacl/ - Modules/_hacl/include/ - - Modules/_hacl/include/krml/ links: - :libHacl_Hash_Blake2.a - :libHacl_Hash_SHA1.a From ba18e416aa14f4f80a5ae3a5c53e5a436e03cf0a Mon Sep 17 00:00:00 2001 From: Zanie Blue Date: Fri, 16 May 2025 17:52:36 -0400 Subject: [PATCH 11/18] Remove extra links --- cpython-unix/extension-modules.yml | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/cpython-unix/extension-modules.yml b/cpython-unix/extension-modules.yml index 50b70576..cbb37292 100644 --- a/cpython-unix/extension-modules.yml +++ b/cpython-unix/extension-modules.yml @@ -379,9 +379,6 @@ _md5: - source: _hacl/Hacl_Hash_MD5.c minimum-python-version: "3.12" maximum-python-version: "3.13" - links-conditional: - - name: :libHacl_Hash_MD5.a - minimum-python-version: "3.14" defines-conditional: - define: _BSD_SOURCE minimum-python-version: "3.12" @@ -459,9 +456,6 @@ _sha1: - source: _hacl/Hacl_Hash_SHA1.c minimum-python-version: "3.12" maximum-python-version: "3.13" - links-conditional: - - name: :libHacl_Hash_SHA1.a - minimum-python-version: "3.14" includes: - Modules/_hacl/include defines-conditional: @@ -484,9 +478,6 @@ _sha2: sources-conditional: - source: _hacl/Hacl_Hash_SHA2.c maximum-python-version: "3.13" - links-conditional: - - name: :libHacl_Hash_SHA2.a - minimum-python-version: "3.14" includes: - Modules/_hacl/include defines: @@ -503,9 +494,6 @@ _sha3: - source: _hacl/Hacl_Hash_SHA3.c minimum-python-version: "3.12" maximum-python-version: "3.13" - links-conditional: - - name: :libHacl_Hash_SHA3.a - minimum-python-version: "3.14" includes: - Modules/_hacl/include defines-conditional: From c389c5de86302196c51566e1bedc9e3181534966 Mon Sep 17 00:00:00 2001 From: Zanie Blue Date: Fri, 16 May 2025 17:57:49 -0400 Subject: [PATCH 12/18] Add `_hmac` and `_types` to wanted modules --- src/validation.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/validation.rs b/src/validation.rs index 747cdaed..c7d71610 100644 --- a/src/validation.rs +++ b/src/validation.rs @@ -763,6 +763,8 @@ const GLOBAL_EXTENSIONS_PYTHON_3_14: &[&str] = &[ "_tokenize", "_typing", "_zoneinfo", + "_hmac", + "_types", ]; const GLOBAL_EXTENSIONS_MACOS: &[&str] = &["_scproxy"]; From 6c1994823edcf9af0badbba96e4660e92b9bcfe3 Mon Sep 17 00:00:00 2001 From: Geoffrey Thomas Date: Fri, 16 May 2025 18:01:18 -0400 Subject: [PATCH 13/18] Build HMAC module with -D_BSD_SOURCE -D_DEFAULT_SOURCE per upstream Modules/Setup --- cpython-unix/extension-modules.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/cpython-unix/extension-modules.yml b/cpython-unix/extension-modules.yml index cbb37292..8b1ad81c 100644 --- a/cpython-unix/extension-modules.yml +++ b/cpython-unix/extension-modules.yml @@ -326,6 +326,9 @@ _hmac: - :libHacl_Hash_SHA2.a - :libHacl_Hash_SHA3.a - :libHacl_Hash_MD5.a + defines: + - _BSD_SOURCE + - _DEFAULT_SOURCE _imp: config-c-only: true From f8d835edb8cbd48a86386d4958a1011c70de9a02 Mon Sep 17 00:00:00 2001 From: Zanie Blue Date: Fri, 16 May 2025 18:17:49 -0400 Subject: [PATCH 14/18] Fix zlib path for zlib-ng --- cpython-windows/build.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cpython-windows/build.py b/cpython-windows/build.py index dc253f07..688f5231 100644 --- a/cpython-windows/build.py +++ b/cpython-windows/build.py @@ -370,7 +370,8 @@ def hack_props( libffi_path = td / "libffi" tcltk_path = td / ("cpython-bin-deps-%s" % tcltk_commit) xz_path = td / ("xz-%s" % xz_version) - zlib_path = td / ("%s-%s" % (zlib_entry, zlib_version)) + zlib_prefix = "cpython-bin-deps-" if zlib_entry == "zlib-ng" else "" + zlib_path = td / ("%s%s-%s" % (zlib_prefix, zlib_entry, zlib_version)) mpdecimal_path = td / ("mpdecimal-%s" % mpdecimal_version) openssl_root = td / "openssl" / arch From c115e73c8e6fa24da1f92f7d23d0e89aab1b5271 Mon Sep 17 00:00:00 2001 From: Zanie Blue Date: Fri, 16 May 2025 21:41:49 -0400 Subject: [PATCH 15/18] Fix bin -> source --- cpython-windows/build.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cpython-windows/build.py b/cpython-windows/build.py index 688f5231..bd010d8f 100644 --- a/cpython-windows/build.py +++ b/cpython-windows/build.py @@ -370,7 +370,7 @@ def hack_props( libffi_path = td / "libffi" tcltk_path = td / ("cpython-bin-deps-%s" % tcltk_commit) xz_path = td / ("xz-%s" % xz_version) - zlib_prefix = "cpython-bin-deps-" if zlib_entry == "zlib-ng" else "" + zlib_prefix = "cpython-source-deps-" if zlib_entry == "zlib-ng" else "" zlib_path = td / ("%s%s-%s" % (zlib_prefix, zlib_entry, zlib_version)) mpdecimal_path = td / ("mpdecimal-%s" % mpdecimal_version) From 5a755148016a925f3a060178b5a499511320fd63 Mon Sep 17 00:00:00 2001 From: Zanie Blue Date: Fri, 16 May 2025 21:45:16 -0400 Subject: [PATCH 16/18] Remove extra link to libHacl_Hash_Blake2.a --- cpython-unix/extension-modules.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/cpython-unix/extension-modules.yml b/cpython-unix/extension-modules.yml index 8b1ad81c..c5207857 100644 --- a/cpython-unix/extension-modules.yml +++ b/cpython-unix/extension-modules.yml @@ -38,9 +38,6 @@ _blake2: - Modules/_hacl/include - Modules/_hacl/internal minimum-python-version: "3.14" - links-conditional: - - name: :libHacl_Hash_Blake2.a - minimum-python-version: "3.14" defines-conditional: - define: _BSD_SOURCE minimum-python-version: "3.14" From 7039c8a98880d10f4c0d67a55f098aaffcc03e2f Mon Sep 17 00:00:00 2001 From: Zanie Blue Date: Fri, 16 May 2025 22:22:05 -0400 Subject: [PATCH 17/18] Add `zlib-ng` to `depends_projects` --- cpython-windows/build.py | 1 + 1 file changed, 1 insertion(+) diff --git a/cpython-windows/build.py b/cpython-windows/build.py index bd010d8f..4da24476 100644 --- a/cpython-windows/build.py +++ b/cpython-windows/build.py @@ -1002,6 +1002,7 @@ def collect_python_build_artifacts( depends_projects |= { "liblzma", "sqlite3", + "zlib-ng", } known_projects = ( From 30c5793ea6bb2700d0fae61aa0127915822374a9 Mon Sep 17 00:00:00 2001 From: Zanie Blue Date: Fri, 16 May 2025 22:57:21 -0400 Subject: [PATCH 18/18] Add `_suggestions` to validation in Win 3.14 --- src/validation.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/validation.rs b/src/validation.rs index c7d71610..55139df7 100644 --- a/src/validation.rs +++ b/src/validation.rs @@ -1598,7 +1598,7 @@ fn validate_extension_modules( ]); } - if is_windows && matches!(python_major_minor, "3.13") { + if is_windows && matches!(python_major_minor, "3.13" | "3.14") { wanted.extend(["_suggestions"]); }