diff --git a/.github/workflows/build-simplejpeg.yml b/.github/workflows/build-simplejpeg.yml new file mode 100644 index 000000000..7fdc8dcdd --- /dev/null +++ b/.github/workflows/build-simplejpeg.yml @@ -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 diff --git a/patches/simplejpeg/1.9.0/0001-setup.py-dont-require-SIMD-on-riscv64.patch b/patches/simplejpeg/1.9.0/0001-setup.py-dont-require-SIMD-on-riscv64.patch new file mode 100644 index 000000000..ac33d7523 --- /dev/null +++ b/patches/simplejpeg/1.9.0/0001-setup.py-dont-require-SIMD-on-riscv64.patch @@ -0,0 +1,33 @@ +From afa7c8bd316bf4f53f02ccf55916b75618fd229a Mon Sep 17 00:00:00 2001 +From: Ludovic Henry +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 +--- + 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) +