From 643da2fa722791d23a28c6869dcc1d44b44b009c Mon Sep 17 00:00:00 2001 From: Ludovic Henry Date: Fri, 25 Sep 2026 16:51:41 +0000 Subject: [PATCH 1/2] zen-engine: Add version 2.0.2 Builds the cp38-abi3 wheel from the python-v2.0.2 tag with PyO3/maturin-action, mirroring upstream's python.yaml wheels job. rquickjs-sys 0.10.0 ships no pregenerated riscv64 bindings, so the build enables zen-engine's bindgen feature (as upstream's s390x uniffi build does) and overrides the rust-style target triple rquickjs-sys hands libclang. --- .github/workflows/build-zen-engine.yml | 123 +++++++++++++++++++++++++ docs/packages/zen-engine.yaml | 5 + 2 files changed, 128 insertions(+) create mode 100644 .github/workflows/build-zen-engine.yml create mode 100644 docs/packages/zen-engine.yaml diff --git a/.github/workflows/build-zen-engine.yml b/.github/workflows/build-zen-engine.yml new file mode 100644 index 00000000000..e03d96895ec --- /dev/null +++ b/.github/workflows/build-zen-engine.yml @@ -0,0 +1,123 @@ +# SPDX-FileCopyrightText: 2026 The RISE Project +# SPDX-License-Identifier: MIT +--- +# This workflow is based on the `wheels` job of +# https://github.com/gorules/zen/blob/python-v2.0.2/.github/workflows/python.yaml +name: Build zen-engine wheels (riscv64) + +on: + workflow_dispatch: + inputs: + version: + description: 'Version glob to (re)build; empty builds every version of docs/packages/zen-engine.yaml not released yet' + required: false + default: '' + pull_request: + branches: [main] + paths: + - '.github/workflows/build-zen-engine.yml' + - 'docs/packages/zen-engine.yaml' + push: + branches: [main] + paths: + - '.github/workflows/build-zen-engine.yml' + - 'docs/packages/zen-engine.yaml' + +concurrency: + group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} + cancel-in-progress: true + +permissions: + contents: read # to fetch code (actions/checkout) + +jobs: + setup: + uses: $/.github/workflows/_setup.yml + with: + package: zen-engine + version: ${{ inputs.version }} + + build_wheel: + needs: [setup] + if: needs.setup.outputs.versions != '[]' + strategy: + fail-fast: false + matrix: + version: ${{ fromJSON(needs.setup.outputs.versions) }} + name: Build zen-engine ${{ matrix.version }} cp38-abi3-manylinux_riscv64 + runs-on: ubuntu-24.04-riscv + timeout-minutes: 720 + + env: + ZEN_ENGINE_VERSION: ${{ matrix.version }} + + steps: + - name: Checkout zen python-v${{ env.ZEN_ENGINE_VERSION }} + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + with: + repository: gorules/zen + ref: python-v${{ env.ZEN_ENGINE_VERSION }} + persist-credentials: false + + # rquickjs-sys ships no riscv64 bindings (bindgen, as upstream's s390x build), and passes + # clang the rust triple riscv64gc-..., which clang rejects; the later --target wins. + - name: Build wheel + uses: PyO3/maturin-action@e83996d129638aa358a18fbd1dfb82f0b0fb5d3b # v1.51.0 + with: + target: riscv64gc-unknown-linux-gnu + args: --release --out dist --locked -m bindings/python/Cargo.toml --features zen-engine/bindgen + manylinux: '2_39' + before-script-linux: dnf install -y clang-devel + docker-options: -e BINDGEN_EXTRA_CLANG_ARGS=--target=riscv64-unknown-linux-gnu + + - name: Verify the wheel ships the compiled extension + run: | + set -euo pipefail + python3 - dist/*.whl <<'EOF' + import sys, zipfile + names = zipfile.ZipFile(sys.argv[1]).namelist() + sos = [n for n in names if n.endswith(".so")] + assert "zen/zen.abi3.so" in sos, sos + assert any(n.endswith(".dist-info/licenses/LICENSE") for n in names), names + print(sys.argv[1], "->", sos) + EOF + + - name: Install uv + uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1 + with: + enable-cache: false + + # Upstream's CI never runs these; they are the binding's own suite. + - name: Run test_sync.py and test_async.py + working-directory: bindings/python + run: | + set -euo pipefail + for py in 3.12 3.13 3.14; do + venv="$RUNNER_TEMP/venv-$py" + uv venv --python "$py" "$venv" + uv pip install --python "$venv/bin/python" "$GITHUB_WORKSPACE"/dist/*.whl + "$venv/bin/python" -m unittest -v test_sync test_async + done + + - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 + with: + name: zen-engine-${{ env.ZEN_ENGINE_VERSION }}-cp38-abi3-manylinux_riscv64 + path: dist/*.whl + if-no-files-found: error + + publish: + name: Publish zen-engine ${{ matrix.version }} + needs: [setup, build_wheel] + 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: zen-engine-${{ matrix.version }}-*-manylinux_riscv64 diff --git a/docs/packages/zen-engine.yaml b/docs/packages/zen-engine.yaml new file mode 100644 index 00000000000..59e75c3659e --- /dev/null +++ b/docs/packages/zen-engine.yaml @@ -0,0 +1,5 @@ +package-name: zen-engine +source-code: https://github.com/gorules/zen +license: MIT +versions: +- version: 2.0.2 From eac64a8c9147bab971a78d29ade586ac0882fa4b Mon Sep 17 00:00:00 2001 From: Ludovic Henry Date: Sun, 27 Sep 2026 09:09:42 +0000 Subject: [PATCH 2/2] zen-engine: Restate pyo3/extension-module in maturin --features The CLI --features zen-engine/bindgen replaced the pyproject's [tool.maturin] features = ["pyo3/extension-module"], so pyo3 0.25 linked the extension against libpython and the link failed with "cannot find -lpython3.12" in the manylinux_2_39 image. --- .github/workflows/build-zen-engine.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build-zen-engine.yml b/.github/workflows/build-zen-engine.yml index e03d96895ec..1fdd2b36c4d 100644 --- a/.github/workflows/build-zen-engine.yml +++ b/.github/workflows/build-zen-engine.yml @@ -61,11 +61,12 @@ jobs: # rquickjs-sys ships no riscv64 bindings (bindgen, as upstream's s390x build), and passes # clang the rust triple riscv64gc-..., which clang rejects; the later --target wins. + # A CLI --features replaces [tool.maturin] features, so pyo3/extension-module is restated. - name: Build wheel uses: PyO3/maturin-action@e83996d129638aa358a18fbd1dfb82f0b0fb5d3b # v1.51.0 with: target: riscv64gc-unknown-linux-gnu - args: --release --out dist --locked -m bindings/python/Cargo.toml --features zen-engine/bindgen + args: --release --out dist --locked -m bindings/python/Cargo.toml --features pyo3/extension-module,zen-engine/bindgen manylinux: '2_39' before-script-linux: dnf install -y clang-devel docker-options: -e BINDGEN_EXTRA_CLANG_ARGS=--target=riscv64-unknown-linux-gnu