diff --git a/cpython-unix/extension-modules.yml b/cpython-unix/extension-modules.yml
index a8ff460f..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"
@@ -311,6 +308,25 @@ _heapq:
sources:
- _heapqmodule.c
+_hmac:
+ minimum-python-version: '3.14'
+ sources:
+ - hmacmodule.c
+ - _hacl/Hacl_HMAC.c
+ - _hacl/Hacl_Streaming_HMAC.c
+ includes:
+ - Modules/_hacl/
+ - Modules/_hacl/include/
+ links:
+ - :libHacl_Hash_Blake2.a
+ - :libHacl_Hash_SHA1.a
+ - :libHacl_Hash_SHA2.a
+ - :libHacl_Hash_SHA3.a
+ - :libHacl_Hash_MD5.a
+ defines:
+ - _BSD_SOURCE
+ - _DEFAULT_SOURCE
+
_imp:
config-c-only: true
@@ -362,6 +378,7 @@ _md5:
sources-conditional:
- source: _hacl/Hacl_Hash_MD5.c
minimum-python-version: "3.12"
+ maximum-python-version: "3.13"
defines-conditional:
- define: _BSD_SOURCE
minimum-python-version: "3.12"
@@ -438,6 +455,7 @@ _sha1:
sources-conditional:
- source: _hacl/Hacl_Hash_SHA1.c
minimum-python-version: "3.12"
+ maximum-python-version: "3.13"
includes:
- Modules/_hacl/include
defines-conditional:
@@ -457,7 +475,9 @@ _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"
includes:
- Modules/_hacl/include
defines:
@@ -471,9 +491,9 @@ _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"
includes:
- Modules/_hacl/include
defines-conditional:
@@ -700,6 +720,12 @@ _tracemalloc:
required-targets:
- .*
+_types:
+ minimum-python-version: "3.14"
+ setup-enabled: true
+ sources:
+ - _typesmodule.c
+
_typing:
minimum-python-version: "3.11"
setup-enabled-conditional:
diff --git a/cpython-windows/build.py b/cpython-windows/build.py
index 7e4d78ac..4da24476 100644
--- a/cpython-windows/build.py
+++ b/cpython-windows/build.py
@@ -346,6 +346,7 @@ def hack_props(
pcbuild_path: pathlib.Path,
arch: str,
python_version: str,
+ zlib_entry: str,
):
# TODO can we pass props into msbuild.exe?
@@ -355,7 +356,7 @@ def hack_props(
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 +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 / ("zlib-%s" % zlib_version)
+ 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)
openssl_root = td / "openssl" / arch
@@ -410,6 +412,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
@@ -484,6 +490,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 +501,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 +921,7 @@ def collect_python_build_artifacts(
arch: str,
config: str,
openssl_entry: str,
+ zlib_entry: str,
freethreaded: bool,
):
"""Collect build artifacts from Python.
@@ -993,6 +1002,7 @@ def collect_python_build_artifacts(
depends_projects |= {
"liblzma",
"sqlite3",
+ "zlib-ng",
}
known_projects = (
@@ -1142,6 +1152,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,16 +1226,19 @@ def build_cpython(
# The python.props file keys off MSBUILD, so it needs to be set.
os.environ["MSBUILD"] = str(msbuild)
- bzip2_archive = download_entry("bzip2", BUILD)
- sqlite_archive = download_entry("sqlite", BUILD)
- xz_archive = download_entry("xz", BUILD)
- zlib_archive = download_entry("zlib", BUILD)
-
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)
+
setuptools_wheel = download_entry("setuptools", BUILD)
pip_wheel = download_entry("pip", BUILD)
@@ -1328,6 +1344,7 @@ def build_cpython(
cpython_source_path,
build_directory,
python_version=python_version,
+ zlib_entry=zlib_entry,
)
if pgo:
@@ -1528,6 +1545,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 89f3ce08..8a5bb89f 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",
@@ -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",
+ },
}
diff --git a/src/validation.rs b/src/validation.rs
index 747cdaed..55139df7 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"];
@@ -1596,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"]);
}