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
109 changes: 109 additions & 0 deletions .github/workflows/build-resvg-py.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
# SPDX-FileCopyrightText: 2026 The RISE Project
# SPDX-License-Identifier: MIT
---
# This workflow is based on the `linux` job of
# https://github.com/baseplate-admin/resvg-py/blob/0.5.0/.github/workflows/CI.yaml
name: Build resvg-py wheels (riscv64)

on:
workflow_dispatch:
inputs:
version:
description: 'resvg-py version to build (git tag, e.g. 0.5.0)'
required: true
default: '0.5.0'
pull_request:
paths:
- '.github/workflows/build-resvg-py.yml'

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

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

build_wheels:
needs: [setup]
name: Build resvg-py ${{ inputs.version || '0.5.0' }} ${{ matrix.tag }}-manylinux_riscv64
runs-on: ubuntu-24.04-riscv
timeout-minutes: 60
strategy:
fail-fast: false
matrix:
include:
# Cargo.toml enables pyo3's abi3-py310 and abi3t-py315 unconditionally,
# so one abi3 wheel serves every GIL-ful interpreter from cp310; pyo3
# disables plain abi3 under Py_GIL_DISABLED, so cp314t gets its own
# per-interpreter wheel; and abi3t-py315 gives cp315t+ a forward-compatible
# cp315-abi3.abi3t wheel -- matching the exact three-wheel split
# upstream publishes to PyPI.
- tag: cp310-abi3
build: >-
cp310-manylinux_riscv64 cp311-manylinux_riscv64
cp312-manylinux_riscv64 cp313-manylinux_riscv64
cp314-manylinux_riscv64
- tag: cp314t
build: cp314t-manylinux_riscv64
- tag: cp315t
build: cp315t-manylinux_riscv64

steps:
- name: Checkout resvg-py ${{ env.RESVG_PY_VERSION }}
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
repository: baseplate-admin/resvg-py
ref: ${{ env.RESVG_PY_VERSION }}
persist-credentials: false

- name: Build and test wheel
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 }}
# resvg-py 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"
# The cp315-abi3.abi3t wheel exports its multi-phase init entry point as
# PyModExport_resvg_py (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 pyperclip
CIBW_TEST_SOURCES: tests
CIBW_TEST_COMMAND: >-
python -c "import resvg_py.resvg_py as m, importlib.metadata as md;
assert m.__file__.endswith('.so'), m.__file__;
assert any(str(p).endswith('licenses/LICENSE') for p in md.files('resvg_py'))" &&
python -m pytest -v tests

- uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: resvg-py-${{ env.RESVG_PY_VERSION }}-${{ matrix.tag }}-manylinux_riscv64
path: wheelhouse/*.whl
if-no-files-found: error

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