Skip to content

tags: floor riscv64 and loongarch64 at glibc 2.17 like every other arch - #43

Merged
jonyoder merged 1 commit into
mainfrom
fix/manylinux-nonx86-floors
Aug 27, 2026
Merged

jonyoder merged 1 commit into
mainfrom
fix/manylinux-nonx86-floors

Conversation

@jonyoder

Copy link
Copy Markdown
Collaborator

Closes #42.

riscv64 and loongarch64 now claim the same manylinux series as every other non-x86 architecture: floored at glibc 2.17, with the manylinux2014_<arch> legacy alias.

Both were inherited from uv's floor table, which floors them at 2.31 and 2.36 and records no legacy alias. Because a target below its floor claims no manylinux tag at all rather than a shortened list, that was not marginal:

target before after pypa/packaging 26.2
loongarch64 glibc 2.35 42 582 582
riscv64 glibc 2.28 42 393 393
aarch64 glibc 2.35 (control) 582 582 582

Both figures now match packaging exactly. glibc 2.35 on loongarch64 is a real configuration (Loongnix, Debian), and such a host was previously offered no manylinux wheel at all.

Both causes had to be fixed together. Raising the floor alone leaves the alias missing, because packaging's legacy map is keyed by glibc version alone and is therefore architecture-independent.

Why widen rather than keep uv's numbers

This package answers "is this wheel installable on the declared target", and the thing that ultimately installs is pip, which uses packaging. Being narrower than pip rejects wheels pip would accept — for a mirror or an offline bundle that means silently omitting content the client then cannot obtain. Being wider only costs bytes. Where the two upstreams disagree, follow the one pip uses.

tags/doc.go has recorded this as a known limitation since the #18766 work, which deliberately left it alone ("deserves its own decision. Tracked for follow-up"). That note and the doc bullet are now removed.

Testing

TestLinux_NarrowNonX86Floors existed only to pin the narrow output, and is replaced by TestLinux_NonX86FloorsAreUniform — a parity assertion that every non-x86 architecture claims the same manylinux series as aarch64, with the reference itself guarded so a regression there cannot make the comparison vacuous. Written as parity rather than a hardcoded tag list so it keeps holding as the manylinux series grows, and so re-narrowing any single architecture fails it.

gofmt clean, go vet ./... clean, full module suite green (including the packaging-generated golden fixtures, which cover the architectures this does not touch).

Found while designing PyPI dependency-closure filtering for the Package Manager offline downloader, where a narrower-than-pip tag set is precisely an air-gapped missing-package failure.

🤖 Generated with Claude Code

…ch (#42)

Both architectures were inherited from uv's floor table, which floors them
at glibc 2.31 and 2.36 and records no legacy alias for either. Because a
target below its floor claims no manylinux tag at all rather than a
shortened list, a loongarch64 host on glibc 2.35 was offered 42 tags where
pypa/packaging 26.2 computes 582, so no manylinux wheel whatsoever.
riscv64 on glibc 2.28 gave 42 against 393. Both now match packaging
exactly.

Raising the floor alone is not enough: packaging's legacy map is keyed by
glibc version alone and is therefore architecture-independent, so
manylinux2014_<arch> applies to these architectures too.

Direction matters for the consumers. This package answers whether a wheel
is installable on the declared target, and the thing that ultimately
installs is pip. Being narrower than pip rejects wheels pip would accept,
which for a mirror or an offline bundle means silently omitting content the
client cannot then obtain. Being wider only costs bytes.

Replaces TestLinux_NarrowNonX86Floors, which pinned the old narrow output,
with TestLinux_NonX86FloorsAreUniform: a parity assertion against aarch64
that keeps holding as the manylinux series grows, and that fails if any
single architecture is re-narrowed.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@jonyoder
jonyoder merged commit fd79ab2 into main Aug 27, 2026
4 checks passed
@jonyoder
jonyoder deleted the fix/manylinux-nonx86-floors branch August 27, 2026 14:37
jonyoder added a commit that referenced this pull request Aug 28, 2026
Dates [Unreleased] as 0.9.0 (2026-08-28) and adds its compare link. CHANGELOG only.

A minor bump under the 0.x policy because two changes alter observable behaviour: reqtxt now recognizes --all-releases/--only-final/--use-feature (an unrecognized option was assumed boolean, so its argument became a fabricated requirement), and a standalone --hash line is accepted rather than rejected, matching pip.

Contents since v0.8.0: tags manylinux floor fix (#43), marker EvaluateUndecidable/Variables (#47), tags IsCompatibleOrNewer/CompileAnyLibc/Archs (#48), reqtxt Source and pip-parity fixes (#49), dependency bumps (#50).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

tags: riscv64 and loongarch64 claim no manylinux tag at all below uv's floors

1 participant