From ece9110ffdbc192e731931473ab404224f5356c3 Mon Sep 17 00:00:00 2001 From: Ludovic Henry Date: Mon, 7 Sep 2026 16:33:25 +0200 Subject: [PATCH 1/2] markdown-it-pyrs: add build-markdown-it-pyrs.yml for riscv64 wheels Builds the PyO3/maturin markdown-it.rs binding directly from the upstream checkout (Cargo.lock is committed there), per-interpreter since pyo3 0.19.2 carries no abi3 feature and predates Py_GIL_DISABLED, so cp314t is dropped. --- .github/workflows/build-markdown-it-pyrs.yml | 90 ++++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 .github/workflows/build-markdown-it-pyrs.yml diff --git a/.github/workflows/build-markdown-it-pyrs.yml b/.github/workflows/build-markdown-it-pyrs.yml new file mode 100644 index 000000000..7c88ee4a9 --- /dev/null +++ b/.github/workflows/build-markdown-it-pyrs.yml @@ -0,0 +1,90 @@ +# SPDX-FileCopyrightText: 2026 The RISE Project +# SPDX-License-Identifier: MIT +--- +# This workflow is based on the `linux` job of +# https://github.com/chrisjsewell/markdown-it-pyrs/blob/v0.4.0/.github/workflows/CI.yml +name: Build markdown-it-pyrs wheels (riscv64) + +on: + workflow_dispatch: + inputs: + version: + description: 'markdown-it-pyrs version to build (git tag without leading v, e.g. 0.4.0)' + required: true + default: '0.4.0' + pull_request: + paths: + - '.github/workflows/build-markdown-it-pyrs.yml' + +concurrency: + group: ${{ github.workflow }}-${{ inputs.version || '0.4.0' }}-${{ 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 0.4.0 there. + MARKDOWN_IT_PYRS_VERSION: ${{ inputs.version || '0.4.0' }} + MANYLINUX_RISCV64_IMAGE: quay.io/pypa/manylinux_2_39_riscv64 + +jobs: + setup: + uses: $/.github/workflows/_setup.yml + + build_wheels: + needs: [setup] + name: Build markdown-it-pyrs ${{ inputs.version || '0.4.0' }} ${{ matrix.python }}-manylinux_riscv64 + runs-on: ubuntu-24.04-riscv + timeout-minutes: 60 + strategy: + fail-fast: false + matrix: + # pyo3 0.19.2 sets no abi3 feature, so every interpreter needs its own + # build. It also predates Py_GIL_DISABLED entirely, so cp314t is + # dropped (gotcha 306). + python: ["cp312", "cp313", "cp314"] + + steps: + - name: Checkout markdown-it-pyrs v${{ env.MARKDOWN_IT_PYRS_VERSION }} + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + with: + repository: chrisjsewell/markdown-it-pyrs + ref: v${{ env.MARKDOWN_IT_PYRS_VERSION }} + persist-credentials: false + + - name: Build and test wheel + uses: pypa/cibuildwheel@1828c10ab37f080699c7b81cea34097c684a7074 # v4.2.0 + with: + output-dir: wheelhouse/ + env: + CIBW_BUILD: ${{ matrix.python }}-manylinux_riscv64 + CIBW_MANYLINUX_RISCV64_IMAGE: ${{ env.MANYLINUX_RISCV64_IMAGE }} + # markdown-it-pyrs ships no [tool.cibuildwheel], so the Rust + # toolchain its maturin backend needs is installed in-container here. + CIBW_BEFORE_ALL_LINUX: >- + curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y + CIBW_ENVIRONMENT_LINUX: PATH="$PATH:$HOME/.cargo/bin" + CIBW_TEST_REQUIRES: pytest pytest-param-files + CIBW_TEST_SOURCES: tests + # bench_html.py/bench_tree.py need the benchmarking extra + # (pytest-benchmark, markdown-it-py), not relevant to a wheel test. + CIBW_TEST_COMMAND: >- + python -c "import markdown_it_pyrs.markdown_it_pyrs as m; assert m.__file__.endswith('.so'), m.__file__" && + python -m pytest -v tests/test_api.py tests/test_cli.py tests/test_fixtures.py + + - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 + with: + name: markdown-it-pyrs-${{ env.MARKDOWN_IT_PYRS_VERSION }}-${{ matrix.python }}-manylinux_riscv64 + path: wheelhouse/*.whl + if-no-files-found: error + + publish: + name: Publish markdown-it-pyrs ${{ inputs.version || '0.4.0' }} + needs: [setup, build_wheels] + permissions: + contents: write + pull-requests: write + uses: $/.github/workflows/_publish-wheel.yml + with: + artifact-pattern: markdown-it-pyrs-${{ inputs.version || '0.4.0' }}-*-manylinux_riscv64 From fc3f19e083464d8fd1811fda3c2d8745aac44888 Mon Sep 17 00:00:00 2001 From: Ludovic Henry Date: Mon, 7 Sep 2026 16:50:46 +0200 Subject: [PATCH 2/2] markdown-it-pyrs: drop cp314 - pyo3 0.19.2 segfaults against CPython 3.14 Confirmed on CI: cp312 and cp313 pass, cp314 SIGSEGVs inside the compiled extension on the very first MarkdownIt().render() call, the same test that passes clean on the other two. pyo3 0.19.2 predates CPython 3.14's changed Unicode object internal layout, so its own PyUnicode_KIND/PyUnicode_DATA struct-offset assumptions are stale there. --- .github/workflows/build-markdown-it-pyrs.yml | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build-markdown-it-pyrs.yml b/.github/workflows/build-markdown-it-pyrs.yml index 7c88ee4a9..5acb4ac9b 100644 --- a/.github/workflows/build-markdown-it-pyrs.yml +++ b/.github/workflows/build-markdown-it-pyrs.yml @@ -41,9 +41,11 @@ jobs: fail-fast: false matrix: # pyo3 0.19.2 sets no abi3 feature, so every interpreter needs its own - # build. It also predates Py_GIL_DISABLED entirely, so cp314t is - # dropped (gotcha 306). - python: ["cp312", "cp313", "cp314"] + # build. cp314 segfaults on the first .render() call - pyo3 0.19.2 + # predates CPython 3.14's changed Unicode object layout (gotcha 322) - + # and it also predates Py_GIL_DISABLED entirely, so cp314t is dropped + # too. + python: ["cp312", "cp313"] steps: - name: Checkout markdown-it-pyrs v${{ env.MARKDOWN_IT_PYRS_VERSION }}