Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
117 changes: 117 additions & 0 deletions .github/workflows/build-lzallright.yml
Original file line number Diff line number Diff line change
@@ -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