Skip to content

pillow-jxl-plugin: Add version 1.3.8 - #2733

Open
luhenry wants to merge 2 commits into
mainfrom
pillow-jxl-plugin
Open

luhenry wants to merge 2 commits into
mainfrom
pillow-jxl-plugin

Conversation

@luhenry

@luhenry luhenry commented Oct 5, 2026 •

Copy link
Copy Markdown
Member

Builds the Pillow plugin for JPEG XL, vendor-compiling libjxl (and its highway/brotli/skcms dependencies) from source via maturin's vendored cargo feature. Upstream publishes no riscv64 wheel.

Mirrors upstream's release.yml linux job.

Differs from upstream

  • Dropped musllinux - Pillow has no musllinux_riscv64 wheel on our registry yet.
  • Dropped pp311 - PyPy has no riscv64 port.

Matrix: cp310/cp311/cp312/cp313/cp314, no abi3 - matches upstream's own per-interpreter matrix.

Testing

  • OpenEXR/pyexiv2-gated tests skip via importorskip - neither has a riscv64 wheel for all our interpreters.

License: Wheel bundles libjxl/skcms (BSD-3-Clause), highway (Apache-2.0) and brotli (MIT); upstream's own wheels ship no licence text for them, so the build adds it.

Patches

  • 0001-test-make-OpenEXR-and-pyexiv2-imports-lazy.patch - Inappropriate. Module-level imports made the whole test file fail to collect when either package is absent; reproduces off riscv64 too.
  • 0002-pyproject-widen-license-files-to-cover-vendored-libr.patch - Inappropriate. license-files had no glob, so a staged LICENSE.<lib> file was silently ignored; reproduces off riscv64 too.

CI running; counts to follow.

pillow-jxl-plugin wraps libjxl (Google's JPEG XL reference
implementation) via the jpegxl-rs/jpegxl-sys Rust crates, built
through maturin's `vendored` cargo feature, which drives libjxl's
own CMake build from source (libjxl, highway, brotli and skcms all
bundled by jpegxl-src). highway's RVV target requires
`__riscv_v_intrinsic`, which is only defined when compiling with a
`v`-carrying -march; without that flag highway's baseline collapses
to its portable EMU128/SCALAR target, and skcms gates its own SIMD
path on `!defined(__x86_64__)`, so both fall back to their generic
C++ paths automatically on riscv64 with no RVV code compiled at all -
avoiding the whole class of RVV-dispatch runtime SIGILL traps seen in
other ports. libjxl's own CMakeLists.txt already branches on
CMAKE_SYSTEM_PROCESSOR MATCHES "riscv".

Two patches: make test/test_plugin.py's OpenEXR/pyexiv2-gated tests
pytest.importorskip (pyexiv2 has no riscv64 wheel on our registry at
all, and OpenEXR has none for cp310/cp311), and widen pyproject.toml's
license-files glob so the vendored libjxl/highway/brotli/skcms licence
files staged by the workflow land in the wheel's dist-info/licenses.

Matrix mirrors upstream's own per-interpreter release matrix
(cp310-cp314; no abi3), minus pp311 (no riscv64 PyPy). musllinux is
dropped: Pillow (a runtime dependency) has no musllinux_riscv64 wheel
on our registry yet.
@github-actions

github-actions Bot commented Oct 5, 2026 •

Copy link
Copy Markdown
Contributor
PR Preview Action v1.8.1

QR code for preview link

🚀 View preview at
https://riseproject-dev.github.io/python-wheels/pr-preview/pr-2733/

Built to branch gh-pages at 2026-10-05 21:27 UTC.
Preview will be ready when the GitHub Pages deployment is complete.

Our registry only carries Pillow up to 11.3.0 for cp310 and 12.2.0 for
cp311 (Pillow 12.0 dropped cp310, 12.3.0 dropped cp311). Without
PIP_ONLY_BINARY=pillow, pip's resolver prefers the newest Pillow sdist
visible across both indexes over our older riscv64 wheel, and that
sdist then fails to build for lack of libjpeg headers in the bare test
venv.
luhenry added a commit that referenced this pull request Oct 5, 2026
@luhenry
luhenry marked this pull request as ready for review October 5, 2026 22:55
luhenry added a commit that referenced this pull request Oct 5, 2026

This branch has not been deployed

No deployments
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.

1 participant