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
107 changes: 107 additions & 0 deletions .github/workflows/build-unicode-segmentation-rs.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
# SPDX-FileCopyrightText: 2026 The RISE Project
# SPDX-License-Identifier: MIT
---
# Based on upstream's own wheel builder (`linux` job):
# https://github.com/WeblateOrg/unicode-segmentation-rs/blob/v0.3.3/.github/workflows/ci.yml
name: Build unicode-segmentation-rs wheels (riscv64)

on:
workflow_dispatch:
inputs:
version:
description: 'unicode-segmentation-rs version to build (git tag without leading v, e.g. 0.3.3)'
required: true
default: '0.3.3'
pull_request:
paths:
- '.github/workflows/build-unicode-segmentation-rs.yml'

concurrency:
group: ${{ github.workflow }}-${{ inputs.version || '0.3.3' }}-${{ 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.3.3 there.
UNICODE_SEGMENTATION_RS_VERSION: ${{ inputs.version || '0.3.3' }}
MANYLINUX_RISCV64_IMAGE: quay.io/pypa/manylinux_2_39_riscv64

jobs:
setup:
uses: $/.github/workflows/_setup.yml

build_wheels:
needs: [setup]
name: Build unicode-segmentation-rs ${{ inputs.version || '0.3.3' }} ${{ matrix.python }}-manylinux_riscv64
runs-on: ubuntu-24.04-riscv
timeout-minutes: 60
strategy:
fail-fast: false
matrix:
include:
# Cargo.toml enables pyo3's abi3-py310 unconditionally, so one abi3
# wheel serves every GIL-ful interpreter from cp310; pyo3 disables
# abi3 under Py_GIL_DISABLED, so cp314t gets its own per-interpreter
# wheel, and the opt-in `abi3t` feature (pyo3/abi3t-py315) gives
# cp315t+ a forward-compatible cp315-abi3.abi3t wheel -- matching the
# exact three-wheel split upstream publishes to PyPI.
- python: cp310
features: ''
- python: cp314t
features: ''
- python: cp315t
features: '--features abi3t'

steps:
- name: Checkout unicode-segmentation-rs v${{ env.UNICODE_SEGMENTATION_RS_VERSION }}
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
repository: WeblateOrg/unicode-segmentation-rs
ref: v${{ env.UNICODE_SEGMENTATION_RS_VERSION }}
persist-credentials: false

- name: Build and test wheel
uses: pypa/cibuildwheel@1828c10ab37f080699c7b81cea34097c684a7074 # v4.2.0
with:
output-dir: wheelhouse/
only: ${{ matrix.python }}-manylinux_riscv64
env:
CIBW_MANYLINUX_RISCV64_IMAGE: ${{ env.MANYLINUX_RISCV64_IMAGE }}
# unicode-segmentation-rs ships no [tool.cibuildwheel], so the Rust
# toolchain its maturin backend needs is installed in-container here.
CIBW_BEFORE_ALL_LINUX: >-
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y
CIBW_ENVIRONMENT_LINUX: >-
PATH="$PATH:$HOME/.cargo/bin"
MATURIN_PEP517_ARGS="${{ matrix.features }}"
# The cp315-abi3.abi3t wheel exports its multi-phase init entry point as
# PyModExport_unicode_segmentation_rs (defined in the extension itself, not
# imported); cibuildwheel's bundled abi3audit doesn't recognize that name and
# flags it as a non-abi3 symbol (gotcha 134), reproducing on upstream's own
# published wheel.
CIBW_AUDIT_COMMAND: ''
CIBW_TEST_REQUIRES: pytest
CIBW_TEST_SOURCES: tests
CIBW_TEST_COMMAND: >-
python -c "import unicode_segmentation_rs as m, importlib.metadata as md;
assert m.unicode_segmentation_rs.__file__.endswith('.so'), m.unicode_segmentation_rs.__file__;
assert any(str(p).endswith('licenses/LICENSE') for p in md.files('unicode-segmentation-rs'))" &&
python -m pytest -v tests

- uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: unicode-segmentation-rs-${{ env.UNICODE_SEGMENTATION_RS_VERSION }}-${{ matrix.python }}-manylinux_riscv64
path: wheelhouse/*.whl
if-no-files-found: error

publish:
name: Publish unicode-segmentation-rs ${{ inputs.version || '0.3.3' }}
needs: [setup, build_wheels]
permissions:
contents: write
pull-requests: write
uses: $/.github/workflows/_publish-wheel.yml
with:
artifact-pattern: unicode-segmentation-rs-${{ inputs.version || '0.3.3' }}-*-manylinux_riscv64