Skip to content

Packages that use maturin/PyO3 don't build on Python3.14 unless PYO3_USE_ABI3_FORWARD_COMPATIBILITY is set #5505

@sergiocallegari

Description

@sergiocallegari

Bug Description

Encountering this with uv add spyder in a Python project where I am trying to use Python 3.14.

Spyder depends on jellyfish, and the latter uses maturin/PyO3 to build. With Python 3.14 the build fails because "the configured Python interpreter version (3.14) is newer than PyO3's maximum supported version".

The suggestion to use PYO3_USE_ABI3_FORWARD_COMPATIBILITY provided in the error messages is useful, however, it does not explain what the fundamental issue is:

  • Is it the latest version of PyO3 to still not support Python 3.14?
  • Is it jellyfish declaring dependencies in such a way that a not completely up to date version of PyO3 is used for the build?

This would be useful to know.

Steps to Reproduce

  1. mkdir TEST
  2. cd TEST
  3. uv init -p 3.14
  4. uv add spyder

Backtrace

Not really a backtrace, but possibly a useful log


Failed to build `jellyfish==1.2.0`
  ├─▶ The build backend returned an error
  ╰─▶ Call to `maturin.build_wheel` failed (exit status: 1)

      [stdout]
      Running `maturin pep517 build-wheel -i /home/callegar/.cache/uv/builds-v0/.tmp6wvEH9/bin/python --compatibility off`
      cargo 1.90.0 (840b83a10 2025-07-30)
      Rust not found, installing into a temporary directory

      [stderr]
      Python reports SOABI: cpython-314-x86_64-linux-gnu
      Computed rustc target triple: x86_64-unknown-linux-gnu
      Installation directory: /home/callegar/.cache/puccinialin
      Rustup already downloaded
      Installing rust to /home/callegar/.cache/puccinialin/rustup
      warn: It looks like you have an existing rustup settings file at:
      warn: /home/callegar/.rustup/settings.toml
      warn: Rustup will install the default toolchain as specified in the settings file,
      warn: instead of the one inferred from the default host triple.
      info: profile set to 'minimal'
      info: default host triple is x86_64-unknown-linux-gnu
      warn: Updating existing toolchain, profile choice will be ignored
      info: syncing channel updates for 'stable-x86_64-unknown-linux-gnu'
      info: default toolchain set to 'stable-x86_64-unknown-linux-gnu'
      Checking if cargo is installed
      📦 Including license file `LICENSE`
      🍹 Building a mixed python/rust project
      🔗 Found pyo3 bindings
      🐍 Found CPython 3.14 at /home/callegar/.cache/uv/builds-v0/.tmp6wvEH9/bin/python
      📡 Using build options features from pyproject.toml
         Compiling pyo3-build-config v0.24.0
         Compiling pyo3-ffi v0.24.0
         Compiling pyo3-macros-backend v0.24.0
         Compiling pyo3 v0.24.0
      error: failed to run custom build command for `pyo3-ffi v0.24.0`

      Caused by:
        process didn't exit successfully: `/home/callegar/.cache/uv/sdists-v9/pypi/jellyfish/1.2.0/JvaEWZSRN1nPpzVm0ZvYv/src/target/release/build/pyo3-ffi-138abd82707af033/build-script-build` (exit status: 1)
        --- stdout
        cargo:rustc-check-cfg=cfg(Py_LIMITED_API)
        cargo:rustc-check-cfg=cfg(Py_GIL_DISABLED)
        cargo:rustc-check-cfg=cfg(PyPy)
        cargo:rustc-check-cfg=cfg(GraalPy)
        cargo:rustc-check-cfg=cfg(py_sys_config, values("Py_DEBUG", "Py_REF_DEBUG", "Py_TRACE_REFS", "COUNT_ALLOCS"))
        cargo:rustc-check-cfg=cfg(invalid_from_utf8_lint)
        cargo:rustc-check-cfg=cfg(pyo3_disable_reference_pool)
        cargo:rustc-check-cfg=cfg(pyo3_leak_on_drop_without_reference_pool)
        cargo:rustc-check-cfg=cfg(diagnostic_namespace)
        cargo:rustc-check-cfg=cfg(c_str_lit)
        cargo:rustc-check-cfg=cfg(rustc_has_once_lock)
        cargo:rustc-check-cfg=cfg(rustc_has_extern_c_unwind)
        cargo:rustc-check-cfg=cfg(io_error_more)
        cargo:rustc-check-cfg=cfg(fn_ptr_eq)
        cargo:rustc-check-cfg=cfg(Py_3_7)
        cargo:rustc-check-cfg=cfg(Py_3_8)
        cargo:rustc-check-cfg=cfg(Py_3_9)
        cargo:rustc-check-cfg=cfg(Py_3_10)
        cargo:rustc-check-cfg=cfg(Py_3_11)
        cargo:rustc-check-cfg=cfg(Py_3_12)
        cargo:rustc-check-cfg=cfg(Py_3_13)
        cargo:rustc-check-cfg=cfg(Py_3_14)
        cargo:rerun-if-env-changed=PYO3_CROSS
        cargo:rerun-if-env-changed=PYO3_CROSS_LIB_DIR
        cargo:rerun-if-env-changed=PYO3_CROSS_PYTHON_VERSION
        cargo:rerun-if-env-changed=PYO3_CROSS_PYTHON_IMPLEMENTATION
        cargo:rerun-if-env-changed=PYO3_PRINT_CONFIG
        cargo:rerun-if-env-changed=PYO3_USE_ABI3_FORWARD_COMPATIBILITY

        --- stderr
        error: the configured Python interpreter version (3.14) is newer than PyO3's maximum supported version (3.13)
        = help: please check if an updated version of PyO3 is available. Current version: 0.24.0
        = help: set PYO3_USE_ABI3_FORWARD_COMPATIBILITY=1 to suppress this check and build anyway using the stable ABI
      warning: build failed, waiting for other jobs to finish...
      💥 maturin failed
        Caused by: Failed to build a native library through cargo
        Caused by: Cargo build finished with "exit status: 101": `env -u CARGO PYO3_BUILD_EXTENSION_MODULE="1" PYO3_ENVIRONMENT_SIGNATURE="cpython-3.14-64bit"
      PYO3_PYTHON="/home/callegar/.cache/uv/builds-v0/.tmp6wvEH9/bin/python" PYTHON_SYS_EXECUTABLE="/home/callegar/.cache/uv/builds-v0/.tmp6wvEH9/bin/python" "cargo" "rustc" "--features"
      "pyo3/extension-module" "--features" "python" "--message-format" "json-render-diagnostics" "--manifest-path" "/home/callegar/.cache/uv/sdists-v9/pypi/jellyfish/1.2.0/JvaEWZSRN1nPpzVm0ZvYv/src/Cargo.toml"
      "--release" "--lib"`
      Error: command ['maturin', 'pep517', 'build-wheel', '-i', '/home/callegar/.cache/uv/builds-v0/.tmp6wvEH9/bin/python', '--compatibility', 'off'] returned non-zero exit status 1

      hint: This usually indicates a problem with the package or the build environment.
  help: If you want to add the package regardless of the failed resolution, provide the `--frozen` flag to skip locking and syncing.

Your operating system and version

Linux/Manjaro

Your Python version (python --version)

Python 3.14.0

Your Rust version (rustc --version)

The one that gets automatically installed by maturin

Your PyO3 version

0.24.0

How did you install python? Did you use a virtualenv?

uv

Additional Info

No response

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions