Skip to content

policy(rust-pypi): release Linux wheels are manylinux_2_17, enforced by soldr wheel --release and verified — never the host's glibc floor #19

Closed

Description

@zackees

Context

The fleet policy table already says "target glibc 2.17 where feasible; verify the artifact's compatibility". It doesn't say how a release wheel gets that floor, or what counts as a violation. Migrating zackees/python-rust-build-chain to soldr wheel (#17, PR zackees/python-rust-build-chain#11) exposed the gap:

  • Until now, soldr set up its glibc-2.17 toolchain only when the target differed from the host. A native x86_64 → x86_64 soldr wheel --release therefore linked the runner's glibc and was tagged manylinux_2_34+, which is honest but a silent regression. The zig path it replaced produced manylinux_2_17.
  • On PyPI that changes who can install: every x86_64 Linux user with glibc older than the CI runner's is locked out, and nothing in CI flagged it.

The owner decided (zackees/soldr#3432, being implemented now) that soldr wheel --release for a *-linux-gnu target always builds against the catalogue glibc-2.17 toolchain and claims manylinux_2_17, even when target equals host. Dev builds keep the host glibc. This is the default, not an opt-in: a release wheel must never silently get the host's floor.

Proposal: policy update (docs/policy-rust.md, "Rust apps published to PyPI or npm")

  1. Release wheel floor. Every release wheel for a *-linux-gnu target is manylinux_2_17, built with soldr wheel --release, which enforces the floor through soldr's 2.17 toolchain. musl targets are musllinux_1_2. A higher floor is a recorded exception with a reason, owner and review date, never an accident.
  2. Verify, don't trust the tag. The release (or release-candidate) workflow checks each Linux wheel's actual glibc symbol requirements against its tag, e.g. soldr's verify_wheel_glibc.py --max-glibc 2.17. It fails the job on any mismatch or any floor above policy.
  3. Where to build. Build Linux release wheels on an x86_64 Linux runner. That host produces both x86_64 and aarch64 at 2.17: aarch64 is cross-built through the catalogue. Today an aarch64 host can't produce a 2.17 wheel for either architecture (soldr#2874), so don't use ubuntu-*-arm runners for release wheels until soldr ships aarch64-hosted bundles.
  4. The floor is announced, never silent.
  5. Dev and PR builds are exempt. Quick-gate wheels may use the host glibc. They are for testing the installed artifact and are not published.

Checker rule (ci_lint + artifact check)

Acceptance criteria

Decisions

  • The floor is enforced by the build tool (soldr), and CI verifies it. A tag alone proves nothing: an unenforced 2.17 tag would install on old systems and crash with GLIBC_2.xx not found.
  • arm64 runners are excluded for release wheels only, and only until aarch64-hosted 2.17 bundles exist. Revisit this when soldr#2874's follow-up lands.

Related

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions