From 3dc58090ce53681f110ca95eb4eafa43e7a665f3 Mon Sep 17 00:00:00 2001 From: Ludovic Henry Date: Mon, 7 Sep 2026 16:35:05 +0200 Subject: [PATCH] lzallright: add build-lzallright.yml for riscv64 wheels Rust/PyO3 (maturin) LZO binding: single cp38-abi3 wheel built on cp39 (the riscv64 image's floor) covers cp39-cp314, with a separate cp314t wheel for the free-threaded build (image ships no cp313t, so it substitutes for upstream's cp313-cp313t). libstdc++-static (CRB-only) is installed alongside rustup for lzokay-sys's vendored C++ build. --- .github/workflows/build-lzallright.yml | 117 +++++++++++++++++++++++++ 1 file changed, 117 insertions(+) create mode 100644 .github/workflows/build-lzallright.yml diff --git a/.github/workflows/build-lzallright.yml b/.github/workflows/build-lzallright.yml new file mode 100644 index 000000000..9c000becc --- /dev/null +++ b/.github/workflows/build-lzallright.yml @@ -0,0 +1,117 @@ +# SPDX-FileCopyrightText: 2026 The RISE Project +# SPDX-License-Identifier: MIT +--- +# This workflow is based on the `Linux` job of +# https://github.com/vlaci/lzallright/blob/v0.2.6/.github/workflows/CI.yml +name: Build lzallright wheels (riscv64) + +on: + workflow_dispatch: + inputs: + version: + description: 'lzallright version to build (git tag without leading v, e.g. 0.2.6)' + required: true + default: '0.2.6' + pull_request: + paths: + - '.github/workflows/build-lzallright.yml' + +concurrency: + group: ${{ github.workflow }}-${{ inputs.version || '0.2.6' }}-${{ github.head_ref || github.run_id }} + cancel-in-progress: true + +permissions: + contents: read # to fetch code (actions/checkout) + +env: + # `inputs.version` is empty on pull_request events; default to 0.2.6 there. + LZALLRIGHT_VERSION: ${{ inputs.version || '0.2.6' }} + MANYLINUX_RISCV64_IMAGE: quay.io/pypa/manylinux_2_39_riscv64 + +jobs: + setup: + uses: $/.github/workflows/_setup.yml + + build_wheels: + needs: [setup] + name: Build lzallright ${{ inputs.version || '0.2.6' }} ${{ matrix.tag }}-manylinux_riscv64 + runs-on: ubuntu-24.04-riscv + timeout-minutes: 90 + strategy: + fail-fast: false + matrix: + include: + # pyo3/abi3-py38 is on unconditionally ([tool.maturin] features in + # pyproject.toml), so one abi3 wheel serves every GIL-ful interpreter; + # pyo3 disables abi3 under Py_GIL_DISABLED, giving the free-threaded + # build its own wheel. cp38 itself isn't in the riscv64 image (floor + # cp39); cp313t is dropped too (image ships no cp313t) -- cp314t + # substitutes for upstream's cp313-cp313t, same shape as build-primp.yml. + - tag: cp38-abi3 + # Built on cp39 -- the oldest interpreter the riscv64 image has -- + # and re-tested on the newer ones via find_compatible_wheel. + build: >- + cp39-manylinux_riscv64 cp310-manylinux_riscv64 + cp311-manylinux_riscv64 cp312-manylinux_riscv64 + cp313-manylinux_riscv64 cp314-manylinux_riscv64 + - tag: cp314t + build: cp314t-manylinux_riscv64 + + steps: + - name: Checkout lzallright v${{ env.LZALLRIGHT_VERSION }} + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + with: + repository: vlaci/lzallright + ref: v${{ env.LZALLRIGHT_VERSION }} + persist-credentials: false + + - name: Build wheels + uses: pypa/cibuildwheel@1828c10ab37f080699c7b81cea34097c684a7074 # v4.2.0 + with: + output-dir: wheelhouse/ + env: + # musllinux is dropped: rustup.rs ships no riscv64 musl toolchain. + CIBW_BUILD: ${{ matrix.build }} + CIBW_MANYLINUX_RISCV64_IMAGE: ${{ env.MANYLINUX_RISCV64_IMAGE }} + # lzallright ships no [tool.cibuildwheel]: install the Rust toolchain + # its maturin backend needs, plus the static C++ runtime lzokay-sys's + # build.rs links (libstdc++-static is CRB-only, per gotcha 77). + CIBW_BEFORE_ALL_LINUX: | + set -euo pipefail + curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y + dnf -y --enablerepo=crb install libstdc++-static + CIBW_ENVIRONMENT_LINUX: PATH="$PATH:$HOME/.cargo/bin" + CIBW_TEST_REQUIRES: pytest + # tests/test_python.py's `lorem` fixture reads benches/lorem.txt via + # request.session.path; with test-sources set, cwd is already the + # copied test root, so a bare invocation (no path arg, matching + # upstream's own `pytest`) keeps pytest's rootdir there too. + CIBW_TEST_SOURCES: tests benches/lorem.txt + CIBW_TEST_COMMAND: python -m pytest -v + + - name: Check the extension module made it into the wheel + run: | + python3 - wheelhouse/*.whl <<'EOF' + import sys, zipfile + for whl in sys.argv[1:]: + names = zipfile.ZipFile(whl).namelist() + assert any(n.startswith("lzallright/_lzallright") and n.endswith(".so") + for n in names), names + print(whl, "ok") + EOF + + - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 + with: + name: lzallright-${{ env.LZALLRIGHT_VERSION }}-${{ matrix.tag }}-manylinux_riscv64 + path: wheelhouse/*.whl + if-no-files-found: error + + publish: + name: Publish lzallright ${{ inputs.version || '0.2.6' }} + needs: [setup, build_wheels] + permissions: + contents: write + pull-requests: write + uses: $/.github/workflows/_publish-wheel.yml + with: + artifact-pattern: lzallright-${{ inputs.version || '0.2.6' }}-*-manylinux_riscv64