Skip to content
Merged
Show file tree
Hide file tree
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
144 changes: 144 additions & 0 deletions .github/workflows/build-python-stretch.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,144 @@
# SPDX-FileCopyrightText: 2026 The RISE Project
# SPDX-License-Identifier: MIT
---
# This workflow is based on upstream's own wheel build setup:
# https://github.com/gregogiudici/python-stretch/blob/ac1fbfc9f5d6b912e2a9248d8e0f53888846588b/.github/workflows/wheels.yml
# https://github.com/gregogiudici/python-stretch/blob/ac1fbfc9f5d6b912e2a9248d8e0f53888846588b/pyproject.toml
name: Build python-stretch wheels (riscv64)

on:
workflow_dispatch:
inputs:
version:
description: 'Version glob to (re)build; empty builds every version of docs/packages/python-stretch.yaml not released yet'
required: false
default: ''
pull_request:
branches: [main]
paths:
- '.github/workflows/build-python-stretch.yml'
- 'docs/packages/python-stretch.yaml'
push:
branches: [main]
paths:
- '.github/workflows/build-python-stretch.yml'
- 'docs/packages/python-stretch.yaml'

concurrency:
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
cancel-in-progress: true

permissions:
contents: read # to fetch code (actions/checkout)

env:
# Upstream releases without git tags; this is the 0.3.1 release commit, byte-identical
# to the PyPI sdist (submodule included). Update alongside the version in the docs YAML.
PYTHON_STRETCH_REF: ac1fbfc9f5d6b912e2a9248d8e0f53888846588b
MANYLINUX_RISCV64_IMAGE: quay.io/pypa/manylinux_2_39_riscv64
MUSLLINUX_RISCV64_IMAGE: quay.io/pypa/musllinux_1_2_riscv64

jobs:
setup:
uses: $/.github/workflows/_setup.yml
with:
package: python-stretch
version: ${{ inputs.version }}

build_wheels:
needs: [setup]
if: needs.setup.outputs.versions != '[]'
name: Build python-stretch ${{ matrix.version }} cp312-abi3-${{ matrix.libc }}_riscv64
runs-on: ubuntu-24.04-riscv
strategy:
fail-fast: false
matrix:
version: ${{ fromJSON(needs.setup.outputs.versions) }}
libc: [manylinux, musllinux]
include:
- libc: manylinux
test_requires: pytest numpy
test_command: pytest {project}/tests
# No musllinux riscv64 numpy wheel exists, and every process() call takes one.
- libc: musllinux
test_requires: ''
test_command: >-
python -c "import python_stretch as ps;
s = ps.Signalsmith.Stretch();
s.preset(2, 44100.0);
s.setTimeFactor(0.5);
s.setTransposeSemitones(12);
assert (s.blockSamples(), s.intervalSamples(), s.inputLatency()) == (5292, 1323, 2646), (s.blockSamples(), s.intervalSamples(), s.inputLatency());
print('python_stretch OK')"

env:
PYTHON_STRETCH_VERSION: ${{ matrix.version }}

steps:
- name: Checkout python-stretch ${{ env.PYTHON_STRETCH_VERSION }}
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
repository: gregogiudici/python-stretch
ref: ${{ env.PYTHON_STRETCH_REF }}
submodules: true
persist-credentials: false

- name: Check version
run: grep -qx "version = \"${PYTHON_STRETCH_VERSION}\"" pyproject.toml

- name: Stage bundled licences
run: |
cp include/stretch/LICENSE.txt LICENSE.signalsmith-stretch.txt
cp include/stretch/dsp/LICENSE.txt LICENSE.signalsmith-dsp.txt

- uses: pypa/cibuildwheel@1828c10ab37f080699c7b81cea34097c684a7074 # v4.2.0
env:
CIBW_BEFORE_BUILD: >-
python -m pip install nanobind &&
python -c "import importlib.metadata as m, shutil; shutil.copy(next(f.locate() for f in m.files('nanobind') if f.name == 'LICENSE'), '{project}/LICENSE.nanobind')"
CIBW_ARCHS: riscv64
CIBW_BUILD: >-
cp312-${{ matrix.libc }}_riscv64
cp313-${{ matrix.libc }}_riscv64
cp314-${{ matrix.libc }}_riscv64
CIBW_MANYLINUX_RISCV64_IMAGE: ${{ env.MANYLINUX_RISCV64_IMAGE }}
CIBW_MUSLLINUX_RISCV64_IMAGE: ${{ env.MUSLLINUX_RISCV64_IMAGE }}
CIBW_ENVIRONMENT: PIP_EXTRA_INDEX_URL=https://pypi.riseproject.dev/simple/
CIBW_TEST_REQUIRES: ${{ matrix.test_requires }}
CIBW_TEST_COMMAND: ${{ matrix.test_command }}

- name: Check the bundled licences made it into the wheel
run: |
python3 - wheelhouse/*.whl <<'EOF'
import sys, zipfile
expected = {"LICENSE", "LICENSE.signalsmith-stretch.txt", "LICENSE.signalsmith-dsp.txt", "LICENSE.nanobind"}
for whl in sys.argv[1:]:
names = zipfile.ZipFile(whl).namelist()
found = {n.rsplit("/", 1)[1] for n in names if ".dist-info/licenses/" in n}
assert expected <= found, f"{whl}: missing {expected - found}"
assert "-cp312-abi3-" in whl, whl
print(whl, sorted(found))
EOF

- uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: python-stretch-${{ env.PYTHON_STRETCH_VERSION }}-cp312-abi3-${{ matrix.libc }}_riscv64
path: ./wheelhouse/*.whl
if-no-files-found: error

publish:
name: Publish python-stretch ${{ matrix.version }}
needs: [setup, build_wheels]
if: needs.setup.outputs.versions != '[]'
strategy:
fail-fast: false
matrix:
version: ${{ fromJSON(needs.setup.outputs.versions) }}
permissions:
contents: write
pull-requests: write
uses: $/.github/workflows/_publish-wheel.yml
secrets:
app-private-key: ${{ secrets.RISEPROJECT_APP_PRIVATE_KEY }}
with:
artifact-pattern: python-stretch-${{ matrix.version }}-*riscv64
5 changes: 5 additions & 0 deletions docs/packages/python-stretch.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package-name: python-stretch
source-code: https://github.com/gregogiudici/python-stretch
license: MIT
versions:
- version: 0.3.1
Loading