Skip to content
Draft
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
117 changes: 117 additions & 0 deletions .github/workflows/build-gimli.units.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,117 @@
# SPDX-FileCopyrightText: 2026 The RISE Project
# SPDX-License-Identifier: MIT
---
# This workflow is based on: https://github.com/mcflugen/gimli/blob/v0.4.1/.github/workflows/test.yml
name: Build gimli.units wheels (riscv64)

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

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

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

env:
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: gimli.units
version: ${{ inputs.version }}

build_wheels:
needs: [setup]
if: needs.setup.outputs.versions != '[]'
name: Build gimli.units ${{ matrix.version }} ${{ matrix.python }}-${{ matrix.libc }}_riscv64
runs-on: ubuntu-24.04-riscv
timeout-minutes: 60
strategy:
fail-fast: false
matrix:
version: ${{ fromJSON(needs.setup.outputs.versions) }}
python: ["cp312", "cp313", "cp314"]
libc: ["manylinux", "musllinux"]

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

steps:
- name: Checkout gimli.units v${{ env.GIMLI_UNITS_VERSION }}
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
repository: mcflugen/gimli
ref: v${{ env.GIMLI_UNITS_VERSION }}
persist-credentials: false

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

- name: Patch gimli.units source
run: git apply python-wheels/patches/gimli.units/${{ env.GIMLI_UNITS_VERSION }}/*.patch

- uses: pypa/cibuildwheel@1828c10ab37f080699c7b81cea34097c684a7074 # v4.2.0
with:
output-dir: wheelhouse/
env:
CIBW_ARCHS: riscv64
CIBW_BUILD: ${{ matrix.python }}-${{ matrix.libc }}_riscv64
CIBW_MANYLINUX_RISCV64_IMAGE: ${{ env.MANYLINUX_RISCV64_IMAGE }}
CIBW_MUSLLINUX_RISCV64_IMAGE: ${{ env.MUSLLINUX_RISCV64_IMAGE }}
# Overriding CIBW_ENVIRONMENT replaces upstream's own pyproject.toml
# `environment` setting wholesale, so UDUNITS2_PREFIX (needed by
# setup.py's static-link lookup) is repeated here verbatim alongside
# the registry index.
CIBW_ENVIRONMENT: >-
UDUNITS2_PREFIX=$(pwd -P)/dist/extern
PIP_EXTRA_INDEX_URL=https://pypi.riseproject.dev/simple/
CIBW_TEST_REQUIRES: hypothesis pytest
CIBW_TEST_COMMAND: pytest {package}/tests

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

publish:
name: Publish gimli.units ${{ 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: gimli.units-${{ matrix.version }}-*riscv64
5 changes: 5 additions & 0 deletions docs/packages/gimli.units.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package-name: gimli.units
source-code: https://github.com/mcflugen/gimli
license: MIT
versions:
- version: 0.4.1
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
From: Ludovic Henry <git@ludovic.dev>
Date: Thu, 15 Oct 2026 00:00:00 +0000
Subject: [PATCH] pyproject: widen license-files to cover vendored expat/udunits2

Every platform's wheel (not just riscv64) statically links expat 2.6.0 and
UDUNITS-2 2.2.28 from the vendored extern/ sources, but license-files names
only gimli.units' own LICENSE.md, so neither dependency's notice travels
with the binary even though both require it.

Naming the two vendored notices alongside LICENSE.md lets the wheel build
stage them and have them land in .dist-info/licenses/.

Upstream-Status: To upstream [affects every platform's wheel, not a riscv64-only build detail]
---
pyproject.toml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pyproject.toml b/pyproject.toml
index 1111111..2222222 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -4,7 +4,7 @@
requires-python = ">=3.11"
description = "An object-oriented Python interface to udunits"
license = "MIT"
-license-files = ["LICENSE.md"]
+license-files = ["LICENSE.md", "extern/expat-2.6.0/COPYING", "extern/udunits-2.2.28/COPYRIGHT"]
keywords = [
"earth science",
"model coupling",
Loading