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
103 changes: 103 additions & 0 deletions .github/workflows/build-simplejpeg.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
# SPDX-FileCopyrightText: 2026 The RISE Project
# SPDX-License-Identifier: MIT
---
# This workflow is based on upstream's own cibuildwheel-driven
# https://github.com/jfolz/simplejpeg/blob/1.9.0/.github/workflows/build_wheels.yml, narrowed to
# Linux riscv64.
name: Build simplejpeg wheels (riscv64)

on:
workflow_dispatch:
inputs:
version:
description: 'simplejpeg version to build (git tag, e.g. 1.9.0)'
required: true
default: '1.9.0'
pull_request:
paths:
- '.github/workflows/build-simplejpeg.yml'
- 'patches/simplejpeg/**'

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

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

env:
SIMPLEJPEG_VERSION: ${{ inputs.version || '1.9.0' }}
MANYLINUX_RISCV64_IMAGE: quay.io/pypa/manylinux_2_39_riscv64

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

build_wheels:
needs: [setup]
name: Build simplejpeg ${{ inputs.version || '1.9.0' }} ${{ matrix.python }}-manylinux_riscv64
runs-on: ubuntu-24.04-riscv
strategy:
fail-fast: false
matrix:
python: ["cp312", "cp313", "cp314"]

steps:
- name: Checkout simplejpeg v${{ env.SIMPLEJPEG_VERSION }}
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
repository: jfolz/simplejpeg
ref: ${{ env.SIMPLEJPEG_VERSION }}
persist-credentials: false

- name: Checkout python-wheels
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
path: python-wheels
persist-credentials: false

- name: Patch simplejpeg source
run: git apply python-wheels/patches/simplejpeg/${{ env.SIMPLEJPEG_VERSION }}/*.patch

- name: Build wheels
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 }}
# Upstream's before-all installs nasm to assemble libjpeg-turbo's x86 SIMD kernels;
# the patch above disables SIMD on riscv64 (no such kernels), so it's not needed here.
CIBW_BEFORE_ALL_LINUX: "true"
CIBW_BEFORE_BUILD: curl -fsSL -o {project}/LICENSE.libjpeg-turbo https://raw.githubusercontent.com/libjpeg-turbo/libjpeg-turbo/3.1.2/LICENSE.md
CIBW_ENVIRONMENT: >-
PIP_ONLY_BINARY=:all:
PIP_EXTRA_INDEX_URL=https://pypi.riseproject.dev/simple/

- name: Check the wheel contents
run: |
python3 - wheelhouse/*.whl <<'EOF'
import sys, zipfile
for whl in sys.argv[1:]:
names = zipfile.ZipFile(whl).namelist()
assert any(n.startswith("simplejpeg/_jpeg") and n.endswith(".so") for n in names), whl
licenses = {n.rsplit("/", 1)[1] for n in names if ".dist-info/licenses/" in n} - {""}
assert licenses == {"LICENSE", "LICENSE.libjpeg-turbo"}, (whl, licenses)
print(whl, "ok")
EOF

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

publish:
name: Publish simplejpeg ${{ inputs.version || '1.9.0' }}
needs: [setup, build_wheels]
permissions:
contents: write
pull-requests: write
uses: $/.github/workflows/_publish-wheel.yml
with:
artifact-pattern: simplejpeg-${{ inputs.version || '1.9.0' }}-*-manylinux_riscv64
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
From afa7c8bd316bf4f53f02ccf55916b75618fd229a Mon Sep 17 00:00:00 2001
From: Ludovic Henry <git@ludovic.dev>
Date: Mon, 7 Sep 2026 21:02:32 +0200
Subject: [PATCH] setup.py: don't require SIMD when building libjpeg-turbo on
riscv64

libjpeg-turbo's simd/CMakeLists.txt only ships SIMD kernels for
x86/x86-64/Arm/MIPS/PowerPC; REQUIRE_SIMD=1 turns the unsupported-arch
warning into a hard cmake configure failure on riscv64. The option's
own default (off) already falls back to a portable non-SIMD build with
just a warning, so only force it on for the architectures that have a
kernel.

Upstream-Status: Inappropriate [libjpeg-turbo has no riscv64 SIMD kernels]

Signed-off-by: Ludovic Henry <git@ludovic.dev>
---
setup.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/setup.py b/setup.py
index bfcbf6b..52d9035 100644
--- a/setup.py
+++ b/setup.py
@@ -165,7 +165,7 @@ class cmake_build_ext(build_ext):
*flags,
'-DWITH_CRT_DLL=1', # fixes https://bugs.python.org/issue24872
'-DENABLE_SHARED=0',
- '-DREQUIRE_SIMD=1',
+ '-DREQUIRE_SIMD=' + ('0' if ARCH == 'riscv64' else '1'),
'-DCMAKE_POSITION_INDEPENDENT_CODE=ON',
], env=env)