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
128 changes: 128 additions & 0 deletions .github/workflows/build-python-flint.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,128 @@
# SPDX-FileCopyrightText: 2026 The RISE Project
# SPDX-License-Identifier: MIT
---
# This workflow is based on: https://github.com/flintlib/python-flint/blob/0.9.0/.github/workflows/buildwheel.yml
name: Build python-flint wheels (riscv64)

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

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

jobs:
setup:
uses: $/.github/workflows/_setup.yml
with:
package: python-flint
version: ${{ inputs.version }}

build_wheels:
needs: [setup]
if: needs.setup.outputs.versions != '[]'
name: Build python-flint ${{ matrix.version }} ${{ matrix.python }}-manylinux_riscv64
runs-on: ubuntu-24.04-riscv
timeout-minutes: 120
strategy:
fail-fast: false
matrix:
version: ${{ fromJSON(needs.setup.outputs.versions) }}
python: ["cp312", "cp313", "cp314", "cp314t"]

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

steps:
- name: Checkout python-flint ${{ env.PYTHON_FLINT_VERSION }}
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
repository: flintlib/python-flint
ref: ${{ env.PYTHON_FLINT_VERSION }}
persist-credentials: false

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

# pyproject.toml's [tool.cibuildwheel.linux] before-all dispatches to
# bin/cibw_before_all_linux_$(uname -m).sh, which only exists for
# x86_64/aarch64 upstream.
- name: Patch python-flint source
run: git apply python-wheels/patches/python-flint/${{ env.PYTHON_FLINT_VERSION }}/00*.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 }}
# Restates upstream's [tool.cibuildwheel.linux.environment], which
# CIBW_ENVIRONMENT replaces wholesale. PIP_EXTRA_INDEX_URL resolves
# the meson-python/cython/ninja build requirements, which have no
# riscv64 wheel on PyPI.
CIBW_ENVIRONMENT: >-
LD_LIBRARY_PATH=$(pwd)/.local/lib:$LD_LIBRARY_PATH
PKG_CONFIG_PATH=$(pwd)/.local/lib/pkgconfig
PIP_EXTRA_INDEX_URL=https://pypi.riseproject.dev/simple/
CIBW_TEST_COMMAND: python -m flint.test -q

- 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()
got = {n for n in names if n.endswith(".so")}
assert got, f"{whl}: no .so found"
print(whl, sorted(got))
EOF

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

publish:
name: Publish python-flint ${{ 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: python-flint-${{ matrix.version }}-*-manylinux_riscv64
6 changes: 6 additions & 0 deletions docs/packages/python-flint.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package-name: python-flint
source-code: https://github.com/flintlib/python-flint
license: MIT
versions:
- version: 0.9.0
patched: true
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Ludovic Henry <git@ludovic.dev>
Date: Mon, 5 Oct 2026 08:15:32 +0000
Subject: [PATCH] bin: add a riscv64 cibw_before_all_linux script

Upstream-Status: Inappropriate [new riscv64 port, not an upstream platform]

python-flint's own cibuildwheel config dispatches per architecture via
bin/cibw_before_all_linux_$(uname -m).sh (pyproject.toml's
[tool.cibuildwheel.linux] before-all), with a script already present
for x86_64 and aarch64 but none for riscv64. Add one that mirrors the
existing two verbatim but for the riscv64 host triplet: it builds GMP,
MPFR and FLINT from the same upstream source tarballs
(bin/build_dependencies_unix.sh, bin/build_variables.sh) with no
riscv64-specific changes to that shared script.

GMP 6.3.0 has a native riscv64 assembly path (configure.ac's
riscv64-*-* case, asm_path=riscv/64); FLINT 3.6.0 has no riscv64-
specific code at all and falls through configure.ac's default case
(asm_path="" param_path=generic), the same portable-C path it already
uses on every non-x86_64/non-arm64 architecture it supports (s390x,
ppc64le, ...). Neither needs a patch of its own.
---
bin/cibw_before_all_linux_riscv64.sh | 9 +++++++++
1 file changed, 9 insertions(+)
create mode 100755 bin/cibw_before_all_linux_riscv64.sh

diff --git a/bin/cibw_before_all_linux_riscv64.sh b/bin/cibw_before_all_linux_riscv64.sh
new file mode 100755
index 0000000..9a523e2
--- /dev/null
+++ b/bin/cibw_before_all_linux_riscv64.sh
@@ -0,0 +1,9 @@
+#!/usr/bin/env bash
+
+set -e
+
+yum install -y xz
+bin/build_dependencies_unix.sh\
+ --gmp gmp\
+ --host riscv64-pc-linux-gnu\
+ --use-gmp-github-mirror
Loading