Skip to content
Merged
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
138 changes: 138 additions & 0 deletions .github/workflows/build-awkward-cpp.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,138 @@
# SPDX-FileCopyrightText: 2026 The RISE Project
# SPDX-License-Identifier: MIT
---
# This workflow is based on the `make_sdist`/`build_wheels` jobs of
# https://github.com/scikit-hep/awkward/blob/cef1a524fb52896b86ef505526f2fe4689f5e217/.github/workflows/reusable-build-wheels.yml
name: Build awkward-cpp wheels (riscv64)

on:
workflow_dispatch:
inputs:
version:
description: 'awkward-cpp version to build (e.g. 56)'
required: true
default: '56'
pull_request:
paths:
- '.github/workflows/build-awkward-cpp.yml'

concurrency:
group: ${{ github.workflow }}-${{ inputs.version || '56' }}-${{ 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 56 there.
AWKWARD_CPP_VERSION: ${{ inputs.version || '56' }}
# awkward-cpp is released from the scikit-hep/awkward monorepo by a
# workflow_dispatch-only job (deploy-cpp.yml) that never pushes a git tag
# (gotcha 103). This is the version-bump commit ("awkward 2.13.0 and
# awkward-cpp 56"), verified byte-identical to the PyPI sdist. Update
# alongside AWKWARD_CPP_VERSION.
AWKWARD_CPP_REF: cef1a524fb52896b86ef505526f2fe4689f5e217
MANYLINUX_RISCV64_IMAGE: quay.io/pypa/manylinux_2_39_riscv64

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

build_sdist:
needs: [setup]
# The sdist is architecture-independent; build it once on x86 instead of
# burning a scarce riscv runner (CLAUDE.md gotcha 4).
name: Build awkward-cpp ${{ inputs.version || '56' }} sdist
runs-on: ubuntu-latest
permissions:
contents: read
outputs:
sdist_name: ${{ steps.sdist.outputs.sdist_name }}
steps:
- name: Checkout scikit-hep/awkward ${{ env.AWKWARD_CPP_REF }}
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
repository: scikit-hep/awkward
ref: ${{ env.AWKWARD_CPP_REF }}
# rapidjson is a submodule of awkward-cpp/, and its LICENSE is one of
# the project's declared license-files.
submodules: true
persist-credentials: false

- name: Prepare build files
run: pipx run nox -s prepare

- name: Build awkward-cpp sdist
id: sdist
run: |
pipx run build --sdist awkward-cpp
pipx run twine check awkward-cpp/dist/*
sdists=(awkward-cpp/dist/*.tar.gz)
echo "sdist_name=$(basename "${sdists[0]}")" >> "$GITHUB_OUTPUT"

- name: Upload sdist artifact
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: awkward-cpp-${{ env.AWKWARD_CPP_VERSION }}-sdist
path: awkward-cpp/dist/*.tar.gz
if-no-files-found: error

build_wheels:
needs: [setup, build_sdist]
name: Build awkward-cpp ${{ inputs.version || '56' }} ${{ matrix.python }}-manylinux_riscv64
runs-on: ubuntu-24.04-riscv
timeout-minutes: 180
permissions:
contents: read
strategy:
fail-fast: false
matrix:
python: [cp312, cp313, cp314, cp314t]
steps:
- name: Download sdist
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
with:
name: awkward-cpp-${{ env.AWKWARD_CPP_VERSION }}-sdist
path: dist/

- name: Build wheels
uses: pypa/cibuildwheel@1828c10ab37f080699c7b81cea34097c684a7074 # v4.2.0
with:
package-dir: dist/${{ needs.build_sdist.outputs.sdist_name }}
env:
CIBW_BUILD: ${{ matrix.python }}-manylinux_riscv64
CIBW_MANYLINUX_RISCV64_IMAGE: ${{ env.MANYLINUX_RISCV64_IMAGE }}
# Override upstream's build-frontend = "build[uv]": cibuildwheel's
# audit step makes a venv on the host and asserts a host `uv`
# exists, which this self-hosted runner has none of (gotcha 13).
CIBW_BUILD_FRONTEND: build
CIBW_ENVIRONMENT: >-
PIP_EXTRA_INDEX_URL=https://pypi.riseproject.dev/simple/
PIP_ONLY_BINARY=cmake,numpy
CIBW_TEST_REQUIRES: pytest>=6
CIBW_TEST_SOURCES: >-
tests-cpu-kernels tests-cpu-kernels-explicit
tests-spec tests-spec-explicit
# Upstream's own test-command also runs {project}/tests, which is
# the parent `awkward` package's suite (imports `awkward`, not
# awkward_cpp) - out of scope here since we only build awkward-cpp
# and `awkward` has no riscv64 wheel of its own.
CIBW_TEST_COMMAND: >-
pytest {package}/tests-cpu-kernels {package}/tests-cpu-kernels-explicit
{package}/tests-spec {package}/tests-spec-explicit

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

publish:
name: Publish awkward-cpp ${{ inputs.version || '56' }}
needs: [setup, build_wheels]
permissions:
contents: write
pull-requests: write
uses: $/.github/workflows/_publish-wheel.yml
with:
artifact-pattern: awkward-cpp-${{ inputs.version || '56' }}-*-manylinux_riscv64