From e37ff7e4efcc687ec889853d92ab4c671e7b07d5 Mon Sep 17 00:00:00 2001 From: Ludovic Henry Date: Wed, 26 Aug 2026 21:13:56 +0200 Subject: [PATCH] hiredis: add build-hiredis.yml for riscv64 wheels Mirrors the `build_wheels` job of upstream's REUSABLE-wheeler.yaml, narrowed to manylinux_riscv64. hiredis-py has no [tool.cibuildwheel] table, so the image and the test invocation are supplied here; the test suite is the one upstream runs in integration.yaml, minus pytest-memray, which has no riscv64 build. The wheel statically compiles vendor/hiredis (hiredis v1.4.1, BSD 3-clause) but ships only the package's own MIT LICENSE, so a patch adds the vendored notice at the project root where setuptools' default license_files glob picks it up. The test command asserts both licences are present in the installed wheel so the patch cannot silently stop applying. --- .github/workflows/build-hiredis.yml | 106 ++++++++++++++++++ ...-hiredis-licence-next-to-the-package.patch | 58 ++++++++++ 2 files changed, 164 insertions(+) create mode 100644 .github/workflows/build-hiredis.yml create mode 100644 patches/hiredis/3.4.1/0001-add-the-vendored-hiredis-licence-next-to-the-package.patch diff --git a/.github/workflows/build-hiredis.yml b/.github/workflows/build-hiredis.yml new file mode 100644 index 000000000..9d973577a --- /dev/null +++ b/.github/workflows/build-hiredis.yml @@ -0,0 +1,106 @@ +# SPDX-FileCopyrightText: 2026 The RISE Project +# SPDX-License-Identifier: MIT +--- +# This workflow is based on: https://github.com/redis/hiredis-py/blob/v3.4.1/.github/workflows/REUSABLE-wheeler.yaml +name: Build hiredis wheels (riscv64) + +on: + workflow_dispatch: + inputs: + version: + description: 'hiredis version to build (git tag without the leading v, e.g. 3.4.1)' + required: true + default: '3.4.1' + pull_request: + paths: + - '.github/workflows/build-hiredis.yml' + - 'patches/hiredis/**' + +concurrency: + group: ${{ github.workflow }}-${{ inputs.version || '3.4.1' }}-${{ 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 3.4.1 there. + HIREDIS_VERSION: ${{ inputs.version || '3.4.1' }} + MANYLINUX_RISCV64_IMAGE: quay.io/pypa/manylinux_2_39_riscv64 + +jobs: + build_wheels: + name: Build hiredis ${{ inputs.version || '3.4.1' }} ${{ matrix.python }}-manylinux_riscv64 + runs-on: ubuntu-24.04-riscv + strategy: + fail-fast: false + matrix: + python: ["cp312", "cp313", "cp314", "cp314t"] + + steps: + - name: Checkout hiredis v${{ env.HIREDIS_VERSION }} + uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 + with: + repository: redis/hiredis-py + ref: v${{ env.HIREDIS_VERSION }} + submodules: recursive + persist-credentials: false + + - name: Checkout python-wheels + uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 + with: + path: python-wheels + persist-credentials: false + + - name: Patch hiredis source + run: git apply python-wheels/patches/hiredis/${{ env.HIREDIS_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 wheel job runs no tests; this is its integration.yaml suite, + # minus pytest-memray, which has no riscv64 build (sdist only, and it needs + # libunwind/liblz4 headers the image does not ship). + CIBW_TEST_REQUIRES: pytest + CIBW_TEST_SOURCES: tests + CIBW_TEST_COMMAND: >- + python -c "import importlib.metadata as m; f = sorted(p.name for p in m.files('hiredis') if '.dist-info/licenses/' in str(p)); assert f == ['LICENSE', 'LICENSE.hiredis'], f" + && python -m pytest tests + + - name: Check the extension made it into the wheel + run: | + python3 - wheelhouse/*.whl <<'EOF' + import sys, zipfile + for whl in sys.argv[1:]: + names = zipfile.ZipFile(whl).namelist() + assert any(n.startswith("hiredis/hiredis.") and n.endswith(".so") for n in names), whl + print(whl, "ok") + EOF + + - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 + with: + name: hiredis-${{ env.HIREDIS_VERSION }}-${{ matrix.python }}-manylinux_riscv64 + path: wheelhouse/*.whl + if-no-files-found: error + + publish: + name: Publish hiredis ${{ inputs.version || '3.4.1' }} to GitLab + needs: [build_wheels] + runs-on: ubuntu-latest + permissions: + contents: write + pull-requests: write + + steps: + - name: Publish wheels and open docs PR + uses: riseproject-dev/python-wheels/actions/publish-wheels@main + with: + artifact-pattern: hiredis-${{ env.HIREDIS_VERSION }}-*-manylinux_riscv64 + gitlab-username: ${{ vars.GITLAB_DEPLOY_USER }} + gitlab-token: ${{ secrets.GITLAB_DEPLOY_TOKEN }} + gitlab-project-id: ${{ vars.GITLAB_PROJECT_ID }} + gh-token: ${{ secrets.GITHUB_TOKEN }} diff --git a/patches/hiredis/3.4.1/0001-add-the-vendored-hiredis-licence-next-to-the-package.patch b/patches/hiredis/3.4.1/0001-add-the-vendored-hiredis-licence-next-to-the-package.patch new file mode 100644 index 000000000..471078059 --- /dev/null +++ b/patches/hiredis/3.4.1/0001-add-the-vendored-hiredis-licence-next-to-the-package.patch @@ -0,0 +1,58 @@ +From 73c6977ad99373e411049acfb781b18d67a55c12 Mon Sep 17 00:00:00 2001 +From: Ludovic Henry +Date: Wed, 26 Aug 2026 21:11:29 +0200 +Subject: [PATCH] add the vendored hiredis licence next to the package's own + +Upstream-Status: To upstream [not yet submitted; the same gap exists in every hiredis wheel on PyPI, so this needs a maintainer discussion rather than a drive-by PR] + +setup.py compiles vendor/hiredis (hiredis v1.4.1, BSD 3-clause) straight +into the hiredis.hiredis extension, and that licence requires the +copyright notice to be reproduced with binary redistributions. The wheel +ships only the package's own MIT LICENSE: setuptools globs license files +from the project root, and vendor/hiredis/COPYING is not there. + +Add the vendored notice at the root as LICENSE.hiredis, which the default +LICEN[CS]E* glob picks up, so it lands in dist-info/licenses/ beside +LICENSE with no packaging change. + +Signed-off-by: Ludovic Henry +--- + LICENSE.hiredis | 29 +++++++++++++++++++++++++++++ + 1 file changed, 29 insertions(+) + create mode 100644 LICENSE.hiredis + +diff --git a/LICENSE.hiredis b/LICENSE.hiredis +new file mode 100644 +index 0000000..a5fc973 +--- /dev/null ++++ b/LICENSE.hiredis +@@ -0,0 +1,29 @@ ++Copyright (c) 2009-2011, Salvatore Sanfilippo ++Copyright (c) 2010-2011, Pieter Noordhuis ++ ++All rights reserved. ++ ++Redistribution and use in source and binary forms, with or without ++modification, are permitted provided that the following conditions are met: ++ ++* Redistributions of source code must retain the above copyright notice, ++ this list of conditions and the following disclaimer. ++ ++* Redistributions in binary form must reproduce the above copyright notice, ++ this list of conditions and the following disclaimer in the documentation ++ and/or other materials provided with the distribution. ++ ++* Neither the name of Redis nor the names of its contributors may be used ++ to endorse or promote products derived from this software without specific ++ prior written permission. ++ ++THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ++ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED ++WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE ++DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ++ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES ++(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; ++LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ++ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ++(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS ++SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.