Bump cibuildwheel to 4.2.0 to fix musllinux riscv64 wheels by gounthar · Pull Request #1146 · msgspec/msgspec · GitHub
Skip to content

Bump cibuildwheel to 4.2.0 to fix musllinux riscv64 wheels - #1146

Merged
sobolevn merged 2 commits into
msgspec:mainfrom
gounthar:fix/cibuildwheel-4.2.0-musllinux-riscv64
Aug 11, 2026
Merged

Bump cibuildwheel to 4.2.0 to fix musllinux riscv64 wheels#1146
sobolevn merged 2 commits into
msgspec:mainfrom
gounthar:fix/cibuildwheel-4.2.0-musllinux-riscv64

Conversation

@gounthar

Copy link
Copy Markdown
Contributor

The 0.22.0 release run died on cp310-musllinux_riscv64 with Command ['which', 'uv'] failed with code 1, from my riscv64 matrix entry. All six manylinux riscv64 wheels in that same job built, repaired and tested fine, so it is specific to the musllinux image.

pypa/manylinux used to skip installing uv in the musllinux riscv64 image. At the commit the pinned image was built from (8dbfa8e, 4 June), docker/build_scripts/finalize.sh had:

musllinux*_riscv64-uv) continue;;  # uv doesn't provide musl riscv64 wheels due to Rust issues

That was removed by pypa/manylinux#1969 on 11 July, and their image test suite now runs uv venv / uv pip install inside musllinux riscv64. The comment was already out of date when it was written: uv has published a manylinux_2_31_riscv64.musllinux_1_1_riscv64 wheel since 0.11.18 (1 June).

The pins differ across cibuildwheel releases:

cibuildwheel musllinux_1_2_riscv64 image uv present
4.1.0 2026.06.04-1 no
4.2.0 2026.08.04-1 yes

So build-frontend = "build[uv]" has nothing to find on 4.1.0. This bumps both uvx --from pins to 4.2.0.

4.2.0 builds CPython 3.15 by default, but .cibuildwheel.toml sets an explicit build = "cp310-* cp311-* cp312-* cp313-* cp314-* cp314t-*" list, so no new target appears. The rest of that release is Pyodide 314.0.4, a GraalPy pip hold, and download retries.

I have not run this. The reasoning is from the failing job log and the manylinux source, not from a green build. CI here will not test it either unless someone adds the build-riscv64 label, since the riscv64 job is excluded on unlabelled PRs, and even then CIBW_SKIP drops musllinux outside a release build. So the honest state is that only a release run proves it. If you would rather not move cibuildwheel right before a release, musllinux-riscv64-image in .cibuildwheel.toml pins just that one image and leaves everything else alone.

Two things worth knowing either way:

The riscv64 job is gated behind the build-riscv64 label on PRs, and CIBW_SKIP drops musllinux unless build-all is set. So nothing had ever exercised musllinux riscv64 until the release turned build-all on. Whatever you decide here, that combination will keep hiding riscv64 musllinux breakage until release day.

Dependabot covers github-actions and uv, but the cibuildwheel version is an inline uvx --from argument rather than a tracked dependency, which is why it sat at 4.1.0. Moving it into the uv ecosystem somehow would stop the next one, though I do not have a clean suggestion for how.

Refs #1134, #987

Signed-off-by: Bruno Verachten <gounthar@gmail.com>
@gounthar gounthar mentioned this pull request Aug 11, 2026
@sobolevn sobolevn added the build-riscv64 Build for RISC-V label Aug 11, 2026

@sobolevn sobolevn left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you! It works now 🎉

@sobolevn
sobolevn added this pull request to the merge queue Aug 11, 2026
Merged via the queue into msgspec:main with commit 1ce4481 Aug 11, 2026
25 checks passed
Brohammad pushed a commit to Brohammad/msgspec that referenced this pull request Sep 4, 2026
The 0.21.1 to 0.22.0 changelog batch (msgspec#1112) landed on 2026-07-03. Four
user-visible changes merged between then and the 0.22.0 release on
2026-08-11 never got an entry:

- msgspec#700, overloads on the `Meta` stub, so type checkers reject mixing
`gt` with `ge` and `lt` with `le`
- msgspec#1028, `null` placed last in the `anyOf` generated for optional unions
- msgspec#1114, `__struct_encode_fields__` added to `src/msgspec/__init__.pyi`
(its companion msgspec#813 only touched `tests/typing`, so it needs no entry of
its own)
- msgspec#1118, `json.encode` raising `TypeError` for a `dict` keyed by a plain
`str`-valued `enum.Enum`

I went over every PR merged in that window. The rest need no entry: msgspec#813
and msgspec#1117 are tests only, msgspec#1121 fixes an unreleased regression from
msgspec#1028, msgspec#1145 is an unused variable under free-threaded builds, and msgspec#1146
and msgspec#1148 are CI and tooling. msgspec#1127, msgspec#1135 and msgspec#1080 already have
entries.

Docs build clean with `--fail-on-warning`.

Note for whoever retries the release: the section is still headed
`Version 0.22.0 (2026-08-11)`, and that date will need updating, since
the tag was deleted after the upload failed. Refs msgspec#1134.

Co-authored-by: Siyet <Siyet@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

build-riscv64 Build for RISC-V

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants