Skip to content

fixup_for_abi3_version downgrades version causing wrong link library name when cross-compiling for Android #5960

@messense

Description

@messense

Bug Description

When cross-compiling an abi3 extension module for Android with PYO3_CROSS_LIB_DIR pointing to a Python 3.14 installation (via build-details.json), the linker fails with:

ld.lld: error: unable to find library -lpython3.7m

The target has Python 3.14, but pyo3 generates -lpython3.7m instead.

See the full CI log: https://github.com/PyO3/maturin-action/actions/runs/24198305015/job/70634639917

Root Cause

In from_pyo3_config_file_env(), after reading the config file (which has version=3.14, abi3=false), the following happens:

  1. config.abi3 |= is_abi3() → sets abi3 = true (from Cargo feature)
  2. config.fixup_for_abi3_version(get_abi3_version()) → unconditionally sets self.version = 3.7 (from abi3-py37 minimum)
  3. apply_default_lib_name_to_config_file() → computes lib_name from the now-downgraded version 3.7
  4. default_lib_name_unix() for version 3.7 returns "python3.7m" (the m abiflag workaround for <= 3.7)
  5. Since is_linking_libpython_for_target() returns true for Android, this incorrect library name is emitted as -lpython3.7m

The fundamental problem is that fixup_for_abi3_version downgrades version to the abi3 minimum, but version is then also used to derive the link library name. The abi3 minimum version is relevant for the Python C API compatibility level, but the link library should match the actual target Python installation, not the abi3 minimum.

Steps to Reproduce

  1. Set up cross-compilation for aarch64-linux-android
  2. Download the Android Python 3.14 standalone build
  3. Set PYO3_CROSS_LIB_DIR to the Python prefix/lib directory (containing build-details.json)
  4. Build an abi3 pyo3 crate (e.g., with abi3-py37 feature)

The build will fail with unable to find library -lpython3.7m.

Environment

  • pyo3 v0.28.2
  • Target: aarch64-linux-android
  • Python: 3.14.3 (standalone Android build from python.org)
  • maturin sets PYO3_CONFIG_FILE with version=3.14, abi3=false, lib_dir=<PYO3_CROSS_LIB_DIR>

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions