From 27e368c5fad0cb69916cb3b8a17a515c701ba5a3 Mon Sep 17 00:00:00 2001 From: Ludovic Henry Date: Sun, 20 Sep 2026 23:00:52 +0000 Subject: [PATCH 1/2] kernels-data: Add version 0.16.1 kernels-data is the Python binding for HuggingFace's kernels-data Rust crate: the kernel.toml/kernel config parsers, the variant digest hasher and the metadata types the Kernel Hub client reads. It is not a GPU payload -- pure Rust, no dependencies, no CUDA -- and upstream publishes 20 Linux wheels without riscv64. Mirrors the linux job of upstream's kernels_data_python_release.yaml and the test steps of its test_python.yaml. cibuildwheel replaces PyO3/maturin-action, this repo's standard riscv64 build path, and musllinux is dropped because rustup.rs ships no riscv64 musl toolchain. The repo-root LICENSE is staged beside the binding's pyproject.toml so maturin's licence glob finds it; upstream's own wheels ship no licence file because its MANIFEST.in `include ../../../LICENSE` is not something maturin reads. The matrix is two entries rather than four: the binding crate declares pyo3 with abi3/abi3-py38 unconditionally, so one cp38-abi3 wheel serves every GIL-ful interpreter, and pyo3 turns abi3 off under Py_GIL_DISABLED, which is why the free-threaded build gets its own wheel -- the same split upstream's second `-i python3.14t` maturin step produces. Signed-off-by: Ludovic Henry --- .github/workflows/build-kernels-data.yml | 140 +++++++++++++++++++++++ docs/packages/kernels-data.yaml | 5 + 2 files changed, 145 insertions(+) create mode 100644 .github/workflows/build-kernels-data.yml create mode 100644 docs/packages/kernels-data.yaml diff --git a/.github/workflows/build-kernels-data.yml b/.github/workflows/build-kernels-data.yml new file mode 100644 index 00000000000..825cd174afc --- /dev/null +++ b/.github/workflows/build-kernels-data.yml @@ -0,0 +1,140 @@ +# SPDX-FileCopyrightText: 2026 The RISE Project +# SPDX-License-Identifier: MIT +--- +# This workflow is based on the `linux` job of +# https://github.com/huggingface/kernels/blob/v0.16.1/.github/workflows/kernels_data_python_release.yaml +# and the test steps of its test_python.yaml. +name: Build kernels-data wheels (riscv64) + +on: + workflow_dispatch: + inputs: + version: + description: 'Version glob to (re)build; empty builds every version of docs/packages/kernels-data.yaml not released yet' + required: false + default: '' + pull_request: + branches: [main] + paths: + - '.github/workflows/build-kernels-data.yml' + - 'docs/packages/kernels-data.yaml' + push: + branches: [main] + paths: + - '.github/workflows/build-kernels-data.yml' + - 'docs/packages/kernels-data.yaml' + +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: kernels-data + version: ${{ inputs.version }} + + build_wheels: + needs: [setup] + if: needs.setup.outputs.versions != '[]' + name: Build kernels-data ${{ matrix.version }} ${{ matrix.tag }}-manylinux_riscv64 + runs-on: ubuntu-24.04-riscv + timeout-minutes: 120 + strategy: + fail-fast: false + matrix: + version: ${{ fromJSON(needs.setup.outputs.versions) }} + include: + # kernels-data/bindings/python/Cargo.toml declares pyo3 with the + # abi3/abi3-py38 features unconditionally, so one abi3 wheel serves + # every GIL-ful interpreter; pyo3 disables abi3 under Py_GIL_DISABLED, + # giving the free-threaded build its own wheel, which is why upstream + # runs a second `-i python3.14t` maturin step. + - tag: cp38-abi3 + # 3.8 only names the tag's floor and is absent from the manylinux + # image, so the wheel is built on this repo's cp312 floor and + # re-tested on the newer interpreters. + build: cp312-manylinux_riscv64 cp313-manylinux_riscv64 cp314-manylinux_riscv64 + - tag: cp314t + build: cp314t-manylinux_riscv64 + + env: + KERNELS_DATA_VERSION: ${{ matrix.version }} + + steps: + - name: Checkout kernels v${{ env.KERNELS_DATA_VERSION }} + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + with: + repository: huggingface/kernels + ref: v${{ env.KERNELS_DATA_VERSION }} + persist-credentials: false + + - name: Stage the licence beside kernels-data's pyproject.toml + # maturin globs LICEN[CS]E* relative to the pyproject directory, which + # is kernels-data/bindings/python/ in this workspace, and ignores the + # `include ../../../LICENSE` in the MANIFEST.in next to it -- so + # upstream's own wheels carry no licence file at all. + run: cp LICENSE kernels-data/bindings/python/ + + - name: Build wheels + uses: pypa/cibuildwheel@1828c10ab37f080699c7b81cea34097c684a7074 # v4.2.0 + with: + package-dir: kernels-data/bindings/python + output-dir: wheelhouse/ + env: + # musllinux is dropped: rustup.rs ships no riscv64 musl toolchain. + CIBW_BUILD: ${{ matrix.build }} + CIBW_MANYLINUX_RISCV64_IMAGE: ${{ env.MANYLINUX_RISCV64_IMAGE }} + # kernels-data 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 + # mypy, which upstream's stubtest check needs, publishes no riscv64 + # wheel on public PyPI; ours does. + CIBW_ENVIRONMENT_LINUX: >- + PATH="$PATH:$HOME/.cargo/bin" + PIP_EXTRA_INDEX_URL=https://pypi.riseproject.dev/simple/ + CIBW_TEST_REQUIRES: pytest mypy + CIBW_TEST_SOURCES: >- + kernels-data/bindings/python/tests + kernels-data/bindings/python/stubtest-allowlist.txt + # maturin synthesises kernels_data/__init__.py as a re-export shim, so + # the compiled module is the kernels_data.kernels_data submodule. + CIBW_TEST_COMMAND: >- + python -c "import kernels_data.kernels_data as m, importlib.metadata as md; + assert m.__file__.endswith('.so'), m.__file__; + files = md.files('kernels-data'); + assert any(str(p).endswith('licenses/LICENSE') for p in files), files" && + cd kernels-data/bindings/python && + python -m pytest -v tests && + python -m mypy.stubtest kernels_data --allowlist stubtest-allowlist.txt + + - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 + with: + name: kernels-data-${{ env.KERNELS_DATA_VERSION }}-${{ matrix.tag }}-manylinux_riscv64 + path: wheelhouse/*.whl + if-no-files-found: error + + publish: + name: Publish kernels-data ${{ 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: kernels-data-${{ matrix.version }}-*-manylinux_riscv64 diff --git a/docs/packages/kernels-data.yaml b/docs/packages/kernels-data.yaml new file mode 100644 index 00000000000..368558a839e --- /dev/null +++ b/docs/packages/kernels-data.yaml @@ -0,0 +1,5 @@ +package-name: kernels-data +source-code: https://github.com/huggingface/kernels +license: Apache-2.0 +versions: +- version: 0.16.1 From cde0ec9cb750aa36fc08b57e9fadf2bcedbcbc77 Mon Sep 17 00:00:00 2001 From: Ludovic Henry Date: Sun, 20 Sep 2026 23:06:19 +0000 Subject: [PATCH 2/2] kernels-data: make the wheel tag a real matrix dimension Two `include:` entries that each introduce the same brand-new `tag`/`build` keys over a `version`-only base matrix collapse into one job, keeping the last one -- so the first run produced a single cp314t leg and no abi3 wheel at all, silently green. Declaring `tag` in the base matrix makes each include update the leg it names instead of adding a key to every combination. Signed-off-by: Ludovic Henry --- .github/workflows/build-kernels-data.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/build-kernels-data.yml b/.github/workflows/build-kernels-data.yml index 825cd174afc..6887f4d1c3d 100644 --- a/.github/workflows/build-kernels-data.yml +++ b/.github/workflows/build-kernels-data.yml @@ -51,6 +51,9 @@ jobs: fail-fast: false matrix: version: ${{ fromJSON(needs.setup.outputs.versions) }} + # `tag` is a real matrix dimension, not an include-only key: two includes + # that add the same new key collapse into one job (gotcha 402). + tag: [cp38-abi3, cp314t] include: # kernels-data/bindings/python/Cargo.toml declares pyo3 with the # abi3/abi3-py38 features unconditionally, so one abi3 wheel serves