diff --git a/build_rust.py b/build_rust.py
index 662474dcb4..d2726cee26 100644
--- a/build_rust.py
+++ b/build_rust.py
@@ -1,8 +1,10 @@
# A build script for poetry that adds the rust extension.
+import itertools
import os
from typing import Any, Dict
+from packaging.specifiers import SpecifierSet
from setuptools_rust import Binding, RustExtension
@@ -14,6 +16,8 @@ def build(setup_kwargs: Dict[str, Any]) -> None:
target="synapse.synapse_rust",
path=cargo_toml_path,
binding=Binding.PyO3,
+ # This flag is a no-op in the latest versions. Instead, we need to
+ # specify this in the `bdist_wheel` config below.
py_limited_api=True,
# We force always building in release mode, as we can't tell the
# difference between using `poetry` in development vs production.
@@ -21,3 +25,18 @@ def build(setup_kwargs: Dict[str, Any]) -> None:
)
setup_kwargs.setdefault("rust_extensions", []).append(extension)
setup_kwargs["zip_safe"] = False
+
+ # We lookup the minimum supported python version by looking at
+ # `python_requires` (e.g. ">=3.9.0,<4.0.0") and finding the first python
+ # version that matches. We then convert that into the `py_limited_api` form,
+ # e.g. cp39 for python 3.9.
+ py_limited_api: str
+ python_bounds = SpecifierSet(setup_kwargs["python_requires"])
+ for minor_version in itertools.count(start=8):
+ if f"3.{minor_version}.0" in python_bounds:
+ py_limited_api = f"cp3{minor_version}"
+ break
+
+ setup_kwargs.setdefault("options", {}).setdefault("bdist_wheel", {})[
+ "py_limited_api"
+ ] = py_limited_api
diff --git a/changelog.d/17969.misc b/changelog.d/17969.misc
new file mode 100644
index 0000000000..05506daaa0
--- /dev/null
+++ b/changelog.d/17969.misc
@@ -0,0 +1 @@
+Update setuptools-rust and fix building abi3 wheels in latest version.
diff --git a/poetry.lock b/poetry.lock
index 14bb9ad172..f43fe2489a 100644
--- a/poetry.lock
+++ b/poetry.lock
@@ -1,4 +1,4 @@
-# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand.
+# This file is automatically @generated by Poetry 1.8.4 and should not be changed by hand.
[[package]]
name = "annotated-types"
@@ -2405,19 +2405,18 @@ test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "importlib-metadata
[[package]]
name = "setuptools-rust"
-version = "1.8.1"
+version = "1.10.2"
description = "Setuptools Rust extension plugin"
optional = false
python-versions = ">=3.8"
files = [
- {file = "setuptools-rust-1.8.1.tar.gz", hash = "sha256:94b1dd5d5308b3138d5b933c3a2b55e6d6927d1a22632e509fcea9ddd0f7e486"},
- {file = "setuptools_rust-1.8.1-py3-none-any.whl", hash = "sha256:b5324493949ccd6aa0c03890c5f6b5f02de4512e3ac1697d02e9a6c02b18aa8e"},
+ {file = "setuptools_rust-1.10.2-py3-none-any.whl", hash = "sha256:4b39c435ae9670315d522ed08fa0e8cb29f2a6048033966b6be2571a90ce4f1c"},
+ {file = "setuptools_rust-1.10.2.tar.gz", hash = "sha256:5d73e7eee5f87a6417285b617c97088a7c20d1a70fcea60e3bdc94ff567c29dc"},
]
[package.dependencies]
semantic-version = ">=2.8.2,<3"
setuptools = ">=62.4"
-tomli = {version = ">=1.2.1", markers = "python_version < \"3.11\""}
[[package]]
name = "signedjson"
@@ -2528,7 +2527,7 @@ files = [
name = "tornado"
version = "6.4.2"
description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed."
-optional = false
+optional = true
python-versions = ">=3.8"
files = [
{file = "tornado-6.4.2-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:e828cce1123e9e44ae2a50a9de3055497ab1d0aeb440c5ac23064d9e44880da1"},
|