diff -pruN 1.9.0+dfsg-3/.bumpversion.cfg 1.12.0+dfsg-1/.bumpversion.cfg
--- 1.9.0+dfsg-3/.bumpversion.cfg	2024-02-24 14:14:27.000000000 +0000
+++ 1.12.0+dfsg-1/.bumpversion.cfg	2025-08-29 18:17:36.000000000 +0000
@@ -1,7 +1,7 @@
 [bumpversion]
 commit = True
 tag = False
-current_version = 1.9.0
+current_version = 1.12.0
 message = release: {new_version}
 
 [bumpversion:file:pyproject.toml]
diff -pruN 1.9.0+dfsg-3/.github/dependabot.yml 1.12.0+dfsg-1/.github/dependabot.yml
--- 1.9.0+dfsg-3/.github/dependabot.yml	2024-02-24 14:14:27.000000000 +0000
+++ 1.12.0+dfsg-1/.github/dependabot.yml	2025-08-29 18:17:36.000000000 +0000
@@ -2,52 +2,8 @@ version: 2
 updates:
 
   - package-ecosystem: "cargo"
-    directory: "examples/hello-world"
-    schedule:
-      interval: "monthly"
-    groups:
-      deps:
-        patterns:
-          - "*"
-
-  - package-ecosystem: "cargo"
-    directory: "examples/hello-world-script"
-    schedule:
-      interval: "monthly"
-    groups:
-      deps:
-        patterns:
-          - "*"
-
-  - package-ecosystem: "cargo"
-    directory: "examples/hello-world-setuppy"
-    schedule:
-      interval: "monthly"
-    groups:
-      deps:
-        patterns:
-          - "*"
-
-  - package-ecosystem: "cargo"
-    directory: "examples/html-py-ever"
-    schedule:
-      interval: "monthly"
-    groups:
-      deps:
-        patterns:
-          - "*"
-
-  - package-ecosystem: "cargo"
-    directory: "examples/namespace_package"
-    schedule:
-      interval: "monthly"
-    groups:
-      deps:
-        patterns:
-          - "*"
-
-  - package-ecosystem: "cargo"
-    directory: "examples/rust_with_cffi"
+    directories:
+      - "examples/*"
     schedule:
       interval: "monthly"
     groups:
diff -pruN 1.9.0+dfsg-3/.github/workflows/ci.yml 1.12.0+dfsg-1/.github/workflows/ci.yml
--- 1.9.0+dfsg-3/.github/workflows/ci.yml	2024-02-24 14:14:27.000000000 +0000
+++ 1.12.0+dfsg-1/.github/workflows/ci.yml	2025-08-29 18:17:36.000000000 +0000
@@ -9,13 +9,17 @@ concurrency:
   group: ${{ github.workflow }}-${{ github.ref_name }}-${{ github.event.pull_request.number || github.sha }}
   cancel-in-progress: true
 
+# Setting a fixed target dir ensures that all builds of examples re-use the same common dependencies
+env:
+  CARGO_TARGET_DIR: ${{ github.workspace }}/target
+
 jobs:
   ruff:
     runs-on: "ubuntu-latest"
     steps:
       - uses: actions/checkout@v4
 
-      - name: Set up Python ${{ matrix.python-version }}
+      - name: Set up Python
         uses: actions/setup-python@v5
         with:
           python-version: "3.x"
@@ -29,7 +33,7 @@ jobs:
     steps:
       - uses: actions/checkout@v4
 
-      - name: Set up Python ${{ matrix.python-version }}
+      - name: Set up Python
         uses: actions/setup-python@v5
         with:
           python-version: "3.x"
@@ -43,7 +47,7 @@ jobs:
     steps:
       - uses: actions/checkout@v4
 
-      - name: Set up Python ${{ matrix.python-version }}
+      - name: Set up Python
         uses: actions/setup-python@v5
         with:
           python-version: "3.x"
@@ -56,23 +60,62 @@ jobs:
       - run: nox -s test
 
   build:
-    name:  ${{ matrix.python-version }} ${{ matrix.platform.os }}-${{ matrix.platform.python-architecture }}
+    name: ${{ matrix.python-version }} ${{ matrix.platform.os }}-${{ matrix.platform.python-architecture }}
     runs-on: ${{ matrix.platform.os }}
     strategy:
       # If one platform fails, allow the rest to keep testing if `CI-no-fail-fast` label is present
       fail-fast: ${{ !contains(github.event.pull_request.labels.*.name, 'CI-no-fail-fast') }}
       matrix:
-        python-version: ["3.8", "3.9", "3.10", "3.11", "3.12", pypy-3.8, pypy-3.9, pypy-3.10]
-        platform: [
-          { os: "macos-latest",   python-architecture: "x64", rust-target: "x86_64-apple-darwin" },
-          { os: "ubuntu-latest", python-architecture: "x64", rust-target: "x86_64-unknown-linux-gnu" },
-          { os: "windows-latest", python-architecture: "x64", rust-target: "x86_64-pc-windows-msvc" },
-        ]
+        python-version:
+          ["3.9", "3.10", "3.11", "3.12", "3.13", "3.13t", pypy-3.10, pypy-3.11]
+        platform:
+          [
+            {
+              os: "macos-latest",
+              python-architecture: "arm64",
+              rust-target: "aarch64-apple-darwin",
+            },
+            {
+              os: "ubuntu-latest",
+              python-architecture: "x64",
+              rust-target: "x86_64-unknown-linux-gnu",
+            },
+            {
+              os: "windows-latest",
+              python-architecture: "x64",
+              rust-target: "x86_64-pc-windows-msvc",
+            },
+          ]
         include:
           # Just test one x86 Windows Python for simplicity
           - python-version: 3.12
-            platform: { os: "windows-latest", python-architecture: "x86", rust-target: "i686-pc-windows-msvc" }
+            platform:
+              {
+                os: "windows-latest",
+                python-architecture: "x86",
+                rust-target: "i686-pc-windows-msvc",
+              }
+          # Just test one x64 macOS Python for simplicity
+          - python-version: 3.12
+            platform:
+              {
+                os: "macos-13",
+                python-architecture: "x64",
+                rust-target: "x86_64-apple-darwin",
+              }
+          # Just test one x64 macOS Python for simplicity
+        exclude:
+          # macOS arm doesn't have Python builds before 3.10
+          - python-version: 3.9
+            platform:
+              {
+                os: "macos-latest",
+                python-architecture: "arm64",
+                rust-target: "aarch64-apple-darwin",
+              }
 
+    env:
+      SETUPTOOLS_RUST_CARGO_PROFILE: dev
     steps:
       - uses: actions/checkout@v4
 
@@ -81,16 +124,13 @@ jobs:
         with:
           python-version: ${{ matrix.python-version }}
           architecture: ${{ matrix.platform.python-architecture }}
+          allow-prereleases: true
 
       - name: Install Rust toolchain
         uses: dtolnay/rust-toolchain@stable
         with:
           targets: ${{ matrix.platform.rust-target }}
 
-      - name: Install Rust aarch64-apple-darwin target
-        if: matrix.platform.os == 'macos-latest'
-        run: rustup target add aarch64-apple-darwin
-
       - name: Install test dependencies
         run: pip install --upgrade nox
 
@@ -104,16 +144,16 @@ jobs:
         run: nox -s test-examples
 
       - name: Test macOS universal2
-        if: matrix.platform.os == 'macos-latest' && !startsWith(matrix.python-version, 'pypy')
+        if: ${{ startsWith(matrix.platform.os, 'macos') && !startsWith(matrix.python-version, 'pypy') }}
         shell: bash
         env:
-          DEVELOPER_DIR: /Applications/Xcode.app/Contents/Developer
-          MACOSX_DEPLOYMENT_TARGET: '10.9'
+          MACOSX_DEPLOYMENT_TARGET: "10.9"
           ARCHFLAGS: -arch x86_64 -arch arm64
-          PYO3_CROSS_LIB_DIR: /Applications/Xcode.app/Contents/Developer/Library/Frameworks/Python3.framework/Versions/3.8/lib
         run: |
+          rustup target add aarch64-apple-darwin
+          rustup target add x86_64-apple-darwin
           cd examples/namespace_package
-          pip install build wheel
+          pip install build 'setuptools>=70.1'
           python -m build --no-isolation
           ls -l dist/
           pip install --force-reinstall dist/namespace_package*_universal2.whl
@@ -143,10 +183,6 @@ jobs:
 
       - uses: dtolnay/rust-toolchain@stable
 
-      - name: Install Rust aarch64-apple-darwin target
-        if: matrix.os == 'macos-latest'
-        run: rustup target add aarch64-apple-darwin
-
       - name: Build package
         run: pip install -e .
 
@@ -160,7 +196,7 @@ jobs:
           set -e
           cd examples/rust_with_cffi/
           python --version
-          pip install -U build cffi wheel
+          pip install -U build cffi 'setuptools>=70.1'
           echo -e "[bdist_wheel]\npy_limited_api=cp39" > $DIST_EXTRA_CONFIG
           python -m build --no-isolation
           ls -la dist/
@@ -177,7 +213,6 @@ jobs:
         run: |
           set -e
           cd examples/
-          pip install -U wheel
           python --version
           pip install rust_with_cffi/dist/rust_with_cffi*.whl
           python -c "from rust_with_cffi import rust; assert rust.rust_func() == 14"
@@ -197,12 +232,13 @@ jobs:
       # If one platform fails, allow the rest to keep testing if `CI-no-fail-fast` label is present
       fail-fast: ${{ !contains(github.event.pull_request.labels.*.name, 'CI-no-fail-fast') }}
       matrix:
-        platform: [
-          { arch: "aarch64" },
-          { arch: "armv7" },
-        ]
+        platform: [{ arch: "aarch64" }, { arch: "armv7" }]
     steps:
       - uses: actions/checkout@v4
+      - name: Set up Python
+        uses: actions/setup-python@v5
+        with:
+          python-version: "3.x"
       - uses: docker/setup-qemu-action@v3
       - run: pip install nox
       - run: nox -s test-crossenv -- ${{ matrix.platform.arch }}
@@ -214,44 +250,15 @@ jobs:
       - name: Setup python
         uses: actions/setup-python@v5
         with:
-          python-version: 3.8
+          python-version: "3.x"
       - uses: dtolnay/rust-toolchain@stable
       - name: Install cross
-        uses: taiki-e/install-action@v2
-        with:
-          tool: cross
-      - name: Build package
-        run: pip install -e .
-      - name: Build wheel using cross
-        shell: bash
-        env:
-          CARGO: cross
-          CARGO_BUILD_TARGET: aarch64-unknown-linux-gnu
-          PYO3_CROSS_LIB_DIR: /opt/python/cp38-cp38/lib
-          DIST_EXTRA_CONFIG: /tmp/build-opts.cfg
-        run: |
-          cd examples/namespace_package
-          docker build -t cross-pyo3:aarch64-unknown-linux-gnu .
-          python -m pip install build wheel
-          echo -e "[bdist_wheel]\nplat_name=manylinux2014_aarch64" > $DIST_EXTRA_CONFIG
-          python -m build --no-isolation
-          ls -la dist/
-          unzip -l dist/*.whl  # debug all files inside wheel file
-      - uses: uraimo/run-on-arch-action@v2.7.1
-        name: Install built wheel
-        with:
-          arch: aarch64
-          distro: ubuntu20.04
-          dockerRunArgs: |
-            --volume "${PWD}/examples/namespace_package:/io"
-          install: |
-            apt-get update
-            apt-get install -y --no-install-recommends python3 python3-pip
-            pip3 install -U pip
-          run: |
-            pip3 install namespace_package --no-index --find-links /io/dist/ --force-reinstall
-            python3 -c "from namespace_package import rust; assert rust.rust_func() == 14"
-            python3 -c "from namespace_package import python; assert python.python_func() == 15"
+        # need cross HEAD for https://github.com/cross-rs/cross/issues/1645
+        # will probably be ok to use released cross from 0.3
+        run: cargo install cross --git https://github.com/cross-rs/cross
+      - uses: docker/setup-qemu-action@v3
+      - run: pip install nox
+      - run: nox -s test-cross
 
   test-zigbuild:
     runs-on: ubuntu-latest
@@ -260,7 +267,7 @@ jobs:
       - name: Setup python
         uses: actions/setup-python@v5
         with:
-          python-version: 3.8
+          python-version: "3.10" # must match the ubuntu version in the install, and also the version copied out of the docker image below
       - uses: dtolnay/rust-toolchain@stable
         with:
           targets: aarch64-unknown-linux-gnu
@@ -274,32 +281,33 @@ jobs:
         env:
           CARGO: cargo-zigbuild
           CARGO_BUILD_TARGET: aarch64-unknown-linux-gnu
-          PYO3_CROSS_LIB_DIR: /opt/python/cp38-cp38/lib
+          PYO3_CROSS_LIB_DIR: /opt/python/cp310-cp310/lib
           DIST_EXTRA_CONFIG: /tmp/build-opts.cfg
         run: |
           mkdir -p $PYO3_CROSS_LIB_DIR
-          docker cp -L $(docker create --rm quay.io/pypa/manylinux2014_aarch64:latest):/opt/python/cp38-cp38 /opt/python
+          docker cp -L $(docker create --rm quay.io/pypa/manylinux2014_aarch64:latest):/opt/python/cp310-cp310 /opt/python
           cd examples/namespace_package
           python -m pip install build wheel
           echo -e "[bdist_wheel]\nplat_name=manylinux2014_aarch64" > $DIST_EXTRA_CONFIG
           python -m build --no-isolation
           ls -la dist/
           unzip -l dist/*.whl  # debug all files inside wheel file
-      - uses: uraimo/run-on-arch-action@v2.7.1
+      - uses: uraimo/run-on-arch-action@v3.0.1
         name: Install built wheel
         with:
           arch: aarch64
-          distro: ubuntu20.04
+          distro: ubuntu22.04
           dockerRunArgs: |
             --volume "${PWD}/examples/namespace_package:/io"
           install: |
             apt-get update
-            apt-get install -y --no-install-recommends python3 python3-pip
-            pip3 install -U pip
+            apt-get install -y --no-install-recommends python3 python3-venv python3-pip
           run: |
-            pip3 install namespace_package --no-index --find-links /io/dist/ --force-reinstall
-            python3 -c "from namespace_package import rust; assert rust.rust_func() == 14"
-            python3 -c "from namespace_package import python; assert python.python_func() == 15"
+            python3 -m venv .venv
+            source .venv/bin/activate
+            pip install namespace_package --no-index --find-links /io/dist/ --force-reinstall
+            python -c "from namespace_package import rust; assert rust.rust_func() == 14"
+            python -c "from namespace_package import python; assert python.python_func() == 15"
 
   test-cibuildwheel:
     runs-on: macos-latest
@@ -307,30 +315,42 @@ jobs:
       - uses: actions/checkout@v4
       - uses: dtolnay/rust-toolchain@stable
         with:
-          targets: aarch64-apple-darwin
-      - uses: pypa/cibuildwheel@v2.16.5
+          targets: aarch64-apple-darwin,x86_64-apple-darwin
+      - uses: pypa/cibuildwheel@v3.1.2
         env:
           CIBW_BUILD: cp39-*
           CIBW_BEFORE_BUILD: >
-            pip install -U 'pip>=23.2.1' 'setuptools>=68.0.0' 'wheel>=0.41.2' 'auditwheel>=5.4.0'
+            pip install -U 'pip>=23.2.1' 'setuptools>=70.1.0' 'auditwheel>=5.4.0'
             && pip install -e .
             && pip list
           CIBW_ARCHS_MACOS: "x86_64 universal2 arm64"
           CIBW_BUILD_VERBOSITY: 3
           CIBW_BUILD_FRONTEND: "build; args: --no-isolation"
+          MACOSX_DEPLOYMENT_TARGET: 10.12
         with:
           package-dir: examples/namespace_package
 
   test-mingw:
     runs-on: windows-latest
-    name:  ${{ matrix.python-version }} mingw-${{ matrix.arch }}
+    name: ${{ matrix.python-version }} mingw-${{ matrix.arch }}
     strategy:
       fail-fast: false
       matrix:
-        include: [
-          { msystem: MINGW64, arch: x86_64, path: mingw64, rust_target: x86_64-pc-windows-gnu },
-          { msystem: MINGW32, arch: i686, path: mingw32, rust_target: i686-pc-windows-gnu }
-        ]
+        include:
+          [
+            {
+              msystem: MINGW64,
+              arch: x86_64,
+              path: mingw64,
+              rust_target: x86_64-pc-windows-gnu,
+            },
+            {
+              msystem: MINGW32,
+              arch: i686,
+              path: mingw32,
+              rust_target: i686-pc-windows-gnu,
+            },
+          ]
     steps:
       - uses: actions/checkout@v4
       - name: Install MSys2 and dependencies
@@ -351,16 +371,17 @@ jobs:
 
       - name: Install test dependencies
         shell: msys2 {0}
-        run: python -m pip install --upgrade nox pip wheel
+        run: python -m pip install --upgrade pip nox
 
       - name: Create libpython symlink
         shell: msys2 {0}
-        run: ln -s /${{ matrix.path }}/lib/libpython3.11.dll.a /${{ matrix.path }}/lib/libpython311.dll.a
+        run: |
+          PYTHON_MINOR_VER=$(python -c "import sys; print(sys.version_info.minor)")
+          ln -s /${{ matrix.path }}/lib/libpython3.${PYTHON_MINOR_VER}.dll.a /${{ matrix.path }}/lib/libpython3${PYTHON_MINOR_VER}.dll.a
 
       - name: Test examples
         shell: msys2 {0}
-        run: |
-          PATH="$PATH:/c/Users/runneradmin/.cargo/bin" nox -s test-mingw
+        run: PATH="$PATH:/c/Users/runneradmin/.cargo/bin" nox -s test-examples
 
   test-emscripten:
     name: Test Emscripten
diff -pruN 1.9.0+dfsg-3/.readthedocs.yaml 1.12.0+dfsg-1/.readthedocs.yaml
--- 1.9.0+dfsg-3/.readthedocs.yaml	2024-02-24 14:14:27.000000000 +0000
+++ 1.12.0+dfsg-1/.readthedocs.yaml	2025-08-29 18:17:36.000000000 +0000
@@ -10,3 +10,6 @@ python:
     - requirements: docs/requirements.txt
     - method: pip
       path: .
+
+sphinx:
+  configuration: docs/conf.py
diff -pruN 1.9.0+dfsg-3/CHANGELOG.md 1.12.0+dfsg-1/CHANGELOG.md
--- 1.9.0+dfsg-3/CHANGELOG.md	2024-02-24 14:14:27.000000000 +0000
+++ 1.12.0+dfsg-1/CHANGELOG.md	2025-08-29 18:17:36.000000000 +0000
@@ -1,5 +1,36 @@
 # Changelog
 
+## 1.12.0 (2025-08-29)
+- Set `PYO3_BUILD_EXTENSION_MODULE` environment variable when building PyO3 extensions. [#540](https://github.com/PyO3/setuptools-rust/pull/540)
+
+## 1.11.1 (2025-04-04)
+### Fixed
+- Fix finding cargo artifacts when filenames are empty. [#521](https://github.com/PyO3/setuptools-rust/pull/521)
+
+## 1.11.0 (2025-03-14)
+### Packaging
+- Drop support for Python 3.8. [#479](https://github.com/PyO3/setuptools-rust/pull/479)
+- Support free-threaded Python. [#502](https://github.com/PyO3/setuptools-rust/pull/502)
+- Support adding custom env vars. [#504](https://github.com/PyO3/setuptools-rust/pull/504)
+
+## 1.10.2 (2024-10-02)
+### Fixed
+- Fix deprecation warning from use of `wheel.bdist_wheel`.
+
+## 1.10.1 (2024-08-04)
+### Fixed
+- Fix regression in 1.10.0 where editable builds would be built in release mode
+
+## 1.10.0 (2024-08-03)
+### Packaging
+- Extend macOS build flags to iOS, tvOS and watchOS. [#436](https://github.com/PyO3/setuptools-rust/pull/436)
+- Support Python 3.13. [#446](https://github.com/PyO3/setuptools-rust/pull/446)
+
+### Changed
+ - Add `SETUPTOOLS_RUST_PEP517_USE_BASE_PYTHON` environment variable to use the base interpreter path when running inside a virtual environment to avoid recompilation when switching between virtual environments. [#429](https://github.com/PyO3/setuptools-rust/pull/429)
+ - Delay import of dependencies until use to avoid import errors during a partially complete install when multiple packages are installing at once. [#437](https://github.com/PyO3/setuptools-rust/pull/437)
+ - Deprecate `--build-temp` argument to `build_rust` command (it does nothing). [#457](https://github.com/PyO3/setuptools-rust/pull/457)
+
 ## 1.9.0 (2024-02-24)
 ### Changed
 - Deprecate `py_limited_api` option to `RustExtension` in favour of always using `"auto"` to configure this from `bdist_wheel`. [#410](https://github.com/PyO3/setuptools-rust/pull/410)
diff -pruN 1.9.0+dfsg-3/README.md 1.12.0+dfsg-1/README.md
--- 1.9.0+dfsg-3/README.md	2024-02-24 14:14:27.000000000 +0000
+++ 1.12.0+dfsg-1/README.md	2025-08-29 18:17:36.000000000 +0000
@@ -69,7 +69,7 @@ version = "0.1.0"
 edition = "2021"
 
 [dependencies]
-pyo3 = "0.20.3"
+pyo3 = "0.25"
 
 [lib]
 name = "_lib"  # private module to be nested into Python package,
@@ -107,6 +107,12 @@ python
 # ... better write some tests with pytest ...
 ```
 
+## Environment variables for configuration
+
+As well as all [environment variables supported by Cargo](https://doc.rust-lang.org/cargo/reference/environment-variables.html#environment-variables-cargo-reads), `setuptools-rust` also supports the following:
+
+- `SETUPTOOLS_RUST_CARGO_PROFILE`: used to override the profile of the Rust build. Defaults to `release`, e.g. set to `dev` to do a debug build.
+
 ## Next steps and final remarks
 
 - When you are ready to distribute your project, have a look on
diff -pruN 1.9.0+dfsg-3/debian/changelog 1.12.0+dfsg-1/debian/changelog
--- 1.9.0+dfsg-3/debian/changelog	2025-01-19 00:06:11.000000000 +0000
+++ 1.12.0+dfsg-1/debian/changelog	2025-08-30 14:39:19.000000000 +0000
@@ -1,3 +1,18 @@
+python-setuptools-rust (1.12.0+dfsg-1) unstable; urgency=medium
+
+  * Team upload.
+  * New upstream version.
+  * Drop obsolete Priority and Rules-Requires-Root fields.
+
+ -- Andrey Rakhmatullin <wrar@debian.org>  Sat, 30 Aug 2025 19:39:19 +0500
+
+python-setuptools-rust (1.9.0+dfsg-4) unstable; urgency=medium
+
+  * Team upload.
+  * Drop build-dep on python3-tomli
+
+ -- Alexandre Detiste <tchet@debian.org>  Mon, 28 Jul 2025 15:23:52 +0200
+
 python-setuptools-rust (1.9.0+dfsg-3) unstable; urgency=medium
 
   * Team upload.
diff -pruN 1.9.0+dfsg-3/debian/control 1.12.0+dfsg-1/debian/control
--- 1.9.0+dfsg-3/debian/control	2025-01-19 00:02:23.000000000 +0000
+++ 1.12.0+dfsg-1/debian/control	2025-08-30 14:39:19.000000000 +0000
@@ -1,5 +1,7 @@
-Rules-Requires-Root: no
-Standards-Version: 4.6.2
+Source: python-setuptools-rust
+Maintainer: Debian Python Team <team+python@tracker.debian.org>
+Uploaders: Jelmer Vernooĳ <jelmer@debian.org>
+Section: python
 Build-Depends:
  debhelper-compat (= 13),
  dh-sequence-python3,
@@ -10,20 +12,15 @@ Build-Depends:
  python3-setuptools (>= 46.1),
  python3-setuptools-scm (>= 3.4.3),
  python3-typing-extensions (>= 3.7.4.3),
- python3-tomli
-Testsuite: autopkgtest-pkg-pybuild
-Source: python-setuptools-rust
-Homepage: https://github.com/PyO3/setuptools-rust
-Priority: optional
-Section: python
-Uploaders: Jelmer Vernooĳ <jelmer@debian.org>
-Maintainer: Debian Python Team <team+python@tracker.debian.org>
+Standards-Version: 4.7.2
 Vcs-Git: https://salsa.debian.org/python-team/packages/python-setuptools-rust.git
 Vcs-Browser: https://salsa.debian.org/python-team/packages/python-setuptools-rust
+Homepage: https://github.com/PyO3/setuptools-rust
+Testsuite: autopkgtest-pkg-pybuild
 
 Package: python3-setuptools-rust
-Depends: python3-setuptools, ${misc:Depends}, ${python3:Depends}, rustc, cargo
 Architecture: all
+Depends: python3-setuptools, ${misc:Depends}, ${python3:Depends}, rustc, cargo
 Description: Setuptools Rust extension plugin
  setuptools-rust is a plugin for setuptools to build Rust Python
  extensions implemented with PyO3 or rust-cpython.
diff -pruN 1.9.0+dfsg-3/debian/patches/do-not-generate-a-dep-on-python3-pkg-resources.patch 1.12.0+dfsg-1/debian/patches/do-not-generate-a-dep-on-python3-pkg-resources.patch
--- 1.9.0+dfsg-3/debian/patches/do-not-generate-a-dep-on-python3-pkg-resources.patch	2025-01-19 00:06:11.000000000 +0000
+++ 1.12.0+dfsg-1/debian/patches/do-not-generate-a-dep-on-python3-pkg-resources.patch	2025-08-30 14:39:19.000000000 +0000
@@ -1,10 +1,10 @@
 --- a/pyproject.toml
 +++ b/pyproject.toml
-@@ -24,7 +24,6 @@
+@@ -24,7 +24,6 @@ classifiers = [
  ]
  
  dependencies = [
 -    "setuptools>=62.4",
      "semantic_version>=2.8.2,<3",
-     'tomli>=1.2.1; python_version<"3.11"'
  ]
+ 
diff -pruN 1.9.0+dfsg-3/docs/requirements.txt 1.12.0+dfsg-1/docs/requirements.txt
--- 1.9.0+dfsg-3/docs/requirements.txt	2024-02-24 14:14:27.000000000 +0000
+++ 1.12.0+dfsg-1/docs/requirements.txt	2025-08-29 18:17:36.000000000 +0000
@@ -1,4 +1,4 @@
-Sphinx==7.2.6
-sphinx-autodoc-typehints==1.25.3
-furo==2024.1.29
-myst-parser==2.0.0
+Sphinx==8.2.3
+sphinx-autodoc-typehints==3.1.0
+furo==2025.7.19
+myst-parser==4.0.1
diff -pruN 1.9.0+dfsg-3/emscripten/.ruff.toml 1.12.0+dfsg-1/emscripten/.ruff.toml
--- 1.9.0+dfsg-3/emscripten/.ruff.toml	1970-01-01 00:00:00.000000000 +0000
+++ 1.12.0+dfsg-1/emscripten/.ruff.toml	2025-08-29 18:17:36.000000000 +0000
@@ -0,0 +1,2 @@
+[lint]
+extend-ignore = ["TID251"]
diff -pruN 1.9.0+dfsg-3/examples/hello-world/Cargo.lock 1.12.0+dfsg-1/examples/hello-world/Cargo.lock
--- 1.9.0+dfsg-3/examples/hello-world/Cargo.lock	2024-02-24 14:14:27.000000000 +0000
+++ 1.12.0+dfsg-1/examples/hello-world/Cargo.lock	2025-08-29 18:17:36.000000000 +0000
@@ -1,30 +1,18 @@
 # This file is automatically @generated by Cargo.
 # It is not intended for manual editing.
-version = 3
+version = 4
 
 [[package]]
 name = "autocfg"
-version = "1.1.0"
+version = "1.3.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
-
-[[package]]
-name = "bitflags"
-version = "1.3.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
-
-[[package]]
-name = "cfg-if"
-version = "1.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
+checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0"
 
 [[package]]
 name = "heck"
-version = "0.4.1"
+version = "0.5.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8"
+checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
 
 [[package]]
 name = "hello-world"
@@ -35,63 +23,30 @@ dependencies = [
 
 [[package]]
 name = "indoc"
-version = "2.0.4"
+version = "2.0.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1e186cfbae8084e513daff4240b4797e342f988cecda4fb6c939150f96315fd8"
+checksum = "b248f5224d1d606005e02c97f5aa4e88eeb230488bcc03bc9ca4d7991399f2b5"
 
 [[package]]
 name = "libc"
-version = "0.2.147"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3"
-
-[[package]]
-name = "lock_api"
-version = "0.4.10"
+version = "0.2.154"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c1cc9717a20b1bb222f333e6a92fd32f7d8a18ddc5a3191a11af45dcbf4dcd16"
-dependencies = [
- "autocfg",
- "scopeguard",
-]
+checksum = "ae743338b92ff9146ce83992f766a31066a91a8c84a45e0e9f21e7cf6de6d346"
 
 [[package]]
 name = "memoffset"
-version = "0.9.0"
+version = "0.9.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c"
+checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a"
 dependencies = [
  "autocfg",
 ]
 
 [[package]]
 name = "once_cell"
-version = "1.18.0"
+version = "1.19.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d"
-
-[[package]]
-name = "parking_lot"
-version = "0.12.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f"
-dependencies = [
- "lock_api",
- "parking_lot_core",
-]
-
-[[package]]
-name = "parking_lot_core"
-version = "0.9.8"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "93f00c865fe7cabf650081affecd3871070f26767e7b2070a3ffae14c654b447"
-dependencies = [
- "cfg-if",
- "libc",
- "redox_syscall",
- "smallvec",
- "windows-targets",
-]
+checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92"
 
 [[package]]
 name = "portable-atomic"
@@ -101,24 +56,23 @@ checksum = "7170ef9988bc169ba16dd36a7fa0
 
 [[package]]
 name = "proc-macro2"
-version = "1.0.66"
+version = "1.0.82"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9"
+checksum = "8ad3d49ab951a01fbaafe34f2ec74122942fe18a3f9814c3268f1bb72042131b"
 dependencies = [
  "unicode-ident",
 ]
 
 [[package]]
 name = "pyo3"
-version = "0.20.3"
+version = "0.25.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "53bdbb96d49157e65d45cc287af5f32ffadd5f4761438b527b055fb0d4bb8233"
+checksum = "8970a78afe0628a3e3430376fc5fd76b6b45c4d43360ffd6cdd40bdde72b682a"
 dependencies = [
- "cfg-if",
  "indoc",
  "libc",
  "memoffset",
- "parking_lot",
+ "once_cell",
  "portable-atomic",
  "pyo3-build-config",
  "pyo3-ffi",
@@ -128,9 +82,9 @@ dependencies = [
 
 [[package]]
 name = "pyo3-build-config"
-version = "0.20.3"
+version = "0.25.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "deaa5745de3f5231ce10517a1f5dd97d53e5a2fd77aa6b5842292085831d48d7"
+checksum = "458eb0c55e7ece017adeba38f2248ff3ac615e53660d7c71a238d7d2a01c7598"
 dependencies = [
  "once_cell",
  "target-lexicon",
@@ -138,9 +92,9 @@ dependencies = [
 
 [[package]]
 name = "pyo3-ffi"
-version = "0.20.3"
+version = "0.25.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "62b42531d03e08d4ef1f6e85a2ed422eb678b8cd62b762e53891c05faf0d4afa"
+checksum = "7114fe5457c61b276ab77c5055f206295b812608083644a5c5b2640c3102565c"
 dependencies = [
  "libc",
  "pyo3-build-config",
@@ -148,9 +102,9 @@ dependencies = [
 
 [[package]]
 name = "pyo3-macros"
-version = "0.20.3"
+version = "0.25.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7305c720fa01b8055ec95e484a6eca7a83c841267f0dd5280f0c8b8551d2c158"
+checksum = "a8725c0a622b374d6cb051d11a0983786448f7785336139c3c94f5aa6bef7e50"
 dependencies = [
  "proc-macro2",
  "pyo3-macros-backend",
@@ -160,9 +114,9 @@ dependencies = [
 
 [[package]]
 name = "pyo3-macros-backend"
-version = "0.20.3"
+version = "0.25.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7c7e9b68bb9c3149c5b0cade5d07f953d6d125eb4337723c4ccdb665f1f96185"
+checksum = "4109984c22491085343c05b0dbc54ddc405c3cf7b4374fc533f5c3313a572ccc"
 dependencies = [
  "heck",
  "proc-macro2",
@@ -173,39 +127,18 @@ dependencies = [
 
 [[package]]
 name = "quote"
-version = "1.0.32"
+version = "1.0.36"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "50f3b39ccfb720540debaa0164757101c08ecb8d326b15358ce76a62c7e85965"
+checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7"
 dependencies = [
  "proc-macro2",
 ]
 
 [[package]]
-name = "redox_syscall"
-version = "0.3.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29"
-dependencies = [
- "bitflags",
-]
-
-[[package]]
-name = "scopeguard"
-version = "1.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
-
-[[package]]
-name = "smallvec"
-version = "1.11.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "62bb4feee49fdd9f707ef802e22365a35de4b7b299de4763d44bfea899442ff9"
-
-[[package]]
 name = "syn"
-version = "2.0.32"
+version = "2.0.61"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "239814284fd6f1a4ffe4ca893952cdd93c224b6a1571c9a9eadd670295c0c9e2"
+checksum = "c993ed8ccba56ae856363b1845da7266a7cb78e1d146c8a32d54b45a8b831fc9"
 dependencies = [
  "proc-macro2",
  "quote",
@@ -214,75 +147,18 @@ dependencies = [
 
 [[package]]
 name = "target-lexicon"
-version = "0.12.11"
+version = "0.13.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9d0e916b1148c8e263850e1ebcbd046f333e0683c724876bb0da63ea4373dc8a"
+checksum = "e502f78cdbb8ba4718f566c418c52bc729126ffd16baee5baa718cf25dd5a69a"
 
 [[package]]
 name = "unicode-ident"
-version = "1.0.11"
+version = "1.0.12"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c"
+checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b"
 
 [[package]]
 name = "unindent"
 version = "0.2.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "c7de7d73e1754487cb58364ee906a499937a0dfabd86bcb980fa99ec8c8fa2ce"
-
-[[package]]
-name = "windows-targets"
-version = "0.48.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "05d4b17490f70499f20b9e791dcf6a299785ce8af4d709018206dc5b4953e95f"
-dependencies = [
- "windows_aarch64_gnullvm",
- "windows_aarch64_msvc",
- "windows_i686_gnu",
- "windows_i686_msvc",
- "windows_x86_64_gnu",
- "windows_x86_64_gnullvm",
- "windows_x86_64_msvc",
-]
-
-[[package]]
-name = "windows_aarch64_gnullvm"
-version = "0.48.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc"
-
-[[package]]
-name = "windows_aarch64_msvc"
-version = "0.48.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3"
-
-[[package]]
-name = "windows_i686_gnu"
-version = "0.48.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241"
-
-[[package]]
-name = "windows_i686_msvc"
-version = "0.48.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00"
-
-[[package]]
-name = "windows_x86_64_gnu"
-version = "0.48.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1"
-
-[[package]]
-name = "windows_x86_64_gnullvm"
-version = "0.48.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953"
-
-[[package]]
-name = "windows_x86_64_msvc"
-version = "0.48.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a"
diff -pruN 1.9.0+dfsg-3/examples/hello-world/Cargo.toml 1.12.0+dfsg-1/examples/hello-world/Cargo.toml
--- 1.9.0+dfsg-3/examples/hello-world/Cargo.toml	2024-02-24 14:14:27.000000000 +0000
+++ 1.12.0+dfsg-1/examples/hello-world/Cargo.toml	2025-08-29 18:17:36.000000000 +0000
@@ -6,7 +6,7 @@ edition = "2021"
 # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
 
 [dependencies]
-pyo3 = "0.20.3"
+pyo3 = "0.25"
 
 [profile.release-lto]
 inherits = "release"
diff -pruN 1.9.0+dfsg-3/examples/hello-world/noxfile.py 1.12.0+dfsg-1/examples/hello-world/noxfile.py
--- 1.9.0+dfsg-3/examples/hello-world/noxfile.py	2024-02-24 14:14:27.000000000 +0000
+++ 1.12.0+dfsg-1/examples/hello-world/noxfile.py	2025-08-29 18:17:36.000000000 +0000
@@ -7,7 +7,7 @@ SETUPTOOLS_RUST = dirname(dirname(dirnam
 
 @nox.session()
 def test(session: nox.Session):
-    session.install(SETUPTOOLS_RUST, "wheel", "build", "pytest")
+    session.install(SETUPTOOLS_RUST, "build", "pytest")
     # Ensure build works as intended
     session.install("--no-build-isolation", ".")
     # Test Rust binary
diff -pruN 1.9.0+dfsg-3/examples/hello-world/rust/lib.rs 1.12.0+dfsg-1/examples/hello-world/rust/lib.rs
--- 1.9.0+dfsg-3/examples/hello-world/rust/lib.rs	2024-02-24 14:14:27.000000000 +0000
+++ 1.12.0+dfsg-1/examples/hello-world/rust/lib.rs	2025-08-29 18:17:36.000000000 +0000
@@ -1,33 +1,31 @@
 use pyo3::prelude::*;
-use std::env;
-
-/// Formats the sum of two numbers as string.
-#[pyfunction]
-fn sum_as_string(a: usize, b: usize) -> PyResult<String> {
-    Ok((a + b).to_string())
-}
-
-/// Calls Python (see https://pyo3.rs for details)
-#[pyfunction]
-fn demo(py: Python) -> PyResult<()> {
-    let argv = env::args().collect::<Vec<_>>();
-    println!("argv = {:?}", argv);
-    // argv[0]: Python path, argv[1]: program name, argv[2..]: given args
-
-    let numbers: Vec<i32> = argv[2..].iter().map(|s| s.parse().unwrap()).collect();
-
-    let python_sum = PyModule::import(py, "builtins")?.getattr("sum")?;
-    let total: i32 = python_sum.call1((numbers,))?.extract()?;
-    println!("sum({}) = {:?}", argv[2..].join(", "), total);
-    Ok(())
-}
 
 /// A Python module implemented in Rust. The name of this function must match
 /// the `lib.name` setting in the `Cargo.toml`, else Python will not be able to
 /// import the module.
 #[pymodule]
-fn _lib(_py: Python<'_>, m: &PyModule) -> PyResult<()> {
-    m.add_function(wrap_pyfunction!(sum_as_string, m)?)?;
-    m.add_function(wrap_pyfunction!(demo, m)?)?;
-    Ok(())
+mod _lib {
+    use pyo3::prelude::*;
+    use std::env;
+
+    /// Formats the sum of two numbers as string.
+    #[pyfunction]
+    fn sum_as_string(a: usize, b: usize) -> PyResult<String> {
+        Ok((a + b).to_string())
+    }
+
+    /// Calls Python (see https://pyo3.rs for details)
+    #[pyfunction]
+    fn demo(py: Python) -> PyResult<()> {
+        let argv = env::args().collect::<Vec<_>>();
+        println!("argv = {:?}", argv);
+        // argv[0]: Python path, argv[1]: program name, argv[2..]: given args
+
+        let numbers: Vec<i32> = argv[2..].iter().map(|s| s.parse().unwrap()).collect();
+
+        let python_sum = PyModule::import(py, "builtins")?.getattr("sum")?;
+        let total: i32 = python_sum.call1((numbers,))?.extract()?;
+        println!("sum({}) = {:?}", argv[2..].join(", "), total);
+        Ok(())
+    }
 }
diff -pruN 1.9.0+dfsg-3/examples/hello-world-script/noxfile.py 1.12.0+dfsg-1/examples/hello-world-script/noxfile.py
--- 1.9.0+dfsg-3/examples/hello-world-script/noxfile.py	2024-02-24 14:14:27.000000000 +0000
+++ 1.12.0+dfsg-1/examples/hello-world-script/noxfile.py	2025-08-29 18:17:36.000000000 +0000
@@ -7,7 +7,7 @@ SETUPTOOLS_RUST = dirname(dirname(dirnam
 
 @nox.session()
 def test(session: nox.Session):
-    session.install(SETUPTOOLS_RUST, "wheel")
+    session.install(SETUPTOOLS_RUST)
     # Ensure build uses version of setuptools-rust under development
     session.install("--no-build-isolation", ".")
     # Test Rust binary
diff -pruN 1.9.0+dfsg-3/examples/hello-world-script/pyproject.toml 1.12.0+dfsg-1/examples/hello-world-script/pyproject.toml
--- 1.9.0+dfsg-3/examples/hello-world-script/pyproject.toml	2024-02-24 14:14:27.000000000 +0000
+++ 1.12.0+dfsg-1/examples/hello-world-script/pyproject.toml	2025-08-29 18:17:36.000000000 +0000
@@ -1,5 +1,5 @@
 [build-system]
-requires = ["setuptools", "wheel", "setuptools-rust"]
+requires = ["setuptools", "setuptools-rust"]
 build-backend = "setuptools.build_meta"
 
 [project]
diff -pruN 1.9.0+dfsg-3/examples/hello-world-setuppy/Cargo.lock 1.12.0+dfsg-1/examples/hello-world-setuppy/Cargo.lock
--- 1.9.0+dfsg-3/examples/hello-world-setuppy/Cargo.lock	2024-02-24 14:14:27.000000000 +0000
+++ 1.12.0+dfsg-1/examples/hello-world-setuppy/Cargo.lock	2025-08-29 18:17:36.000000000 +0000
@@ -1,30 +1,18 @@
 # This file is automatically @generated by Cargo.
 # It is not intended for manual editing.
-version = 3
+version = 4
 
 [[package]]
 name = "autocfg"
-version = "1.1.0"
+version = "1.3.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
-
-[[package]]
-name = "bitflags"
-version = "1.3.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
-
-[[package]]
-name = "cfg-if"
-version = "1.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
+checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0"
 
 [[package]]
 name = "heck"
-version = "0.4.1"
+version = "0.5.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8"
+checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
 
 [[package]]
 name = "hello-world-setuppy"
@@ -35,63 +23,30 @@ dependencies = [
 
 [[package]]
 name = "indoc"
-version = "2.0.4"
+version = "2.0.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1e186cfbae8084e513daff4240b4797e342f988cecda4fb6c939150f96315fd8"
+checksum = "b248f5224d1d606005e02c97f5aa4e88eeb230488bcc03bc9ca4d7991399f2b5"
 
 [[package]]
 name = "libc"
-version = "0.2.147"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3"
-
-[[package]]
-name = "lock_api"
-version = "0.4.10"
+version = "0.2.154"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c1cc9717a20b1bb222f333e6a92fd32f7d8a18ddc5a3191a11af45dcbf4dcd16"
-dependencies = [
- "autocfg",
- "scopeguard",
-]
+checksum = "ae743338b92ff9146ce83992f766a31066a91a8c84a45e0e9f21e7cf6de6d346"
 
 [[package]]
 name = "memoffset"
-version = "0.9.0"
+version = "0.9.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c"
+checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a"
 dependencies = [
  "autocfg",
 ]
 
 [[package]]
 name = "once_cell"
-version = "1.18.0"
+version = "1.19.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d"
-
-[[package]]
-name = "parking_lot"
-version = "0.12.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f"
-dependencies = [
- "lock_api",
- "parking_lot_core",
-]
-
-[[package]]
-name = "parking_lot_core"
-version = "0.9.8"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "93f00c865fe7cabf650081affecd3871070f26767e7b2070a3ffae14c654b447"
-dependencies = [
- "cfg-if",
- "libc",
- "redox_syscall",
- "smallvec",
- "windows-targets",
-]
+checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92"
 
 [[package]]
 name = "portable-atomic"
@@ -101,24 +56,23 @@ checksum = "7170ef9988bc169ba16dd36a7fa0
 
 [[package]]
 name = "proc-macro2"
-version = "1.0.66"
+version = "1.0.82"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9"
+checksum = "8ad3d49ab951a01fbaafe34f2ec74122942fe18a3f9814c3268f1bb72042131b"
 dependencies = [
  "unicode-ident",
 ]
 
 [[package]]
 name = "pyo3"
-version = "0.20.3"
+version = "0.25.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "53bdbb96d49157e65d45cc287af5f32ffadd5f4761438b527b055fb0d4bb8233"
+checksum = "8970a78afe0628a3e3430376fc5fd76b6b45c4d43360ffd6cdd40bdde72b682a"
 dependencies = [
- "cfg-if",
  "indoc",
  "libc",
  "memoffset",
- "parking_lot",
+ "once_cell",
  "portable-atomic",
  "pyo3-build-config",
  "pyo3-ffi",
@@ -128,9 +82,9 @@ dependencies = [
 
 [[package]]
 name = "pyo3-build-config"
-version = "0.20.3"
+version = "0.25.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "deaa5745de3f5231ce10517a1f5dd97d53e5a2fd77aa6b5842292085831d48d7"
+checksum = "458eb0c55e7ece017adeba38f2248ff3ac615e53660d7c71a238d7d2a01c7598"
 dependencies = [
  "once_cell",
  "target-lexicon",
@@ -138,9 +92,9 @@ dependencies = [
 
 [[package]]
 name = "pyo3-ffi"
-version = "0.20.3"
+version = "0.25.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "62b42531d03e08d4ef1f6e85a2ed422eb678b8cd62b762e53891c05faf0d4afa"
+checksum = "7114fe5457c61b276ab77c5055f206295b812608083644a5c5b2640c3102565c"
 dependencies = [
  "libc",
  "pyo3-build-config",
@@ -148,9 +102,9 @@ dependencies = [
 
 [[package]]
 name = "pyo3-macros"
-version = "0.20.3"
+version = "0.25.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7305c720fa01b8055ec95e484a6eca7a83c841267f0dd5280f0c8b8551d2c158"
+checksum = "a8725c0a622b374d6cb051d11a0983786448f7785336139c3c94f5aa6bef7e50"
 dependencies = [
  "proc-macro2",
  "pyo3-macros-backend",
@@ -160,9 +114,9 @@ dependencies = [
 
 [[package]]
 name = "pyo3-macros-backend"
-version = "0.20.3"
+version = "0.25.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7c7e9b68bb9c3149c5b0cade5d07f953d6d125eb4337723c4ccdb665f1f96185"
+checksum = "4109984c22491085343c05b0dbc54ddc405c3cf7b4374fc533f5c3313a572ccc"
 dependencies = [
  "heck",
  "proc-macro2",
@@ -173,39 +127,18 @@ dependencies = [
 
 [[package]]
 name = "quote"
-version = "1.0.33"
+version = "1.0.36"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae"
+checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7"
 dependencies = [
  "proc-macro2",
 ]
 
 [[package]]
-name = "redox_syscall"
-version = "0.3.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29"
-dependencies = [
- "bitflags",
-]
-
-[[package]]
-name = "scopeguard"
-version = "1.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
-
-[[package]]
-name = "smallvec"
-version = "1.11.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "62bb4feee49fdd9f707ef802e22365a35de4b7b299de4763d44bfea899442ff9"
-
-[[package]]
 name = "syn"
-version = "2.0.32"
+version = "2.0.61"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "239814284fd6f1a4ffe4ca893952cdd93c224b6a1571c9a9eadd670295c0c9e2"
+checksum = "c993ed8ccba56ae856363b1845da7266a7cb78e1d146c8a32d54b45a8b831fc9"
 dependencies = [
  "proc-macro2",
  "quote",
@@ -214,75 +147,18 @@ dependencies = [
 
 [[package]]
 name = "target-lexicon"
-version = "0.12.11"
+version = "0.13.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9d0e916b1148c8e263850e1ebcbd046f333e0683c724876bb0da63ea4373dc8a"
+checksum = "e502f78cdbb8ba4718f566c418c52bc729126ffd16baee5baa718cf25dd5a69a"
 
 [[package]]
 name = "unicode-ident"
-version = "1.0.11"
+version = "1.0.12"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c"
+checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b"
 
 [[package]]
 name = "unindent"
 version = "0.2.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "c7de7d73e1754487cb58364ee906a499937a0dfabd86bcb980fa99ec8c8fa2ce"
-
-[[package]]
-name = "windows-targets"
-version = "0.48.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c"
-dependencies = [
- "windows_aarch64_gnullvm",
- "windows_aarch64_msvc",
- "windows_i686_gnu",
- "windows_i686_msvc",
- "windows_x86_64_gnu",
- "windows_x86_64_gnullvm",
- "windows_x86_64_msvc",
-]
-
-[[package]]
-name = "windows_aarch64_gnullvm"
-version = "0.48.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8"
-
-[[package]]
-name = "windows_aarch64_msvc"
-version = "0.48.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc"
-
-[[package]]
-name = "windows_i686_gnu"
-version = "0.48.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e"
-
-[[package]]
-name = "windows_i686_msvc"
-version = "0.48.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406"
-
-[[package]]
-name = "windows_x86_64_gnu"
-version = "0.48.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e"
-
-[[package]]
-name = "windows_x86_64_gnullvm"
-version = "0.48.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc"
-
-[[package]]
-name = "windows_x86_64_msvc"
-version = "0.48.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538"
diff -pruN 1.9.0+dfsg-3/examples/hello-world-setuppy/Cargo.toml 1.12.0+dfsg-1/examples/hello-world-setuppy/Cargo.toml
--- 1.9.0+dfsg-3/examples/hello-world-setuppy/Cargo.toml	2024-02-24 14:14:27.000000000 +0000
+++ 1.12.0+dfsg-1/examples/hello-world-setuppy/Cargo.toml	2025-08-29 18:17:36.000000000 +0000
@@ -4,7 +4,7 @@ version = "0.1.0"
 edition = "2021"
 
 [dependencies]
-pyo3 = "0.20.3"
+pyo3 = "0.25"
 
 [lib]
 # See https://github.com/PyO3/pyo3 for details
diff -pruN 1.9.0+dfsg-3/examples/hello-world-setuppy/noxfile.py 1.12.0+dfsg-1/examples/hello-world-setuppy/noxfile.py
--- 1.9.0+dfsg-3/examples/hello-world-setuppy/noxfile.py	2024-02-24 14:14:27.000000000 +0000
+++ 1.12.0+dfsg-1/examples/hello-world-setuppy/noxfile.py	2025-08-29 18:17:36.000000000 +0000
@@ -7,7 +7,7 @@ SETUPTOOLS_RUST = dirname(dirname(dirnam
 
 @nox.session()
 def test(session: nox.Session):
-    session.install(SETUPTOOLS_RUST, "wheel")
+    session.install(SETUPTOOLS_RUST)
     # Ensure build uses version of setuptools-rust under development
     session.install("--no-build-isolation", ".")
     # Test Rust binary
diff -pruN 1.9.0+dfsg-3/examples/hello-world-setuppy/pyproject.toml 1.12.0+dfsg-1/examples/hello-world-setuppy/pyproject.toml
--- 1.9.0+dfsg-3/examples/hello-world-setuppy/pyproject.toml	2024-02-24 14:14:27.000000000 +0000
+++ 1.12.0+dfsg-1/examples/hello-world-setuppy/pyproject.toml	2025-08-29 18:17:36.000000000 +0000
@@ -1,3 +1,3 @@
 [build-system]
-requires = ["setuptools", "wheel", "setuptools-rust"]
+requires = ["setuptools", "setuptools-rust"]
 build-backend = "setuptools.build_meta"
diff -pruN 1.9.0+dfsg-3/examples/hello-world-setuppy/rust/lib.rs 1.12.0+dfsg-1/examples/hello-world-setuppy/rust/lib.rs
--- 1.9.0+dfsg-3/examples/hello-world-setuppy/rust/lib.rs	2024-02-24 14:14:27.000000000 +0000
+++ 1.12.0+dfsg-1/examples/hello-world-setuppy/rust/lib.rs	2025-08-29 18:17:36.000000000 +0000
@@ -1,16 +1,15 @@
 use pyo3::prelude::*;
 
-/// Formats the sum of two numbers as string.
-#[pyfunction]
-fn sum_as_string(a: usize, b: usize) -> PyResult<String> {
-    Ok((a + b).to_string())
-}
-
 /// A Python module implemented in Rust. The name of this function must match
 /// the `lib.name` setting in the `Cargo.toml`, else Python will not be able to
 /// import the module.
 #[pymodule]
-fn _lib(_py: Python<'_>, m: &PyModule) -> PyResult<()> {
-    m.add_function(wrap_pyfunction!(sum_as_string, m)?)?;
-    Ok(())
+mod _lib {
+    use pyo3::prelude::*;
+
+    /// Formats the sum of two numbers as string.
+    #[pyfunction]
+    fn sum_as_string(a: usize, b: usize) -> PyResult<String> {
+        Ok((a + b).to_string())
+    }
 }
diff -pruN 1.9.0+dfsg-3/examples/html-py-ever/Cargo.lock 1.12.0+dfsg-1/examples/html-py-ever/Cargo.lock
--- 1.9.0+dfsg-3/examples/html-py-ever/Cargo.lock	2024-02-24 14:14:27.000000000 +0000
+++ 1.12.0+dfsg-1/examples/html-py-ever/Cargo.lock	2025-08-29 18:17:36.000000000 +0000
@@ -1,12 +1,12 @@
 # This file is automatically @generated by Cargo.
 # It is not intended for manual editing.
-version = 3
+version = 4
 
 [[package]]
 name = "autocfg"
-version = "1.1.0"
+version = "1.3.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
+checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0"
 
 [[package]]
 name = "bitflags"
@@ -15,10 +15,16 @@ source = "registry+https://github.com/ru
 checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
 
 [[package]]
+name = "bitflags"
+version = "2.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1"
+
+[[package]]
 name = "byteorder"
-version = "1.4.3"
+version = "1.5.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610"
+checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b"
 
 [[package]]
 name = "cfg-if"
@@ -46,17 +52,17 @@ dependencies = [
  "proc-macro2",
  "quote",
  "smallvec",
- "syn 1.0.89",
+ "syn 1.0.109",
 ]
 
 [[package]]
 name = "cssparser-macros"
-version = "0.6.0"
+version = "0.6.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dfae75de57f2b2e85e8768c3ea840fd159c8f33e2b6522c7835b7abac81be16e"
+checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331"
 dependencies = [
  "quote",
- "syn 1.0.89",
+ "syn 2.0.61",
 ]
 
 [[package]]
@@ -69,20 +75,20 @@ dependencies = [
  "proc-macro2",
  "quote",
  "rustc_version",
- "syn 1.0.89",
+ "syn 1.0.109",
 ]
 
 [[package]]
 name = "dtoa"
-version = "0.4.8"
+version = "1.0.9"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "56899898ce76aaf4a0f24d914c97ea6ed976d42fec6ad33fcbb0a1103e07b2b0"
+checksum = "dcbb2bf8e87535c23f7a8a321e364ce21462d0ff10cb6407820e8e96dfff6653"
 
 [[package]]
 name = "dtoa-short"
-version = "0.3.3"
+version = "0.3.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bde03329ae10e79ede66c9ce4dc930aa8599043b0743008548680f25b91502d6"
+checksum = "dbaceec3c6e4211c79e7b1800fb9680527106beb2f9c51904a3210c03a448c74"
 dependencies = [
  "dtoa",
 ]
@@ -114,14 +120,25 @@ checksum = "8fc3cb4d91f53b50155bdcfd23f6
 dependencies = [
  "cfg-if",
  "libc",
- "wasi",
+ "wasi 0.9.0+wasi-snapshot-preview1",
+]
+
+[[package]]
+name = "getrandom"
+version = "0.2.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7"
+dependencies = [
+ "cfg-if",
+ "libc",
+ "wasi 0.11.0+wasi-snapshot-preview1",
 ]
 
 [[package]]
 name = "heck"
-version = "0.4.1"
+version = "0.5.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8"
+checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
 
 [[package]]
 name = "html-py-ever"
@@ -134,32 +151,23 @@ dependencies = [
 
 [[package]]
 name = "html5ever"
-version = "0.25.1"
+version = "0.25.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "aafcf38a1a36118242d29b92e1b08ef84e67e4a5ed06e0a80be20e6a32bfed6b"
+checksum = "e5c13fb08e5d4dfc151ee5e88bae63f7773d61852f3bdc73c9f4b9e1bde03148"
 dependencies = [
  "log",
  "mac",
  "markup5ever",
  "proc-macro2",
  "quote",
- "syn 1.0.89",
+ "syn 1.0.109",
 ]
 
 [[package]]
 name = "indoc"
-version = "2.0.4"
+version = "2.0.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1e186cfbae8084e513daff4240b4797e342f988cecda4fb6c939150f96315fd8"
-
-[[package]]
-name = "instant"
-version = "0.1.12"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c"
-dependencies = [
- "cfg-if",
-]
+checksum = "b248f5224d1d606005e02c97f5aa4e88eeb230488bcc03bc9ca4d7991399f2b5"
 
 [[package]]
 name = "itoa"
@@ -180,34 +188,26 @@ dependencies = [
 ]
 
 [[package]]
-name = "lazy_static"
-version = "1.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
-
-[[package]]
 name = "libc"
-version = "0.2.121"
+version = "0.2.154"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "efaa7b300f3b5fe8eb6bf21ce3895e1751d9665086af2d64b42f19701015ff4f"
+checksum = "ae743338b92ff9146ce83992f766a31066a91a8c84a45e0e9f21e7cf6de6d346"
 
 [[package]]
 name = "lock_api"
-version = "0.4.6"
+version = "0.4.12"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "88943dd7ef4a2e5a4bfa2753aaab3013e34ce2533d1996fb18ef591e315e2b3b"
+checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17"
 dependencies = [
+ "autocfg",
  "scopeguard",
 ]
 
 [[package]]
 name = "log"
-version = "0.4.14"
+version = "0.4.21"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "51b9bbe6c47d51fc3e1a9b945965946b4c44142ab8792c50835a980d362c2710"
-dependencies = [
- "cfg-if",
-]
+checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c"
 
 [[package]]
 name = "mac"
@@ -231,24 +231,24 @@ dependencies = [
 
 [[package]]
 name = "matches"
-version = "0.1.9"
+version = "0.1.10"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f"
+checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5"
 
 [[package]]
 name = "memoffset"
-version = "0.9.0"
+version = "0.9.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c"
+checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a"
 dependencies = [
  "autocfg",
 ]
 
 [[package]]
 name = "new_debug_unreachable"
-version = "1.0.4"
+version = "1.0.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e4a24736216ec316047a1fc4252e27dabb04218aa4a3f37c6e7ddbf1f9782b54"
+checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086"
 
 [[package]]
 name = "nodrop"
@@ -258,33 +258,31 @@ checksum = "72ef4a56884ca558e5ddb05a1d1e
 
 [[package]]
 name = "once_cell"
-version = "1.10.0"
+version = "1.19.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "87f3e037eac156d1775da914196f0f37741a274155e34a0b7e427c35d2a2ecb9"
+checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92"
 
 [[package]]
 name = "parking_lot"
-version = "0.11.2"
+version = "0.12.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99"
+checksum = "7e4af0ca4f6caed20e900d564c242b8e5d4903fdacf31d3daf527b66fe6f42fb"
 dependencies = [
- "instant",
  "lock_api",
  "parking_lot_core",
 ]
 
 [[package]]
 name = "parking_lot_core"
-version = "0.8.5"
+version = "0.9.10"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d76e8e1493bcac0d2766c42737f34458f1c8c50c0d23bcb24ea953affb273216"
+checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8"
 dependencies = [
  "cfg-if",
- "instant",
  "libc",
  "redox_syscall",
  "smallvec",
- "winapi",
+ "windows-targets",
 ]
 
 [[package]]
@@ -304,7 +302,7 @@ version = "0.8.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "cbffee61585b0411840d3ece935cce9cb6321f01c45477d30066498cd5e1a815"
 dependencies = [
- "phf_generator",
+ "phf_generator 0.8.0",
  "phf_shared 0.8.0",
 ]
 
@@ -315,7 +313,17 @@ source = "registry+https://github.com/ru
 checksum = "17367f0cc86f2d25802b2c26ee58a7b23faeccf78a396094c13dced0d0182526"
 dependencies = [
  "phf_shared 0.8.0",
- "rand",
+ "rand 0.7.3",
+]
+
+[[package]]
+name = "phf_generator"
+version = "0.10.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5d5285893bb5eb82e6aaf5d59ee909a06a16737a8970984dd7746ba9283498d6"
+dependencies = [
+ "phf_shared 0.10.0",
+ "rand 0.8.5",
 ]
 
 [[package]]
@@ -324,12 +332,12 @@ version = "0.8.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "7f6fde18ff429ffc8fe78e2bf7f8b7a5a5a6e2a8b58bc5a9ac69198bbda9189c"
 dependencies = [
- "phf_generator",
+ "phf_generator 0.8.0",
  "phf_shared 0.8.0",
  "proc-macro-hack",
  "proc-macro2",
  "quote",
- "syn 1.0.89",
+ "syn 1.0.109",
 ]
 
 [[package]]
@@ -358,9 +366,9 @@ checksum = "7170ef9988bc169ba16dd36a7fa0
 
 [[package]]
 name = "ppv-lite86"
-version = "0.2.16"
+version = "0.2.17"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "eb9f9e6e233e5c4a35559a617bf40a4ec447db2e84c20b55a6f83167b7e57872"
+checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de"
 
 [[package]]
 name = "precomputed-hash"
@@ -370,30 +378,29 @@ checksum = "925383efa346730478fb4838dbe9
 
 [[package]]
 name = "proc-macro-hack"
-version = "0.5.19"
+version = "0.5.20+deprecated"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dbf0c48bc1d91375ae5c3cd81e3722dff1abcf81a30960240640d223f59fe0e5"
+checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068"
 
 [[package]]
 name = "proc-macro2"
-version = "1.0.69"
+version = "1.0.82"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "134c189feb4956b20f6f547d2cf727d4c0fe06722b20a0eec87ed445a97f92da"
+checksum = "8ad3d49ab951a01fbaafe34f2ec74122942fe18a3f9814c3268f1bb72042131b"
 dependencies = [
  "unicode-ident",
 ]
 
 [[package]]
 name = "pyo3"
-version = "0.20.3"
+version = "0.25.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "53bdbb96d49157e65d45cc287af5f32ffadd5f4761438b527b055fb0d4bb8233"
+checksum = "8970a78afe0628a3e3430376fc5fd76b6b45c4d43360ffd6cdd40bdde72b682a"
 dependencies = [
- "cfg-if",
  "indoc",
  "libc",
  "memoffset",
- "parking_lot",
+ "once_cell",
  "portable-atomic",
  "pyo3-build-config",
  "pyo3-ffi",
@@ -403,9 +410,9 @@ dependencies = [
 
 [[package]]
 name = "pyo3-build-config"
-version = "0.20.3"
+version = "0.25.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "deaa5745de3f5231ce10517a1f5dd97d53e5a2fd77aa6b5842292085831d48d7"
+checksum = "458eb0c55e7ece017adeba38f2248ff3ac615e53660d7c71a238d7d2a01c7598"
 dependencies = [
  "once_cell",
  "target-lexicon",
@@ -413,9 +420,9 @@ dependencies = [
 
 [[package]]
 name = "pyo3-ffi"
-version = "0.20.3"
+version = "0.25.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "62b42531d03e08d4ef1f6e85a2ed422eb678b8cd62b762e53891c05faf0d4afa"
+checksum = "7114fe5457c61b276ab77c5055f206295b812608083644a5c5b2640c3102565c"
 dependencies = [
  "libc",
  "pyo3-build-config",
@@ -423,34 +430,34 @@ dependencies = [
 
 [[package]]
 name = "pyo3-macros"
-version = "0.20.3"
+version = "0.25.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7305c720fa01b8055ec95e484a6eca7a83c841267f0dd5280f0c8b8551d2c158"
+checksum = "a8725c0a622b374d6cb051d11a0983786448f7785336139c3c94f5aa6bef7e50"
 dependencies = [
  "proc-macro2",
  "pyo3-macros-backend",
  "quote",
- "syn 2.0.38",
+ "syn 2.0.61",
 ]
 
 [[package]]
 name = "pyo3-macros-backend"
-version = "0.20.3"
+version = "0.25.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7c7e9b68bb9c3149c5b0cade5d07f953d6d125eb4337723c4ccdb665f1f96185"
+checksum = "4109984c22491085343c05b0dbc54ddc405c3cf7b4374fc533f5c3313a572ccc"
 dependencies = [
  "heck",
  "proc-macro2",
  "pyo3-build-config",
  "quote",
- "syn 2.0.38",
+ "syn 2.0.61",
 ]
 
 [[package]]
 name = "quote"
-version = "1.0.33"
+version = "1.0.36"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae"
+checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7"
 dependencies = [
  "proc-macro2",
 ]
@@ -461,22 +468,43 @@ version = "0.7.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03"
 dependencies = [
- "getrandom",
+ "getrandom 0.1.16",
  "libc",
- "rand_chacha",
- "rand_core",
+ "rand_chacha 0.2.2",
+ "rand_core 0.5.1",
  "rand_hc",
  "rand_pcg",
 ]
 
 [[package]]
+name = "rand"
+version = "0.8.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404"
+dependencies = [
+ "libc",
+ "rand_chacha 0.3.1",
+ "rand_core 0.6.4",
+]
+
+[[package]]
 name = "rand_chacha"
 version = "0.2.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402"
 dependencies = [
  "ppv-lite86",
- "rand_core",
+ "rand_core 0.5.1",
+]
+
+[[package]]
+name = "rand_chacha"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88"
+dependencies = [
+ "ppv-lite86",
+ "rand_core 0.6.4",
 ]
 
 [[package]]
@@ -485,7 +513,16 @@ version = "0.5.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19"
 dependencies = [
- "getrandom",
+ "getrandom 0.1.16",
+]
+
+[[package]]
+name = "rand_core"
+version = "0.6.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
+dependencies = [
+ "getrandom 0.2.15",
 ]
 
 [[package]]
@@ -494,7 +531,7 @@ version = "0.2.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c"
 dependencies = [
- "rand_core",
+ "rand_core 0.5.1",
 ]
 
 [[package]]
@@ -503,16 +540,16 @@ version = "0.2.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "16abd0c1b639e9eb4d7c50c0b8100b0d0f849be2349829c740fe8e6eb4816429"
 dependencies = [
- "rand_core",
+ "rand_core 0.5.1",
 ]
 
 [[package]]
 name = "redox_syscall"
-version = "0.2.11"
+version = "0.5.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8380fe0152551244f0747b1bf41737e0f8a74f97a14ccefd1148187271634f3c"
+checksum = "469052894dcb553421e483e4209ee581a45100d31b4018de03e5a7ad86374a7e"
 dependencies = [
- "bitflags",
+ "bitflags 2.5.0",
 ]
 
 [[package]]
@@ -526,9 +563,9 @@ dependencies = [
 
 [[package]]
 name = "scopeguard"
-version = "1.1.0"
+version = "1.2.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd"
+checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
 
 [[package]]
 name = "selectors"
@@ -536,7 +573,7 @@ version = "0.22.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "df320f1889ac4ba6bc0cdc9c9af7af4bd64bb927bccdf32d81140dc1f9be12fe"
 dependencies = [
- "bitflags",
+ "bitflags 1.3.2",
  "cssparser",
  "derive_more",
  "fxhash",
@@ -552,15 +589,29 @@ dependencies = [
 
 [[package]]
 name = "semver"
-version = "1.0.6"
+version = "1.0.23"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a4a3381e03edd24287172047536f20cabde766e2cd3e65e6b00fb3af51c4f38d"
+checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b"
 
 [[package]]
 name = "serde"
-version = "1.0.136"
+version = "1.0.200"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ddc6f9cc94d67c0e21aaf7eda3a010fd3af78ebf6e096aa6e2e13c79749cce4f"
+dependencies = [
+ "serde_derive",
+]
+
+[[package]]
+name = "serde_derive"
+version = "1.0.200"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ce31e24b01e1e524df96f1c2fdd054405f8d7376249a5110886fb4b658484789"
+checksum = "856f046b9400cee3c8c94ed572ecdb752444c24528c035cd35882aad6f492bcb"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.61",
+]
 
 [[package]]
 name = "servo_arc"
@@ -574,15 +625,15 @@ dependencies = [
 
 [[package]]
 name = "siphasher"
-version = "0.3.10"
+version = "0.3.11"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7bd3e3206899af3f8b12af284fafc038cc1dc2b41d1b89dd17297221c5d225de"
+checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d"
 
 [[package]]
 name = "smallvec"
-version = "1.8.0"
+version = "1.13.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f2dd574626839106c320a323308629dcb1acfc96e32a8cba364ddc61ac23ee83"
+checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67"
 
 [[package]]
 name = "stable_deref_trait"
@@ -592,12 +643,12 @@ checksum = "a8f112729512f8e442d81f95a8a7
 
 [[package]]
 name = "string_cache"
-version = "0.8.3"
+version = "0.8.7"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "33994d0838dc2d152d17a62adf608a869b5e846b65b389af7f3dbc1de45c5b26"
+checksum = "f91138e76242f575eb1d3b38b4f1362f10d3a43f47d182a5b359af488a02293b"
 dependencies = [
- "lazy_static",
  "new_debug_unreachable",
+ "once_cell",
  "parking_lot",
  "phf_shared 0.10.0",
  "precomputed-hash",
@@ -606,32 +657,32 @@ dependencies = [
 
 [[package]]
 name = "string_cache_codegen"
-version = "0.5.1"
+version = "0.5.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f24c8e5e19d22a726626f1a5e16fe15b132dcf21d10177fa5a45ce7962996b97"
+checksum = "6bb30289b722be4ff74a408c3cc27edeaad656e06cb1fe8fa9231fa59c728988"
 dependencies = [
- "phf_generator",
- "phf_shared 0.8.0",
+ "phf_generator 0.10.0",
+ "phf_shared 0.10.0",
  "proc-macro2",
  "quote",
 ]
 
 [[package]]
 name = "syn"
-version = "1.0.89"
+version = "1.0.109"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ea297be220d52398dcc07ce15a209fce436d361735ac1db700cab3b6cdfb9f54"
+checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237"
 dependencies = [
  "proc-macro2",
  "quote",
- "unicode-xid",
+ "unicode-ident",
 ]
 
 [[package]]
 name = "syn"
-version = "2.0.38"
+version = "2.0.61"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e96b79aaa137db8f61e26363a0c9b47d8b4ec75da28b7d1d614c2303e232408b"
+checksum = "c993ed8ccba56ae856363b1845da7266a7cb78e1d146c8a32d54b45a8b831fc9"
 dependencies = [
  "proc-macro2",
  "quote",
@@ -640,9 +691,9 @@ dependencies = [
 
 [[package]]
 name = "target-lexicon"
-version = "0.12.3"
+version = "0.13.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d7fa7e55043acb85fca6b3c01485a2eeb6b69c5d21002e273c79e465f43b7ac1"
+checksum = "e502f78cdbb8ba4718f566c418c52bc729126ffd16baee5baa718cf25dd5a69a"
 
 [[package]]
 name = "tendril"
@@ -668,12 +719,6 @@ source = "registry+https://github.com/ru
 checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b"
 
 [[package]]
-name = "unicode-xid"
-version = "0.2.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3"
-
-[[package]]
 name = "unindent"
 version = "0.2.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -692,23 +737,71 @@ source = "registry+https://github.com/ru
 checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519"
 
 [[package]]
-name = "winapi"
-version = "0.3.9"
+name = "wasi"
+version = "0.11.0+wasi-snapshot-preview1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
+
+[[package]]
+name = "windows-targets"
+version = "0.52.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
+checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb"
 dependencies = [
- "winapi-i686-pc-windows-gnu",
- "winapi-x86_64-pc-windows-gnu",
+ "windows_aarch64_gnullvm",
+ "windows_aarch64_msvc",
+ "windows_i686_gnu",
+ "windows_i686_gnullvm",
+ "windows_i686_msvc",
+ "windows_x86_64_gnu",
+ "windows_x86_64_gnullvm",
+ "windows_x86_64_msvc",
 ]
 
 [[package]]
-name = "winapi-i686-pc-windows-gnu"
-version = "0.4.0"
+name = "windows_aarch64_gnullvm"
+version = "0.52.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
+checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263"
 
 [[package]]
-name = "winapi-x86_64-pc-windows-gnu"
-version = "0.4.0"
+name = "windows_aarch64_msvc"
+version = "0.52.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6"
+
+[[package]]
+name = "windows_i686_gnu"
+version = "0.52.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670"
+
+[[package]]
+name = "windows_i686_gnullvm"
+version = "0.52.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9"
+
+[[package]]
+name = "windows_i686_msvc"
+version = "0.52.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf"
+
+[[package]]
+name = "windows_x86_64_gnu"
+version = "0.52.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9"
+
+[[package]]
+name = "windows_x86_64_gnullvm"
+version = "0.52.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596"
+
+[[package]]
+name = "windows_x86_64_msvc"
+version = "0.52.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
+checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0"
diff -pruN 1.9.0+dfsg-3/examples/html-py-ever/Cargo.toml 1.12.0+dfsg-1/examples/html-py-ever/Cargo.toml
--- 1.9.0+dfsg-3/examples/html-py-ever/Cargo.toml	2024-02-24 14:14:27.000000000 +0000
+++ 1.12.0+dfsg-1/examples/html-py-ever/Cargo.toml	2025-08-29 18:17:36.000000000 +0000
@@ -6,7 +6,7 @@ edition = "2021"
 
 [dependencies]
 kuchiki = "0.8.0"
-pyo3 = "0.20.3"
+pyo3 = "0.25"
 tendril = "0.4.3"
 
 [lib]
diff -pruN 1.9.0+dfsg-3/examples/html-py-ever/README.md 1.12.0+dfsg-1/examples/html-py-ever/README.md
--- 1.9.0+dfsg-3/examples/html-py-ever/README.md	2024-02-24 14:14:27.000000000 +0000
+++ 1.12.0+dfsg-1/examples/html-py-ever/README.md	2025-08-29 18:17:36.000000000 +0000
@@ -96,7 +96,7 @@ test_bench_selector_python[/home/david/d
 
 **building and installing**
 ```
-pip install setuptools-rust setuptools wheel
+pip install setuptools-rust setuptools
 python3 setup.py install --user
 ```
 
diff -pruN 1.9.0+dfsg-3/examples/html-py-ever/build-wheels.sh 1.12.0+dfsg-1/examples/html-py-ever/build-wheels.sh
--- 1.9.0+dfsg-3/examples/html-py-ever/build-wheels.sh	2024-02-24 14:14:27.000000000 +0000
+++ 1.12.0+dfsg-1/examples/html-py-ever/build-wheels.sh	2025-08-29 18:17:36.000000000 +0000
@@ -7,7 +7,7 @@ export PATH="$HOME/.cargo/bin:$PATH"
 # Compile wheels
 for PYBIN in /opt/python/cp{37,38,39,310}*/bin; do
     rm -rf /io/build/
-    "${PYBIN}/pip" install -U setuptools setuptools-rust wheel
+    "${PYBIN}/pip" install -U setuptools setuptools-rust
     "${PYBIN}/pip" wheel /io/ -w /io/dist/ --no-deps
 done
 
diff -pruN 1.9.0+dfsg-3/examples/html-py-ever/noxfile.py 1.12.0+dfsg-1/examples/html-py-ever/noxfile.py
--- 1.9.0+dfsg-3/examples/html-py-ever/noxfile.py	2024-02-24 14:14:27.000000000 +0000
+++ 1.12.0+dfsg-1/examples/html-py-ever/noxfile.py	2025-08-29 18:17:36.000000000 +0000
@@ -7,9 +7,7 @@ SETUPTOOLS_RUST = dirname(dirname(dirnam
 
 @nox.session()
 def test(session: nox.Session):
-    session.install(
-        SETUPTOOLS_RUST, "wheel", "pytest", "pytest-benchmark", "beautifulsoup4"
-    )
+    session.install(SETUPTOOLS_RUST, "pytest", "pytest-benchmark", "beautifulsoup4")
     # Ensure build uses version of setuptools-rust under development
     session.install("--no-build-isolation", ".")
     # Test Python package
diff -pruN 1.9.0+dfsg-3/examples/html-py-ever/pyproject.toml 1.12.0+dfsg-1/examples/html-py-ever/pyproject.toml
--- 1.9.0+dfsg-3/examples/html-py-ever/pyproject.toml	2024-02-24 14:14:27.000000000 +0000
+++ 1.12.0+dfsg-1/examples/html-py-ever/pyproject.toml	2025-08-29 18:17:36.000000000 +0000
@@ -1,5 +1,5 @@
 [build-system]
-requires = ["setuptools", "wheel", "setuptools-rust"]
+requires = ["setuptools", "setuptools-rust"]
 build-backend = "setuptools.build_meta"
 
 [project]
diff -pruN 1.9.0+dfsg-3/examples/html-py-ever/requirements.txt 1.12.0+dfsg-1/examples/html-py-ever/requirements.txt
--- 1.9.0+dfsg-3/examples/html-py-ever/requirements.txt	2024-02-24 14:14:27.000000000 +0000
+++ 1.12.0+dfsg-1/examples/html-py-ever/requirements.txt	2025-08-29 18:17:36.000000000 +0000
@@ -1,3 +1,2 @@
 setuptools-rust
-setuptools
-wheel
\ No newline at end of file
+setuptools>=70.1.0
diff -pruN 1.9.0+dfsg-3/examples/html-py-ever/rust/lib.rs 1.12.0+dfsg-1/examples/html-py-ever/rust/lib.rs
--- 1.9.0+dfsg-3/examples/html-py-ever/rust/lib.rs	2024-02-24 14:14:27.000000000 +0000
+++ 1.12.0+dfsg-1/examples/html-py-ever/rust/lib.rs	2025-08-29 18:17:36.000000000 +0000
@@ -1,58 +1,53 @@
 use pyo3::prelude::*;
-use pyo3::wrap_pyfunction;
-use std::io::Read;
-use std::path::Path;
-use tendril::stream::TendrilSink;
-
-/// A parsed html document
-#[pyclass(unsendable)]
-struct Document {
-    node: kuchiki::NodeRef,
-}
 
-#[pymethods]
-impl Document {
-    /// Returns the selected elements as strings
-    fn select(&self, selector: &str) -> Vec<String> {
-        self.node
-            .select(selector)
-            .unwrap()
-            .map(|css_match| css_match.text_contents())
-            .collect()
+#[pymodule]
+mod html_py_ever {
+    use pyo3::prelude::*;
+    use std::io::Read;
+    use std::path::Path;
+    use tendril::stream::TendrilSink;
+
+    /// A parsed html document
+    #[pyclass(unsendable)]
+    struct Document {
+        node: kuchiki::NodeRef,
     }
-}
 
-impl Document {
-    fn from_reader(reader: &mut impl Read) -> PyResult<Document> {
-        let node = kuchiki::parse_html().from_utf8().read_from(reader)?;
-        Ok(Document { node })
+    #[pymethods]
+    impl Document {
+        /// Returns the selected elements as strings
+        fn select(&self, selector: &str) -> Vec<String> {
+            self.node
+                .select(selector)
+                .unwrap()
+                .map(|css_match| css_match.text_contents())
+                .collect()
+        }
     }
 
-    fn from_file(path: &Path) -> PyResult<Document> {
-        let node = kuchiki::parse_html().from_utf8().from_file(path)?;
-        Ok(Document { node })
+    impl Document {
+        fn from_reader(reader: &mut impl Read) -> PyResult<Document> {
+            let node = kuchiki::parse_html().from_utf8().read_from(reader)?;
+            Ok(Document { node })
+        }
+
+        fn from_file(path: &Path) -> PyResult<Document> {
+            let node = kuchiki::parse_html().from_utf8().from_file(path)?;
+            Ok(Document { node })
+        }
     }
-}
-
-/// Parses the File from the specified Path into a document
-#[pyfunction]
-fn parse_file(path: &str) -> PyResult<Document> {
-    let document = Document::from_file(Path::new(path))?;
-    Ok(document)
-}
 
-/// Parses the given html test into a document
-#[pyfunction]
-fn parse_text(text: &str) -> PyResult<Document> {
-    let document = Document::from_reader(&mut text.as_bytes())?;
-    Ok(document)
-}
-
-#[pymodule]
-fn html_py_ever(_py: Python<'_>, m: &PyModule) -> PyResult<()> {
-    m.add_wrapped(wrap_pyfunction!(parse_file))?;
-    m.add_wrapped(wrap_pyfunction!(parse_text))?;
-    m.add_class::<Document>()?;
+    /// Parses the File from the specified Path into a document
+    #[pyfunction]
+    fn parse_file(path: &str) -> PyResult<Document> {
+        let document = Document::from_file(Path::new(path))?;
+        Ok(document)
+    }
 
-    Ok(())
+    /// Parses the given html test into a document
+    #[pyfunction]
+    fn parse_text(text: &str) -> PyResult<Document> {
+        let document = Document::from_reader(&mut text.as_bytes())?;
+        Ok(document)
+    }
 }
diff -pruN 1.9.0+dfsg-3/examples/html-py-ever/tests/run_all.py 1.12.0+dfsg-1/examples/html-py-ever/tests/run_all.py
--- 1.9.0+dfsg-3/examples/html-py-ever/tests/run_all.py	2024-02-24 14:14:27.000000000 +0000
+++ 1.12.0+dfsg-1/examples/html-py-ever/tests/run_all.py	2025-08-29 18:17:36.000000000 +0000
@@ -46,14 +46,14 @@ def main():
         count_py, parse_py, select_py = python(filename, "html.parser")
         assert count_rs == count_py
         print(f"{filename} {count_rs} {parse_rs:6f}s")
-        print(f"Parse py    {parse_py:6f}s {parse_py/parse_rs:6.3f}x")
-        print(f"Select py   {select_py:6f}s {select_py/select_rs:6.3f}x")
+        print(f"Parse py    {parse_py:6f}s {parse_py / parse_rs:6.3f}x")
+        print(f"Select py   {select_py:6f}s {select_py / select_rs:6.3f}x")
 
         if lxml is not None:
             count_lxml, parse_lxml, select_lxml = python(filename, "lxml")
             assert count_rs == count_lxml
-            print(f"Parse lxml  {parse_lxml:6f}s {parse_lxml/parse_rs:6.3f}x")
-            print(f"Select lxml {select_lxml:6f}s {select_lxml/select_rs:6.3f}x")
+            print(f"Parse lxml  {parse_lxml:6f}s {parse_lxml / parse_rs:6.3f}x")
+            print(f"Select lxml {select_lxml:6f}s {select_lxml / select_rs:6.3f}x")
 
 
 if __name__ == "__main__":
diff -pruN 1.9.0+dfsg-3/examples/namespace_package/Cargo.lock 1.12.0+dfsg-1/examples/namespace_package/Cargo.lock
--- 1.9.0+dfsg-3/examples/namespace_package/Cargo.lock	2024-02-24 14:14:27.000000000 +0000
+++ 1.12.0+dfsg-1/examples/namespace_package/Cargo.lock	2025-08-29 18:17:36.000000000 +0000
@@ -1,66 +1,36 @@
 # This file is automatically @generated by Cargo.
 # It is not intended for manual editing.
-version = 3
+version = 4
 
 [[package]]
 name = "autocfg"
-version = "1.1.0"
+version = "1.3.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
-
-[[package]]
-name = "bitflags"
-version = "1.3.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
-
-[[package]]
-name = "cfg-if"
-version = "1.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
+checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0"
 
 [[package]]
 name = "heck"
-version = "0.4.1"
+version = "0.5.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8"
+checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
 
 [[package]]
 name = "indoc"
-version = "2.0.4"
+version = "2.0.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1e186cfbae8084e513daff4240b4797e342f988cecda4fb6c939150f96315fd8"
-
-[[package]]
-name = "instant"
-version = "0.1.12"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c"
-dependencies = [
- "cfg-if",
-]
+checksum = "b248f5224d1d606005e02c97f5aa4e88eeb230488bcc03bc9ca4d7991399f2b5"
 
 [[package]]
 name = "libc"
-version = "0.2.121"
+version = "0.2.154"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "efaa7b300f3b5fe8eb6bf21ce3895e1751d9665086af2d64b42f19701015ff4f"
-
-[[package]]
-name = "lock_api"
-version = "0.4.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "88943dd7ef4a2e5a4bfa2753aaab3013e34ce2533d1996fb18ef591e315e2b3b"
-dependencies = [
- "scopeguard",
-]
+checksum = "ae743338b92ff9146ce83992f766a31066a91a8c84a45e0e9f21e7cf6de6d346"
 
 [[package]]
 name = "memoffset"
-version = "0.9.0"
+version = "0.9.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c"
+checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a"
 dependencies = [
  "autocfg",
 ]
@@ -74,34 +44,9 @@ dependencies = [
 
 [[package]]
 name = "once_cell"
-version = "1.10.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "87f3e037eac156d1775da914196f0f37741a274155e34a0b7e427c35d2a2ecb9"
-
-[[package]]
-name = "parking_lot"
-version = "0.11.2"
+version = "1.19.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99"
-dependencies = [
- "instant",
- "lock_api",
- "parking_lot_core",
-]
-
-[[package]]
-name = "parking_lot_core"
-version = "0.8.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d76e8e1493bcac0d2766c42737f34458f1c8c50c0d23bcb24ea953affb273216"
-dependencies = [
- "cfg-if",
- "instant",
- "libc",
- "redox_syscall",
- "smallvec",
- "winapi",
-]
+checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92"
 
 [[package]]
 name = "portable-atomic"
@@ -111,24 +56,23 @@ checksum = "7170ef9988bc169ba16dd36a7fa0
 
 [[package]]
 name = "proc-macro2"
-version = "1.0.69"
+version = "1.0.82"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "134c189feb4956b20f6f547d2cf727d4c0fe06722b20a0eec87ed445a97f92da"
+checksum = "8ad3d49ab951a01fbaafe34f2ec74122942fe18a3f9814c3268f1bb72042131b"
 dependencies = [
  "unicode-ident",
 ]
 
 [[package]]
 name = "pyo3"
-version = "0.20.3"
+version = "0.25.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "53bdbb96d49157e65d45cc287af5f32ffadd5f4761438b527b055fb0d4bb8233"
+checksum = "8970a78afe0628a3e3430376fc5fd76b6b45c4d43360ffd6cdd40bdde72b682a"
 dependencies = [
- "cfg-if",
  "indoc",
  "libc",
  "memoffset",
- "parking_lot",
+ "once_cell",
  "portable-atomic",
  "pyo3-build-config",
  "pyo3-ffi",
@@ -138,9 +82,9 @@ dependencies = [
 
 [[package]]
 name = "pyo3-build-config"
-version = "0.20.3"
+version = "0.25.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "deaa5745de3f5231ce10517a1f5dd97d53e5a2fd77aa6b5842292085831d48d7"
+checksum = "458eb0c55e7ece017adeba38f2248ff3ac615e53660d7c71a238d7d2a01c7598"
 dependencies = [
  "once_cell",
  "target-lexicon",
@@ -148,9 +92,9 @@ dependencies = [
 
 [[package]]
 name = "pyo3-ffi"
-version = "0.20.3"
+version = "0.25.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "62b42531d03e08d4ef1f6e85a2ed422eb678b8cd62b762e53891c05faf0d4afa"
+checksum = "7114fe5457c61b276ab77c5055f206295b812608083644a5c5b2640c3102565c"
 dependencies = [
  "libc",
  "pyo3-build-config",
@@ -158,9 +102,9 @@ dependencies = [
 
 [[package]]
 name = "pyo3-macros"
-version = "0.20.3"
+version = "0.25.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7305c720fa01b8055ec95e484a6eca7a83c841267f0dd5280f0c8b8551d2c158"
+checksum = "a8725c0a622b374d6cb051d11a0983786448f7785336139c3c94f5aa6bef7e50"
 dependencies = [
  "proc-macro2",
  "pyo3-macros-backend",
@@ -170,9 +114,9 @@ dependencies = [
 
 [[package]]
 name = "pyo3-macros-backend"
-version = "0.20.3"
+version = "0.25.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7c7e9b68bb9c3149c5b0cade5d07f953d6d125eb4337723c4ccdb665f1f96185"
+checksum = "4109984c22491085343c05b0dbc54ddc405c3cf7b4374fc533f5c3313a572ccc"
 dependencies = [
  "heck",
  "proc-macro2",
@@ -183,39 +127,18 @@ dependencies = [
 
 [[package]]
 name = "quote"
-version = "1.0.33"
+version = "1.0.36"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae"
+checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7"
 dependencies = [
  "proc-macro2",
 ]
 
 [[package]]
-name = "redox_syscall"
-version = "0.2.11"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8380fe0152551244f0747b1bf41737e0f8a74f97a14ccefd1148187271634f3c"
-dependencies = [
- "bitflags",
-]
-
-[[package]]
-name = "scopeguard"
-version = "1.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd"
-
-[[package]]
-name = "smallvec"
-version = "1.8.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f2dd574626839106c320a323308629dcb1acfc96e32a8cba364ddc61ac23ee83"
-
-[[package]]
 name = "syn"
-version = "2.0.38"
+version = "2.0.61"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e96b79aaa137db8f61e26363a0c9b47d8b4ec75da28b7d1d614c2303e232408b"
+checksum = "c993ed8ccba56ae856363b1845da7266a7cb78e1d146c8a32d54b45a8b831fc9"
 dependencies = [
  "proc-macro2",
  "quote",
@@ -224,9 +147,9 @@ dependencies = [
 
 [[package]]
 name = "target-lexicon"
-version = "0.12.3"
+version = "0.13.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d7fa7e55043acb85fca6b3c01485a2eeb6b69c5d21002e273c79e465f43b7ac1"
+checksum = "e502f78cdbb8ba4718f566c418c52bc729126ffd16baee5baa718cf25dd5a69a"
 
 [[package]]
 name = "unicode-ident"
@@ -239,25 +162,3 @@ name = "unindent"
 version = "0.2.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "c7de7d73e1754487cb58364ee906a499937a0dfabd86bcb980fa99ec8c8fa2ce"
-
-[[package]]
-name = "winapi"
-version = "0.3.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
-dependencies = [
- "winapi-i686-pc-windows-gnu",
- "winapi-x86_64-pc-windows-gnu",
-]
-
-[[package]]
-name = "winapi-i686-pc-windows-gnu"
-version = "0.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
-
-[[package]]
-name = "winapi-x86_64-pc-windows-gnu"
-version = "0.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
diff -pruN 1.9.0+dfsg-3/examples/namespace_package/Cargo.toml 1.12.0+dfsg-1/examples/namespace_package/Cargo.toml
--- 1.9.0+dfsg-3/examples/namespace_package/Cargo.toml	2024-02-24 14:14:27.000000000 +0000
+++ 1.12.0+dfsg-1/examples/namespace_package/Cargo.toml	2025-08-29 18:17:36.000000000 +0000
@@ -18,4 +18,4 @@ path = "rust/lib.rs"  # When omitted, th
 # path = "src/lib.rs"
 
 [dependencies]
-pyo3 = "0.20.3"
+pyo3 = "0.25"
diff -pruN 1.9.0+dfsg-3/examples/namespace_package/Cross.toml 1.12.0+dfsg-1/examples/namespace_package/Cross.toml
--- 1.9.0+dfsg-3/examples/namespace_package/Cross.toml	2024-02-24 14:14:27.000000000 +0000
+++ 1.12.0+dfsg-1/examples/namespace_package/Cross.toml	2025-08-29 18:17:36.000000000 +0000
@@ -1,7 +1,16 @@
 [target.aarch64-unknown-linux-gnu]
 image = "cross-pyo3:aarch64-unknown-linux-gnu"
 env.passthrough = [
+    "PYO3_PRINT_CONFIG",
     "RUST_BACKTRACE",
     "RUST_LOG",
     "PYO3_CROSS_LIB_DIR",
 ]
+
+# This avoids cross picking up custom linker from host ~/.cargo/config.toml
+# See: https://github.com/cross-rs/cross/issues/621
+[build.env]
+passthrough = [
+    "CARGO_TARGET_X86_64_UNKNOWN_LINUX_GNU_LINKER=x86_64-linux-gnu-gcc",
+    "RUSTFLAGS",
+]
diff -pruN 1.9.0+dfsg-3/examples/namespace_package/Dockerfile 1.12.0+dfsg-1/examples/namespace_package/Dockerfile
--- 1.9.0+dfsg-3/examples/namespace_package/Dockerfile	2024-02-24 14:14:27.000000000 +0000
+++ 1.12.0+dfsg-1/examples/namespace_package/Dockerfile	2025-08-29 18:17:36.000000000 +0000
@@ -2,7 +2,9 @@ FROM quay.io/pypa/manylinux2014_aarch64
 
 FROM ghcr.io/cross-rs/aarch64-unknown-linux-gnu:edge
 
-RUN curl -L https://github.com/indygreg/python-build-standalone/releases/download/20220318/cpython-3.8.13+20220318-x86_64-unknown-linux-gnu-install_only.tar.gz | tar -xz -C /usr/local
+# PyO3 needs a host Python interpreter to parse the sysconfigdata of the
+# cross-compile interpreter found in /opt/python
+RUN apt-get update && apt-get --assume-yes install python3
 
 ENV PATH=/usr/local/python/bin:$PATH
 
diff -pruN 1.9.0+dfsg-3/examples/namespace_package/noxfile.py 1.12.0+dfsg-1/examples/namespace_package/noxfile.py
--- 1.9.0+dfsg-3/examples/namespace_package/noxfile.py	2024-02-24 14:14:27.000000000 +0000
+++ 1.12.0+dfsg-1/examples/namespace_package/noxfile.py	2025-08-29 18:17:36.000000000 +0000
@@ -7,7 +7,7 @@ SETUPTOOLS_RUST = dirname(dirname(dirnam
 
 @nox.session()
 def test(session: nox.Session):
-    session.install(SETUPTOOLS_RUST, "wheel")
+    session.install(SETUPTOOLS_RUST)
     # Ensure build uses version of setuptools-rust under development
     session.install("--no-build-isolation", ".[dev]")
     # Test Python package
diff -pruN 1.9.0+dfsg-3/examples/namespace_package/pyproject.toml 1.12.0+dfsg-1/examples/namespace_package/pyproject.toml
--- 1.9.0+dfsg-3/examples/namespace_package/pyproject.toml	2024-02-24 14:14:27.000000000 +0000
+++ 1.12.0+dfsg-1/examples/namespace_package/pyproject.toml	2025-08-29 18:17:36.000000000 +0000
@@ -1,5 +1,5 @@
 [build-system]
-requires = ["setuptools", "wheel", "setuptools-rust"]
+requires = ["setuptools", "setuptools-rust"]
 build-backend = "setuptools.build_meta"
 
 [project]
diff -pruN 1.9.0+dfsg-3/examples/namespace_package/rust/lib.rs 1.12.0+dfsg-1/examples/namespace_package/rust/lib.rs
--- 1.9.0+dfsg-3/examples/namespace_package/rust/lib.rs	2024-02-24 14:14:27.000000000 +0000
+++ 1.12.0+dfsg-1/examples/namespace_package/rust/lib.rs	2025-08-29 18:17:36.000000000 +0000
@@ -1,15 +1,12 @@
 use pyo3::prelude::*;
-use pyo3::wrap_pyfunction;
-
-#[pyfunction]
-fn rust_func() -> usize {
-    14
-}
 
 /// A Python module implemented in Rust.
 #[pymodule]
-fn rust(_py: Python, m: &PyModule) -> PyResult<()> {
-    m.add_wrapped(wrap_pyfunction!(rust_func))?;
+mod rust {
+    use pyo3::prelude::*;
 
-    Ok(())
+    #[pyfunction]
+    fn rust_func() -> usize {
+        14
+    }
 }
diff -pruN 1.9.0+dfsg-3/examples/rust_with_cffi/Cargo.lock 1.12.0+dfsg-1/examples/rust_with_cffi/Cargo.lock
--- 1.9.0+dfsg-3/examples/rust_with_cffi/Cargo.lock	2024-02-24 14:14:27.000000000 +0000
+++ 1.12.0+dfsg-1/examples/rust_with_cffi/Cargo.lock	2025-08-29 18:17:36.000000000 +0000
@@ -1,100 +1,45 @@
 # This file is automatically @generated by Cargo.
 # It is not intended for manual editing.
-version = 3
+version = 4
 
 [[package]]
 name = "autocfg"
-version = "1.1.0"
+version = "1.3.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
-
-[[package]]
-name = "bitflags"
-version = "1.3.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
-
-[[package]]
-name = "cfg-if"
-version = "1.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
+checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0"
 
 [[package]]
 name = "heck"
-version = "0.4.1"
+version = "0.5.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8"
+checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
 
 [[package]]
 name = "indoc"
-version = "2.0.4"
+version = "2.0.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1e186cfbae8084e513daff4240b4797e342f988cecda4fb6c939150f96315fd8"
-
-[[package]]
-name = "instant"
-version = "0.1.12"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c"
-dependencies = [
- "cfg-if",
-]
+checksum = "b248f5224d1d606005e02c97f5aa4e88eeb230488bcc03bc9ca4d7991399f2b5"
 
 [[package]]
 name = "libc"
-version = "0.2.121"
+version = "0.2.154"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "efaa7b300f3b5fe8eb6bf21ce3895e1751d9665086af2d64b42f19701015ff4f"
-
-[[package]]
-name = "lock_api"
-version = "0.4.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "88943dd7ef4a2e5a4bfa2753aaab3013e34ce2533d1996fb18ef591e315e2b3b"
-dependencies = [
- "scopeguard",
-]
+checksum = "ae743338b92ff9146ce83992f766a31066a91a8c84a45e0e9f21e7cf6de6d346"
 
 [[package]]
 name = "memoffset"
-version = "0.9.0"
+version = "0.9.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c"
+checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a"
 dependencies = [
  "autocfg",
 ]
 
 [[package]]
 name = "once_cell"
-version = "1.10.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "87f3e037eac156d1775da914196f0f37741a274155e34a0b7e427c35d2a2ecb9"
-
-[[package]]
-name = "parking_lot"
-version = "0.11.2"
+version = "1.19.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99"
-dependencies = [
- "instant",
- "lock_api",
- "parking_lot_core",
-]
-
-[[package]]
-name = "parking_lot_core"
-version = "0.8.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d76e8e1493bcac0d2766c42737f34458f1c8c50c0d23bcb24ea953affb273216"
-dependencies = [
- "cfg-if",
- "instant",
- "libc",
- "redox_syscall",
- "smallvec",
- "winapi",
-]
+checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92"
 
 [[package]]
 name = "portable-atomic"
@@ -104,24 +49,23 @@ checksum = "7170ef9988bc169ba16dd36a7fa0
 
 [[package]]
 name = "proc-macro2"
-version = "1.0.69"
+version = "1.0.82"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "134c189feb4956b20f6f547d2cf727d4c0fe06722b20a0eec87ed445a97f92da"
+checksum = "8ad3d49ab951a01fbaafe34f2ec74122942fe18a3f9814c3268f1bb72042131b"
 dependencies = [
  "unicode-ident",
 ]
 
 [[package]]
 name = "pyo3"
-version = "0.20.3"
+version = "0.25.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "53bdbb96d49157e65d45cc287af5f32ffadd5f4761438b527b055fb0d4bb8233"
+checksum = "8970a78afe0628a3e3430376fc5fd76b6b45c4d43360ffd6cdd40bdde72b682a"
 dependencies = [
- "cfg-if",
  "indoc",
  "libc",
  "memoffset",
- "parking_lot",
+ "once_cell",
  "portable-atomic",
  "pyo3-build-config",
  "pyo3-ffi",
@@ -131,9 +75,9 @@ dependencies = [
 
 [[package]]
 name = "pyo3-build-config"
-version = "0.20.3"
+version = "0.25.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "deaa5745de3f5231ce10517a1f5dd97d53e5a2fd77aa6b5842292085831d48d7"
+checksum = "458eb0c55e7ece017adeba38f2248ff3ac615e53660d7c71a238d7d2a01c7598"
 dependencies = [
  "once_cell",
  "target-lexicon",
@@ -141,9 +85,9 @@ dependencies = [
 
 [[package]]
 name = "pyo3-ffi"
-version = "0.20.3"
+version = "0.25.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "62b42531d03e08d4ef1f6e85a2ed422eb678b8cd62b762e53891c05faf0d4afa"
+checksum = "7114fe5457c61b276ab77c5055f206295b812608083644a5c5b2640c3102565c"
 dependencies = [
  "libc",
  "pyo3-build-config",
@@ -151,9 +95,9 @@ dependencies = [
 
 [[package]]
 name = "pyo3-macros"
-version = "0.20.3"
+version = "0.25.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7305c720fa01b8055ec95e484a6eca7a83c841267f0dd5280f0c8b8551d2c158"
+checksum = "a8725c0a622b374d6cb051d11a0983786448f7785336139c3c94f5aa6bef7e50"
 dependencies = [
  "proc-macro2",
  "pyo3-macros-backend",
@@ -163,9 +107,9 @@ dependencies = [
 
 [[package]]
 name = "pyo3-macros-backend"
-version = "0.20.3"
+version = "0.25.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7c7e9b68bb9c3149c5b0cade5d07f953d6d125eb4337723c4ccdb665f1f96185"
+checksum = "4109984c22491085343c05b0dbc54ddc405c3cf7b4374fc533f5c3313a572ccc"
 dependencies = [
  "heck",
  "proc-macro2",
@@ -176,23 +120,14 @@ dependencies = [
 
 [[package]]
 name = "quote"
-version = "1.0.33"
+version = "1.0.36"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae"
+checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7"
 dependencies = [
  "proc-macro2",
 ]
 
 [[package]]
-name = "redox_syscall"
-version = "0.2.11"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8380fe0152551244f0747b1bf41737e0f8a74f97a14ccefd1148187271634f3c"
-dependencies = [
- "bitflags",
-]
-
-[[package]]
 name = "rust_with_cffi"
 version = "0.1.0"
 dependencies = [
@@ -200,22 +135,10 @@ dependencies = [
 ]
 
 [[package]]
-name = "scopeguard"
-version = "1.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd"
-
-[[package]]
-name = "smallvec"
-version = "1.8.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f2dd574626839106c320a323308629dcb1acfc96e32a8cba364ddc61ac23ee83"
-
-[[package]]
 name = "syn"
-version = "2.0.38"
+version = "2.0.61"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e96b79aaa137db8f61e26363a0c9b47d8b4ec75da28b7d1d614c2303e232408b"
+checksum = "c993ed8ccba56ae856363b1845da7266a7cb78e1d146c8a32d54b45a8b831fc9"
 dependencies = [
  "proc-macro2",
  "quote",
@@ -224,9 +147,9 @@ dependencies = [
 
 [[package]]
 name = "target-lexicon"
-version = "0.12.3"
+version = "0.13.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d7fa7e55043acb85fca6b3c01485a2eeb6b69c5d21002e273c79e465f43b7ac1"
+checksum = "e502f78cdbb8ba4718f566c418c52bc729126ffd16baee5baa718cf25dd5a69a"
 
 [[package]]
 name = "unicode-ident"
@@ -239,25 +162,3 @@ name = "unindent"
 version = "0.2.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "c7de7d73e1754487cb58364ee906a499937a0dfabd86bcb980fa99ec8c8fa2ce"
-
-[[package]]
-name = "winapi"
-version = "0.3.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
-dependencies = [
- "winapi-i686-pc-windows-gnu",
- "winapi-x86_64-pc-windows-gnu",
-]
-
-[[package]]
-name = "winapi-i686-pc-windows-gnu"
-version = "0.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
-
-[[package]]
-name = "winapi-x86_64-pc-windows-gnu"
-version = "0.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
diff -pruN 1.9.0+dfsg-3/examples/rust_with_cffi/Cargo.toml 1.12.0+dfsg-1/examples/rust_with_cffi/Cargo.toml
--- 1.9.0+dfsg-3/examples/rust_with_cffi/Cargo.toml	2024-02-24 14:14:27.000000000 +0000
+++ 1.12.0+dfsg-1/examples/rust_with_cffi/Cargo.toml	2025-08-29 18:17:36.000000000 +0000
@@ -5,7 +5,7 @@ authors = ["Alex Gaynor <alex.gaynor@gma
 edition = "2021"
 
 [dependencies]
-pyo3 = "0.20.3"
+pyo3 = "0.25"
 
 [lib]
 name = "rust_with_cffi"
diff -pruN 1.9.0+dfsg-3/examples/rust_with_cffi/noxfile.py 1.12.0+dfsg-1/examples/rust_with_cffi/noxfile.py
--- 1.9.0+dfsg-3/examples/rust_with_cffi/noxfile.py	2024-02-24 14:14:27.000000000 +0000
+++ 1.12.0+dfsg-1/examples/rust_with_cffi/noxfile.py	2025-08-29 18:17:36.000000000 +0000
@@ -7,7 +7,13 @@ SETUPTOOLS_RUST = dirname(dirname(dirnam
 
 @nox.session()
 def test(session: nox.Session):
-    session.install(SETUPTOOLS_RUST, "wheel", "pytest", "cffi")
+    session.install(SETUPTOOLS_RUST, "pytest")
+
+    try:
+        session.install("cffi", "--only-binary=cffi")
+    except nox.command.CommandFailed:
+        session.skip("cffi not available on this platform")
+
     # Ensure build uses version of setuptools-rust under development
     session.install("--no-build-isolation", ".")
     # Test Python package
diff -pruN 1.9.0+dfsg-3/examples/rust_with_cffi/rust/lib.rs 1.12.0+dfsg-1/examples/rust_with_cffi/rust/lib.rs
--- 1.9.0+dfsg-3/examples/rust_with_cffi/rust/lib.rs	2024-02-24 14:14:27.000000000 +0000
+++ 1.12.0+dfsg-1/examples/rust_with_cffi/rust/lib.rs	2025-08-29 18:17:36.000000000 +0000
@@ -1,14 +1,11 @@
 use pyo3::prelude::*;
-use pyo3::wrap_pyfunction;
-
-#[pyfunction]
-fn rust_func() -> PyResult<u64> {
-	return Ok(14);
-}
 
 #[pymodule]
-fn rust(_py: Python<'_>, m: &PyModule) -> PyResult<()> {
-    m.add_wrapped(wrap_pyfunction!(rust_func))?;
+mod rust {
+    use pyo3::prelude::*;
 
-    Ok(())
-}
\ No newline at end of file
+    #[pyfunction]
+    fn rust_func() -> PyResult<u64> {
+        return Ok(14);
+    }
+}
diff -pruN 1.9.0+dfsg-3/noxfile.py 1.12.0+dfsg-1/noxfile.py
--- 1.9.0+dfsg-3/noxfile.py	2024-02-24 14:14:27.000000000 +0000
+++ 1.12.0+dfsg-1/noxfile.py	2025-08-29 18:17:36.000000000 +0000
@@ -2,9 +2,11 @@ import os
 from inspect import cleandoc as heredoc
 from glob import glob
 from pathlib import Path
-from unittest.mock import patch
+import shutil
+import sys
 
 import nox
+import nox.command
 
 
 @nox.session(name="test-examples", venv_backend="none")
@@ -15,7 +17,7 @@ def test_examples(session: nox.Session):
 
 @nox.session(name="test-sdist-vendor")
 def test_sdist_vendor(session: nox.Session):
-    session.install(".", "build", "wheel")
+    session.install(".", "build")
     namespace_package = Path(__file__).parent / "examples" / "namespace_package"
     os.chdir(namespace_package)
     tmp = Path(session.create_tmp())
@@ -73,13 +75,12 @@ rustup target add {rust_target}
 git config --global --add safe.directory /io
 
 cd examples/rust_with_cffi/
-# Using crossenv master to workaround https://github.com/benfogle/crossenv/issues/108, will need 1.5.0 when released
-python3.11 -m pip install https://github.com/benfogle/crossenv/archive/refs/heads/master.zip
-python3.11 -m crossenv "/opt/python/cp311-cp311/bin/python3" --cc $TARGET_CC --cxx $TARGET_CXX --sysroot $TARGET_SYSROOT --env LIBRARY_PATH= --manylinux manylinux1 /venv
+python3.13 -m pip install crossenv
+python3.13 -m crossenv "/opt/python/cp313-cp313/bin/python3" --cc $TARGET_CC --cxx $TARGET_CXX --sysroot $TARGET_SYSROOT --env LIBRARY_PATH= --manylinux manylinux1 /venv
 . /venv/bin/activate
 
-build-pip install -U 'pip>=23.2.1' 'setuptools>=68.0.0' 'wheel>=0.41.1' 'build>=1'
-cross-pip install -U 'pip>=23.2.1' 'setuptools>=68.0.0' 'wheel>=0.41.1' 'build>=1'
+build-pip install -U 'pip>=23.2.1' 'setuptools>=70.1' 'build>=1'
+cross-pip install -U 'pip>=23.2.1' 'setuptools>=70.1' 'build>=1'
 build-pip install cffi
 cross-expose cffi
 cross-pip install -e ../../
@@ -128,7 +129,78 @@ python3 -c "from rust_with_cffi.cffi imp
         "/io",
         "--platform",
         docker_platform,
-        "python:3.11",
+        "python:3.13",
+        "bash",
+        "-c",
+        script_check,
+        external=True,
+    )
+
+
+@nox.session(name="test-cross")
+def test_cross(session: nox.Session):
+    session.install(".")
+    session.install("-U", "setuptools", "build")
+
+    shutil.rmtree("examples/namespace_package/dist", ignore_errors=True)
+
+    namespace_package = Path(__file__).parent / "examples" / "namespace_package"
+    os.chdir(namespace_package)
+    session.run(
+        "docker",
+        "build",
+        "-t",
+        "cross-pyo3:aarch64-unknown-linux-gnu",
+        ".",
+        external=True,
+    )
+
+    major_version = sys.version_info[0]
+    minor_version = sys.version_info[1]
+
+    cpXY = f"cp{major_version}{minor_version}"
+
+    tmp = Path(session.create_tmp())
+    extra_config = tmp / "build-opts.cfg"
+    build_config = """
+        [bdist_wheel]
+        plat_name = manylinux2014_aarch64
+        """
+    extra_config.write_text(heredoc(build_config), encoding="utf-8")
+
+    build_env = os.environ.copy()
+    build_env["DIST_EXTRA_CONFIG"] = str(extra_config.absolute())
+    build_env["CARGO"] = "cross"
+    build_env["CARGO_BUILD_TARGET"] = "aarch64-unknown-linux-gnu"
+    build_env["PYO3_CROSS_LIB_DIR"] = f"/opt/python/{cpXY}-{cpXY}/lib"
+
+    # build wheel using cross
+    #
+    # if this step fails, you may need to install cross:
+    # cargo install cross --git https://github.com/cross-rs/cross
+    session.run("python", "-m", "build", "--no-isolation", env=build_env)
+
+    script_check = """
+set -eux
+python3 --version
+python3 -m venv .venv
+source .venv/bin/activate
+pip install namespace_package --no-index --find-links /io/dist/ --force-reinstall
+python -c "from namespace_package import rust; assert rust.rust_func() == 14"
+python -c "from namespace_package import python; assert python.python_func() == 15"
+"""
+
+    session.run(
+        "docker",
+        "run",
+        "--rm",
+        "-v",
+        f"{namespace_package}:/io",
+        "-w",
+        "/io",
+        "--platform",
+        "aarch64",
+        f"python:3.{minor_version}",
         "bash",
         "-c",
         script_check,
@@ -139,8 +211,8 @@ python3 -c "from rust_with_cffi.cffi imp
 @nox.session()
 def ruff(session: nox.Session):
     session.install("ruff")
-    session.run("ruff", "format", "--check", ".")
-    session.run("ruff", ".")
+    session.run("ruff", "format", "--diff", ".")
+    session.run("ruff", "check", ".")
 
 
 @nox.session()
@@ -155,45 +227,6 @@ def test(session: nox.Session):
     session.run("pytest", "setuptools_rust", "tests", *session.posargs)
 
 
-@nox.session(name="test-mingw")
-def test_mingw(session: nox.Session):
-    # manually re-implemented test-examples to workaround
-    # https://github.com/wntrblm/nox/issues/630
-
-    oldrun = nox.command.run
-
-    def newrun(*args, **kwargs):
-        # suppress "external" error on install
-        kwargs["external"] = True
-        oldrun(*args, **kwargs)
-
-    def chdir(path: Path):
-        print(path)
-        os.chdir(path)
-
-    examples = Path(os.path.dirname(__file__)).absolute() / "examples"
-
-    with patch.object(nox.command, "run", newrun):
-        session.install(".")
-
-        session.install("--no-build-isolation", str(examples / "hello-world"))
-        session.run("print-hello")
-        session.run("sum-cli", "5", "7")
-        session.run("rust-demo", "5", "7")
-
-        session.install("pytest", "pytest-benchmark", "beautifulsoup4")
-        session.install("--no-build-isolation", str(examples / "html-py-ever"))
-        session.run("pytest", str(examples / "html-py-ever"))
-
-        session.install("pytest")
-        session.install("--no-build-isolation", str(examples / "html-py-ever"))
-        session.run("pytest", str(examples / "html-py-ever"))
-
-        session.install("pytest", "cffi<1.16")
-        session.install("--no-build-isolation", str(examples / "html-py-ever"))
-        session.run("pytest", str(examples / "html-py-ever"))
-
-
 @nox.session(name="test-examples-emscripten")
 def test_examples_emscripten(session: nox.Session):
     session.install(".", "build")
diff -pruN 1.9.0+dfsg-3/pyproject.toml 1.12.0+dfsg-1/pyproject.toml
--- 1.9.0+dfsg-3/pyproject.toml	2024-02-24 14:14:27.000000000 +0000
+++ 1.12.0+dfsg-1/pyproject.toml	2025-08-29 18:17:36.000000000 +0000
@@ -1,9 +1,9 @@
 [project]
 name = "setuptools-rust"
-version = "1.9.0"
+version = "1.12.0"
 description = "Setuptools Rust extension plugin"
 readme = "README.md"
-requires-python = ">=3.8"
+requires-python = ">=3.9"
 keywords = ["distutils", "setuptools", "rust"]
 authors = [
     {name = "Nikolay Kim", email = "fafhrd91@gmail.com"},
@@ -26,7 +26,6 @@ classifiers = [
 dependencies = [
     "setuptools>=62.4",
     "semantic_version>=2.8.2,<3",
-    'tomli>=1.2.1; python_version<"3.11"'
 ]
 
 [project.entry-points."distutils.commands"]
@@ -49,9 +48,16 @@ Changelog = "https://github.com/PyO3/set
 requires = ["setuptools>=62.4", "setuptools_scm"]
 build-backend = "setuptools.build_meta"
 
-[tool.ruff.extend-per-file-ignores]
+[tool.ruff.lint]
+extend-select = ["TID251"]
+
+[tool.ruff.lint.extend-per-file-ignores]
 "__init__.py" = ["F403"]
 
+[tool.ruff.lint.flake8-tidy-imports.banned-api]
+"subprocess.run".msg = "Use `_utils.run_subprocess` to ensure `env` is passed"
+"subprocess.check_output".msg = "Use `_utils.check_subprocess_output` to ensure `env` is passed"
+
 [tool.pytest.ini_options]
 minversion = "6.0"
 addopts = "--doctest-modules"
diff -pruN 1.9.0+dfsg-3/setuptools_rust/_utils.py 1.12.0+dfsg-1/setuptools_rust/_utils.py
--- 1.9.0+dfsg-3/setuptools_rust/_utils.py	2024-02-24 14:14:27.000000000 +0000
+++ 1.12.0+dfsg-1/setuptools_rust/_utils.py	2025-08-29 18:17:36.000000000 +0000
@@ -1,4 +1,48 @@
 import subprocess
+from typing import Any, Optional, Union, cast
+
+
+class Env:
+    """Allow using ``functools.lru_cache`` with an environment variable dictionary.
+
+    Dictionaries are unhashable, but ``functools.lru_cache`` needs all parameters to
+    be hashable, which we solve which a custom ``__hash__``."""
+
+    env: Optional[dict[str, str]]
+
+    def __init__(self, env: Optional[dict[str, str]]):
+        self.env = env
+
+    def __eq__(self, other: object) -> bool:
+        if not isinstance(other, Env):
+            return False
+        return self.env == other.env
+
+    def __hash__(self) -> int:
+        if self.env is not None:
+            return hash(tuple(sorted(self.env.items())))
+        else:
+            return hash(None)
+
+
+def run_subprocess(
+    *args: Any, env: Union[Env, dict[str, str], None], **kwargs: Any
+) -> subprocess.CompletedProcess:
+    """Wrapper around subprocess.run that requires a decision to pass env."""
+    if isinstance(env, Env):
+        env = env.env
+    kwargs["env"] = env
+    return subprocess.run(*args, **kwargs)  # noqa: TID251 # this is a wrapper to implement the rule
+
+
+def check_subprocess_output(
+    *args: Any, env: Union[Env, dict[str, str], None], **kwargs: Any
+) -> str:
+    """Wrapper around subprocess.run that requires a decision to pass env."""
+    if isinstance(env, Env):
+        env = env.env
+    kwargs["env"] = env
+    return cast(str, subprocess.check_output(*args, **kwargs))  # noqa: TID251 # this is a wrapper to implement the rule
 
 
 def format_called_process_error(
diff -pruN 1.9.0+dfsg-3/setuptools_rust/build.py 1.12.0+dfsg-1/setuptools_rust/build.py
--- 1.9.0+dfsg-3/setuptools_rust/build.py	2024-02-24 14:14:27.000000000 +0000
+++ 1.12.0+dfsg-1/setuptools_rust/build.py	2025-08-29 18:17:36.000000000 +0000
@@ -8,6 +8,7 @@ import subprocess
 import sys
 import sysconfig
 import logging
+import warnings
 from setuptools.errors import (
     CompileError,
     ExecError,
@@ -19,12 +20,11 @@ from pathlib import Path
 from typing import Dict, List, Literal, NamedTuple, Optional, Set, Tuple, cast
 
 from setuptools import Distribution
-from setuptools.command.build import build as CommandBuild
 from setuptools.command.build_ext import build_ext as CommandBuildExt
 from setuptools.command.build_ext import get_abi3_suffix
 from setuptools.command.install_scripts import install_scripts as CommandInstallScripts
 
-from ._utils import format_called_process_error
+from ._utils import check_subprocess_output, format_called_process_error, Env
 from .command import RustCommand
 from .extension import Binding, RustBin, RustExtension, Strip
 from .rustc_info import (
@@ -37,13 +37,16 @@ logger = logging.getLogger(__name__)
 
 
 try:
-    from wheel.bdist_wheel import bdist_wheel as CommandBdistWheel
-except ImportError:  # wheel installation might be deferred in PEP 517
-    from setuptools import Command as CommandBdistWheel
+    from setuptools.command.bdist_wheel import bdist_wheel as CommandBdistWheel
+except ImportError:  # old version of setuptools
+    try:
+        from wheel.bdist_wheel import bdist_wheel as CommandBdistWheel  # type: ignore[no-redef]
+    except ImportError:
+        from setuptools import Command as CommandBdistWheel  # type: ignore[assignment]
 
 
-def _check_cargo_supports_crate_type_option() -> bool:
-    version = get_rust_version()
+def _check_cargo_supports_crate_type_option(env: Optional[Env]) -> bool:
+    version = get_rust_version(env)
 
     if version is None:
         return False
@@ -75,28 +78,27 @@ class build_rust(RustCommand):
     ]
     boolean_options = ["inplace", "debug", "release", "qbuild"]
 
+    inplace: bool = False
+    debug: bool = False
+    release: bool = False
+    qbuild: bool = False
+
     plat_name: Optional[str] = None
+    build_temp: Optional[str] = None
 
     def initialize_options(self) -> None:
         super().initialize_options()
-        self.inplace = None
-        self.debug = None
-        self.release = None
-        self.qbuild = None
-        self.build_temp = None
-        self.plat_name = None
-        self.build_number = None
         self.target = os.getenv("CARGO_BUILD_TARGET")
         self.cargo = os.getenv("CARGO", "cargo")
 
     def finalize_options(self) -> None:
         super().finalize_options()
 
-        if self.plat_name is None:
-            self.plat_name = cast(
-                CommandBuild, self.get_finalized_command("build")
-            ).plat_name
-            assert isinstance(self.plat_name, str)
+        # Inherit settings from the `build` and `build_ext` commands
+        self.set_undefined_options(
+            "build",
+            ("plat_name", "plat_name"),
+        )
 
         # Inherit settings from the `build_ext` command
         self.set_undefined_options(
@@ -106,8 +108,11 @@ class build_rust(RustCommand):
             ("inplace", "inplace"),
         )
 
-        if self.build_number is not None and not self.build_number[:1].isdigit():
-            raise ValueError("Build tag (build-number) must start with a digit.")
+        if self.build_temp is not None:
+            warnings.warn(
+                "`--build-temp` argument does nothing for Rust extensions, set `CARGO_TARGET_DIR` instead.",
+                DeprecationWarning,
+            )
 
     def run_for_extension(self, ext: RustExtension) -> None:
         assert self.plat_name is not None
@@ -139,10 +144,10 @@ class build_rust(RustCommand):
     def build_extension(
         self, ext: RustExtension, forced_target_triple: Optional[str] = None
     ) -> List["_BuiltModule"]:
-        target_triple = self._detect_rust_target(forced_target_triple)
-        rustc_cfgs = get_rustc_cfgs(target_triple)
+        target_triple = self._detect_rust_target(forced_target_triple, ext.env)
+        rustc_cfgs = get_rustc_cfgs(target_triple, ext.env)
 
-        env = _prepare_build_environment()
+        env = _prepare_build_environment(ext.env, ext)
 
         if not os.path.exists(ext.path):
             raise FileError(
@@ -151,7 +156,7 @@ class build_rust(RustCommand):
 
         quiet = self.qbuild or ext.quiet
         debug = self._is_debug_build(ext)
-        use_cargo_crate_type = _check_cargo_supports_crate_type_option()
+        use_cargo_crate_type = _check_cargo_supports_crate_type_option(ext.env)
 
         package_id = ext.metadata(quiet=quiet)["resolve"]["root"]
         if package_id is None:
@@ -190,8 +195,8 @@ class build_rust(RustCommand):
                     *ext.rustc_flags,
                 ]
 
-            # OSX requires special linker arguments
-            if rustc_cfgs.get("target_os") == "macos":
+            # Apple platforms require special linker arguments
+            if rustc_cfgs.get("target_os") in {"macos", "ios", "tvos", "watchos"}:
                 ext_basename = os.path.basename(self.get_dylib_ext_path(ext, ext.name))
                 rustc_args.extend(
                     [
@@ -247,7 +252,7 @@ class build_rust(RustCommand):
             # If quiet, capture all output and only show it in the exception
             # If not quiet, forward all cargo output to stderr
             stderr = subprocess.PIPE if quiet else None
-            cargo_messages = subprocess.check_output(
+            cargo_messages = check_subprocess_output(
                 command,
                 env=env,
                 stderr=stderr,
@@ -327,10 +332,7 @@ class build_rust(RustCommand):
     def install_extension(
         self, ext: RustExtension, dylib_paths: List["_BuiltModule"]
     ) -> None:
-        debug_build = ext.debug if ext.debug is not None else self.inplace
-        debug_build = self.debug if self.debug is not None else debug_build
-        if self.release:
-            debug_build = False
+        debug_build = self._is_debug_build(ext)
 
         # Ask build_ext where the shared library would go if it had built it,
         # then copy it there.
@@ -415,7 +417,7 @@ class build_rust(RustCommand):
                     args.insert(0, "strip")
                     args.append(ext_path)
                     try:
-                        subprocess.check_output(args)
+                        check_subprocess_output(args, env=None)
                     except subprocess.CalledProcessError:
                         pass
 
@@ -475,7 +477,7 @@ class build_rust(RustCommand):
             return cast(_PyLimitedApi, bdist_wheel.py_limited_api)
 
     def _detect_rust_target(
-        self, forced_target_triple: Optional[str] = None
+        self, forced_target_triple: Optional[str], env: Env
     ) -> Optional[str]:
         assert self.plat_name is not None
         if forced_target_triple is not None:
@@ -484,14 +486,14 @@ class build_rust(RustCommand):
             return forced_target_triple
 
         # Determine local rust target which needs to be "forced" if necessary
-        local_rust_target = _adjusted_local_rust_target(self.plat_name)
+        local_rust_target = _adjusted_local_rust_target(self.plat_name, env)
 
         # Match cargo's behaviour of not using an explicit target if the
         # target we're compiling for is the host
         if (
             local_rust_target is not None
             # check for None first to avoid calling to rustc if not needed
-            and local_rust_target != get_rust_host()
+            and local_rust_target != get_rust_host(env)
         ):
             return local_rust_target
 
@@ -500,8 +502,8 @@ class build_rust(RustCommand):
     def _is_debug_build(self, ext: RustExtension) -> bool:
         if self.release:
             return False
-        elif self.debug is not None:
-            return self.debug
+        elif self.debug:
+            return True
         elif ext.debug is not None:
             return ext.debug
         else:
@@ -564,7 +566,7 @@ def create_universal2_binary(output_path
     # Try lipo first
     command = ["lipo", "-create", "-output", output_path, *input_paths]
     try:
-        subprocess.check_output(command, text=True)
+        check_subprocess_output(command, env=None, text=True)
     except subprocess.CalledProcessError as e:
         output = e.output
         raise CompileError("lipo failed with code: %d\n%s" % (e.returncode, output))
@@ -607,27 +609,38 @@ def _replace_vendor_with_unknown(target:
     return "-".join(components)
 
 
-def _prepare_build_environment() -> Dict[str, str]:
+def _prepare_build_environment(env: Env, ext: RustExtension) -> Dict[str, str]:
     """Prepares environment variables to use when executing cargo build."""
 
+    base_executable = None
+    if os.getenv("SETUPTOOLS_RUST_PEP517_USE_BASE_PYTHON"):
+        base_executable = getattr(sys, "_base_executable")
+
+    if base_executable and os.path.exists(base_executable):
+        executable = os.path.realpath(base_executable)
+    else:
+        executable = sys.executable
+
     # Make sure that if pythonXX-sys is used, it builds against the current
     # executing python interpreter.
-    bindir = os.path.dirname(sys.executable)
+    bindir = os.path.dirname(executable)
 
-    env = os.environ.copy()
-    env.update(
+    env_vars = (env.env or os.environ).copy()
+    env_vars.update(
         {
             # disables rust's pkg-config seeking for specified packages,
             # which causes pythonXX-sys to fall back to detecting the
             # interpreter from the path.
-            "PATH": os.path.join(bindir, os.environ.get("PATH", "")),
-            "PYTHON_SYS_EXECUTABLE": os.environ.get(
-                "PYTHON_SYS_EXECUTABLE", sys.executable
-            ),
-            "PYO3_PYTHON": os.environ.get("PYO3_PYTHON", sys.executable),
+            "PATH": os.path.join(bindir, env_vars.get("PATH", "")),
+            "PYTHON_SYS_EXECUTABLE": env_vars.get("PYTHON_SYS_EXECUTABLE", executable),
+            "PYO3_PYTHON": env_vars.get("PYO3_PYTHON", executable),
         }
     )
-    return env
+
+    if ext.binding == Binding.PyO3:
+        env_vars.setdefault("PYO3_BUILD_EXTENSION_MODULE", "1")
+
+    return env_vars
 
 
 def _is_py_limited_api(
@@ -681,19 +694,19 @@ def _binding_features(
 _PyLimitedApi = Literal["cp37", "cp38", "cp39", "cp310", "cp311", "cp312", True, False]
 
 
-def _adjusted_local_rust_target(plat_name: str) -> Optional[str]:
+def _adjusted_local_rust_target(plat_name: str, env: Env) -> Optional[str]:
     """Returns the local rust target for the given `plat_name`, if it is
     necessary to 'force' a specific target for correctness."""
 
     # If we are on a 64-bit machine, but running a 32-bit Python, then
     # we'll target a 32-bit Rust build.
     if plat_name == "win32":
-        if get_rustc_cfgs(None).get("target_env") == "gnu":
+        if get_rustc_cfgs(None, env).get("target_env") == "gnu":
             return "i686-pc-windows-gnu"
         else:
             return "i686-pc-windows-msvc"
     elif plat_name == "win-amd64":
-        if get_rustc_cfgs(None).get("target_env") == "gnu":
+        if get_rustc_cfgs(None, env).get("target_env") == "gnu":
             return "x86_64-pc-windows-gnu"
         else:
             return "x86_64-pc-windows-msvc"
@@ -749,6 +762,15 @@ def _find_cargo_artifacts(
     ...    kinds={"rlib"},
     ... )
     ['/file/two/baz.rlib']
+    >>> _find_cargo_artifacts(
+    ...    [
+    ...        '{"some_irrelevant_message": []}',
+    ...        '{"reason": "compiler-artifact", "package_id": "some_id", "target": {"kind": ["bin"]}, "filenames":[], "executable": "/target/debug/some_exe"}'
+    ...    ],
+    ...    package_id="some_id",
+    ...    kinds={"bin"},
+    ... )
+    ['/target/debug/some_exe']
     """
     artifacts = []
     for message in cargo_messages:
@@ -760,9 +782,12 @@ def _find_cargo_artifacts(
                 parsed.get("reason") == "compiler-artifact"
                 and parsed.get("package_id") == package_id
             ):
-                for artifact_kind, filename in zip(
-                    parsed["target"]["kind"], parsed["filenames"]
-                ):
+                filenames = parsed["filenames"]
+                if not filenames and parsed.get("executable"):
+                    # Use parsed["executable"] as the filename when filenames are empty
+                    # See https://github.com/PyO3/maturin/issues/2370
+                    filenames = [parsed["executable"]]
+                for artifact_kind, filename in zip(parsed["target"]["kind"], filenames):
                     if artifact_kind in kinds:
                         artifacts.append(filename)
     return artifacts
@@ -781,12 +806,12 @@ def _replace_cross_target_dir(path: str,
     return path.replace(cross_target_dir, local_target_dir)
 
 
-def _get_bdist_wheel_cmd(  # type: ignore[no-any-unimported]
-    dist: Distribution, create: bool = True
+def _get_bdist_wheel_cmd(
+    dist: Distribution, create: Literal[True, False] = True
 ) -> Optional[CommandBdistWheel]:
     try:
         cmd_obj = dist.get_command_obj("bdist_wheel", create=create)
         cmd_obj.ensure_finalized()  # type: ignore[union-attr]
-        return cast(CommandBdistWheel, cmd_obj)  # type: ignore[no-any-unimported]
+        return cast(CommandBdistWheel, cmd_obj)
     except Exception:
         return None
diff -pruN 1.9.0+dfsg-3/setuptools_rust/clean.py 1.12.0+dfsg-1/setuptools_rust/clean.py
--- 1.9.0+dfsg-3/setuptools_rust/clean.py	2024-02-24 14:14:27.000000000 +0000
+++ 1.12.0+dfsg-1/setuptools_rust/clean.py	2025-08-29 18:17:36.000000000 +0000
@@ -1,6 +1,7 @@
-import subprocess
 import sys
 
+from setuptools_rust._utils import check_subprocess_output
+
 from .command import RustCommand
 from .extension import RustExtension
 
@@ -25,6 +26,6 @@ class clean_rust(RustCommand):
 
         # Execute cargo command
         try:
-            subprocess.check_output(args)
+            check_subprocess_output(args, env=ext.env)
         except Exception:
             pass
diff -pruN 1.9.0+dfsg-3/setuptools_rust/command.py 1.12.0+dfsg-1/setuptools_rust/command.py
--- 1.9.0+dfsg-3/setuptools_rust/command.py	2024-02-24 14:14:27.000000000 +0000
+++ 1.12.0+dfsg-1/setuptools_rust/command.py	2025-08-29 18:17:36.000000000 +0000
@@ -52,8 +52,16 @@ class RustCommand(Command, ABC):
             return
 
         all_optional = all(ext.optional for ext in self.extensions)
+        # Use the environment of the first non-optional extension, or the first optional
+        # extension if there is no non-optional extension.
+        env = None
+        for ext in self.extensions:
+            if ext.env:
+                env = ext.env
+                if not ext.optional:
+                    break
         try:
-            version = get_rust_version()
+            version = get_rust_version(env)
             if version is None:
                 min_version = max(  # type: ignore[type-var]
                     filter(
@@ -107,5 +115,4 @@ class RustCommand(Command, ABC):
                     print(str(e))
 
     @abstractmethod
-    def run_for_extension(self, extension: RustExtension) -> None:
-        ...
+    def run_for_extension(self, extension: RustExtension) -> None: ...
diff -pruN 1.9.0+dfsg-3/setuptools_rust/extension.py 1.12.0+dfsg-1/setuptools_rust/extension.py
--- 1.9.0+dfsg-3/setuptools_rust/extension.py	2024-02-24 14:14:27.000000000 +0000
+++ 1.12.0+dfsg-1/setuptools_rust/extension.py	2025-08-29 18:17:36.000000000 +0000
@@ -1,3 +1,5 @@
+from __future__ import annotations
+
 import json
 import os
 import re
@@ -14,13 +16,15 @@ from typing import (
     NewType,
     Optional,
     Sequence,
+    TYPE_CHECKING,
     Union,
     cast,
 )
 
-from semantic_version import SimpleSpec
+if TYPE_CHECKING:
+    from semantic_version import SimpleSpec
 
-from ._utils import format_called_process_error
+from ._utils import check_subprocess_output, format_called_process_error, Env
 
 
 class Binding(IntEnum):
@@ -31,7 +35,7 @@ class Binding(IntEnum):
         PyO3: This is an extension built using
             `PyO3 <https://github.com/pyo3/pyo3>`_.
         RustCPython: This is an extension built using
-            `rust-cpython <https://github.com/dgrunwald/rust_cpython>`_.
+            `rust-cpython <https://github.com/dgrunwald/rust-cpython>`_.
         NoBinding: Bring your own bindings for the extension.
         Exec: Build an executable instead of an extension.
     """
@@ -108,6 +112,9 @@ class RustExtension:
             abort the build process, and instead simply not install the failing
             extension.
         py_limited_api: Deprecated.
+        env: Environment variables to use when calling cargo or rustc (``env=``
+            in ``subprocess.Popen``). setuptools-rust may add additional
+            variables or modify ``PATH``.
     """
 
     def __init__(
@@ -127,6 +134,7 @@ class RustExtension:
         native: bool = False,
         optional: bool = False,
         py_limited_api: Literal["auto", True, False] = "auto",
+        env: Optional[Dict[str, str]] = None,
     ):
         if isinstance(target, dict):
             name = "; ".join("%s=%s" % (key, val) for key, val in target.items())
@@ -149,6 +157,7 @@ class RustExtension:
         self.script = script
         self.optional = optional
         self.py_limited_api = py_limited_api
+        self.env = Env(env)
 
         if native:
             warnings.warn(
@@ -185,6 +194,8 @@ class RustExtension:
         if self.rust_version is None:
             return None
         try:
+            from semantic_version import SimpleSpec
+
             return SimpleSpec(self.rust_version)
         except ValueError:
             raise SetupError(
@@ -254,8 +265,8 @@ class RustExtension:
             # If quiet, capture stderr and only show it on exceptions
             # If not quiet, let stderr be inherited
             stderr = subprocess.PIPE if quiet else None
-            payload = subprocess.check_output(
-                metadata_command, stderr=stderr, encoding="latin-1"
+            payload = check_subprocess_output(
+                metadata_command, stderr=stderr, encoding="latin-1", env=self.env.env
             )
         except subprocess.CalledProcessError as e:
             raise SetupError(format_called_process_error(e))
@@ -313,6 +324,7 @@ class RustBin(RustExtension):
         debug: Optional[bool] = None,
         strip: Strip = Strip.No,
         optional: bool = False,
+        env: Optional[dict[str, str]] = None,
     ):
         super().__init__(
             target=target,
@@ -327,6 +339,7 @@ class RustBin(RustExtension):
             optional=optional,
             strip=strip,
             py_limited_api=False,
+            env=env,
         )
 
     def entry_points(self) -> List[str]:
diff -pruN 1.9.0+dfsg-3/setuptools_rust/rustc_info.py 1.12.0+dfsg-1/setuptools_rust/rustc_info.py
--- 1.9.0+dfsg-3/setuptools_rust/rustc_info.py	2024-02-24 14:14:27.000000000 +0000
+++ 1.12.0+dfsg-1/setuptools_rust/rustc_info.py	2025-08-29 18:17:36.000000000 +0000
@@ -1,16 +1,23 @@
+from __future__ import annotations
+
 import subprocess
 from setuptools.errors import PlatformError
 from functools import lru_cache
-from typing import Dict, List, NewType, Optional
+from typing import Dict, List, NewType, Optional, TYPE_CHECKING
+
+from ._utils import Env, check_subprocess_output
 
-from semantic_version import Version
+if TYPE_CHECKING:
+    from semantic_version import Version
 
 
-def get_rust_version() -> Optional[Version]:  # type: ignore[no-any-unimported]
+def get_rust_version(env: Optional[Env]) -> Optional[Version]:  # type: ignore[no-any-unimported]
     try:
         # first line of rustc -Vv is something like
         # rustc 1.61.0 (fe5b13d68 2022-05-18)
-        return Version(_rust_version().split(" ")[1])
+        from semantic_version import Version
+
+        return Version(_rust_version(env).split(" ")[1])
     except (subprocess.CalledProcessError, OSError):
         return None
 
@@ -18,11 +25,11 @@ def get_rust_version() -> Optional[Versi
 _HOST_LINE_START = "host: "
 
 
-def get_rust_host() -> str:
+def get_rust_host(env: Optional[Env]) -> str:
     # rustc -Vv has a line denoting the host which cargo uses to decide the
     # default target, e.g.
     # host: aarch64-apple-darwin
-    for line in _rust_version_verbose().splitlines():
+    for line in _rust_version_verbose(env).splitlines():
         if line.startswith(_HOST_LINE_START):
             return line[len(_HOST_LINE_START) :].strip()
     raise PlatformError("Could not determine rust host")
@@ -31,9 +38,9 @@ def get_rust_host() -> str:
 RustCfgs = NewType("RustCfgs", Dict[str, Optional[str]])
 
 
-def get_rustc_cfgs(target_triple: Optional[str]) -> RustCfgs:
+def get_rustc_cfgs(target_triple: Optional[str], env: Env) -> RustCfgs:
     cfgs = RustCfgs({})
-    for entry in get_rust_target_info(target_triple):
+    for entry in get_rust_target_info(target_triple, env):
         maybe_split = entry.split("=", maxsplit=1)
         if len(maybe_split) == 2:
             cfgs[maybe_split[0]] = maybe_split[1].strip('"')
@@ -44,25 +51,27 @@ def get_rustc_cfgs(target_triple: Option
 
 
 @lru_cache()
-def get_rust_target_info(target_triple: Optional[str] = None) -> List[str]:
+def get_rust_target_info(target_triple: Optional[str], env: Env) -> List[str]:
     cmd = ["rustc", "--print", "cfg"]
     if target_triple:
         cmd.extend(["--target", target_triple])
-    output = subprocess.check_output(cmd, text=True)
+    output = check_subprocess_output(cmd, env=env, text=True)
     return output.splitlines()
 
 
 @lru_cache()
-def get_rust_target_list() -> List[str]:
-    output = subprocess.check_output(["rustc", "--print", "target-list"], text=True)
+def get_rust_target_list(env: Env) -> List[str]:
+    output = check_subprocess_output(
+        ["rustc", "--print", "target-list"], env=env, text=True
+    )
     return output.splitlines()
 
 
 @lru_cache()
-def _rust_version() -> str:
-    return subprocess.check_output(["rustc", "-V"], text=True)
+def _rust_version(env: Env) -> str:
+    return check_subprocess_output(["rustc", "-V"], env=env, text=True)
 
 
 @lru_cache()
-def _rust_version_verbose() -> str:
-    return subprocess.check_output(["rustc", "-Vv"], text=True)
+def _rust_version_verbose(env: Env) -> str:
+    return check_subprocess_output(["rustc", "-Vv"], env=env, text=True)
diff -pruN 1.9.0+dfsg-3/setuptools_rust/setuptools_ext.py 1.12.0+dfsg-1/setuptools_rust/setuptools_ext.py
--- 1.9.0+dfsg-3/setuptools_rust/setuptools_ext.py	2024-02-24 14:14:27.000000000 +0000
+++ 1.12.0+dfsg-1/setuptools_rust/setuptools_ext.py	2025-08-29 18:17:36.000000000 +0000
@@ -1,5 +1,4 @@
 import os
-import subprocess
 import sys
 import sysconfig
 import logging
@@ -15,18 +14,25 @@ from setuptools.command.install_scripts
 from setuptools.command.sdist import sdist
 from setuptools.dist import Distribution
 
+from ._utils import Env, run_subprocess
 from .build import _get_bdist_wheel_cmd
 from .extension import Binding, RustBin, RustExtension, Strip
 
 try:
-    from wheel.bdist_wheel import bdist_wheel
+    from setuptools.command.bdist_wheel import bdist_wheel
 except ImportError:
-    bdist_wheel = None
+    try:  # old version of setuptools
+        from wheel.bdist_wheel import bdist_wheel  # type: ignore[no-redef]
+    except ImportError:
+        bdist_wheel = None  # type: ignore[assignment,misc]
 
 if sys.version_info[:2] >= (3, 11):
     from tomllib import load as toml_load
 else:
-    from tomli import load as toml_load
+    try:
+        from tomli import load as toml_load
+    except ImportError:
+        from setuptools.extern.tomli import load as toml_load
 
 
 logger = logging.getLogger(__name__)
@@ -45,7 +51,7 @@ def add_rust_extension(dist: Distributio
             (
                 "no-vendor-crates",
                 None,
-                "don't vendor Rust crates." "[default; enable with --vendor-crates]",
+                "don't vendor Rust crates. [default; enable with --vendor-crates]",
             ),
         ]
     )
@@ -90,7 +96,20 @@ def add_rust_extension(dist: Distributio
                 #
                 # https://doc.rust-lang.org/cargo/commands/cargo-build.html#manifest-options
                 cargo_manifest_args: Set[str] = set()
+                env: Optional[Env] = None
+                env_source: Optional[str] = None
                 for ext in self.distribution.rust_extensions:
+                    if env is not None:
+                        if ext.env != env:
+                            raise ValueError(
+                                f"For vendoring, all extensions must have the same environment variables, "
+                                f"but {env_source} and {ext.name} differ:\n"
+                                f"{env_source}: {env}\n"
+                                f"{ext.name}: {ext.env}"
+                            )
+                    else:
+                        env = ext.env
+                        env_source = ext.name
                     manifest_paths.append(ext.path)
                     if ext.cargo_manifest_args:
                         cargo_manifest_args.update(ext.cargo_manifest_args)
@@ -114,7 +133,7 @@ def add_rust_extension(dist: Distributio
                     # set --manifest-path before vendor_path and after --sync to workaround that
                     # See https://docs.rs/clap/latest/clap/struct.Arg.html#method.multiple for detail
                     command.extend(["--manifest-path", manifest_paths[0], vendor_path])
-                    subprocess.run(command, check=True)
+                    run_subprocess(command, env=env, check=True)
 
                     cargo_config = _CARGO_VENDOR_CONFIG
 
@@ -248,7 +267,7 @@ def add_rust_extension(dist: Distributio
     dist.cmdclass["install_scripts"] = install_scripts_rust_extension
 
     if bdist_wheel is not None:
-        bdist_wheel_base_class = cast(  # type: ignore[no-any-unimported]
+        bdist_wheel_base_class = cast(
             Type[bdist_wheel], dist.cmdclass.get("bdist_wheel", bdist_wheel)
         )
         bdist_wheel_options = bdist_wheel_base_class.user_options.copy()
diff -pruN 1.9.0+dfsg-3/setuptools_rust/version.py 1.12.0+dfsg-1/setuptools_rust/version.py
--- 1.9.0+dfsg-3/setuptools_rust/version.py	2024-02-24 14:14:27.000000000 +0000
+++ 1.12.0+dfsg-1/setuptools_rust/version.py	2025-08-29 18:17:36.000000000 +0000
@@ -1,4 +1,4 @@
-__version__ = version = "1.9.0"
+__version__ = version = "1.12.0"
 __version_tuple__ = version_tuple = tuple(
     map(lambda x: int(x[1]) if x[0] < 3 else x[1], enumerate(__version__.split(".")))
 )
diff -pruN 1.9.0+dfsg-3/tests/test_build.py 1.12.0+dfsg-1/tests/test_build.py
--- 1.9.0+dfsg-3/tests/test_build.py	2024-02-24 14:14:27.000000000 +0000
+++ 1.12.0+dfsg-1/tests/test_build.py	2025-08-29 18:17:36.000000000 +0000
@@ -5,20 +5,24 @@ from setuptools_rust.build import _adjus
 
 def test_adjusted_local_rust_target_windows_msvc():
     with mock.patch(
-        "setuptools_rust.rustc_info.get_rust_target_info", lambda _: ["target_env=msvc"]
+        "setuptools_rust.rustc_info.get_rust_target_info",
+        lambda _plat_name, _env: ["target_env=msvc"],
     ):
-        assert _adjusted_local_rust_target("win32") == "i686-pc-windows-msvc"
-        assert _adjusted_local_rust_target("win-amd64") == "x86_64-pc-windows-msvc"
+        assert _adjusted_local_rust_target("win32", None) == "i686-pc-windows-msvc"
+        assert (
+            _adjusted_local_rust_target("win-amd64", None) == "x86_64-pc-windows-msvc"
+        )
 
 
 def test_adjusted_local_rust_target_windows_gnu():
     with mock.patch(
-        "setuptools_rust.rustc_info.get_rust_target_info", lambda _: ["target_env=gnu"]
+        "setuptools_rust.rustc_info.get_rust_target_info",
+        lambda _plat_name, _env: ["target_env=gnu"],
     ):
-        assert _adjusted_local_rust_target("win32") == "i686-pc-windows-gnu"
-        assert _adjusted_local_rust_target("win-amd64") == "x86_64-pc-windows-gnu"
+        assert _adjusted_local_rust_target("win32", None) == "i686-pc-windows-gnu"
+        assert _adjusted_local_rust_target("win-amd64", None) == "x86_64-pc-windows-gnu"
 
 
 def test_adjusted_local_rust_target_macos():
     with mock.patch("platform.machine", lambda: "x86_64"):
-        assert _adjusted_local_rust_target("macosx-") == "x86_64-apple-darwin"
+        assert _adjusted_local_rust_target("macosx-", None) == "x86_64-apple-darwin"
diff -pruN 1.9.0+dfsg-3/tests/test_extension.py 1.12.0+dfsg-1/tests/test_extension.py
--- 1.9.0+dfsg-3/tests/test_extension.py	2024-02-24 14:14:27.000000000 +0000
+++ 1.12.0+dfsg-1/tests/test_extension.py	2025-08-29 18:17:36.000000000 +0000
@@ -42,7 +42,7 @@ def test_metadata_cargo_log(
     hello_world_bin.metadata(quiet=False)
     captured = capfd.readouterr()
     assert captured.out == ""
-    assert "TRACE cargo::util::config" in captured.err
+    assert "TRACE" in captured.err
 
     # With quiet set, nothing will be printed
     hello_world_bin.metadata(quiet=True)
