Skip to content

Build Pyodide (WebAssembly) wheels - #1

Merged
lemire merged 1 commit into
masterfrom
pyodide
Nov 14, 2026
Merged

lemire merged 1 commit into
masterfrom
pyodide

Conversation

@lemire

@lemire lemire commented Nov 14, 2026

Copy link
Copy Markdown
Member

Publishes WebAssembly wheels for Pyodide, so that micropip.install("pyfusefilter") works in the browser. PyPI accepts these wheels (PEP 783 pyemscripten_*_wasm32 platform tags). The runtime dependencies, cffi and xxhash, are both available in Pyodide.

Changes

  • wheels.yml: a build_pyodide job (cibuildwheel 4.3.5, CIBW_PLATFORM: pyodide), whose wheels are uploaded to PyPI with the others. One wheel per Pyodide ABI:
    • cp313-cp313-pyemscripten_2025_0_wasm32 (Pyodide 0.28, 0.29)
    • cp314-cp314-pyemscripten_2026_0_wasm32 (Pyodide 314)
    • cp315-cp315-pyemscripten_2026_5_wasm32
  • pytests.yml: a Pyodide job, so pull requests build and test the WebAssembly wheels.
  • pyproject-cibuildwheel.toml: [tool.cibuildwheel.pyodide] runs the tests with python -m pytest (in a Pyodide venv, the pytest script starts with a shebang to a shell script, which macOS cannot run).
  • pyfusefilter/ffibuild.py: no limited API (abi3) under Emscripten. In Pyodide 315, SOABI_PLATFORM holds literal quotes, so setuptools named the extension _xorfilter.abi3-"wasm32-emscripten".so, which Python cannot import. A Pyodide wheel is tied to one Pyodide version anyway, so abi3 gains nothing there. Native builds still produce _xorfilter.abi3.so.
  • tests/test_fuse8.py, tests/test_fuse16.py: sample(range(1 << 62), size) calls len() on the range, which overflows a 32-bit ssize_t (WebAssembly). The keys are drawn with randrange instead.

Checked

  • The Pyodide job, as configured here, run locally with an empty cibuildwheel cache (macOS arm64): the three wheels build and pass the tests in Node (30 passed each).
  • Native wheel (macOS arm64, Python 3.14): the extension is still _xorfilter.abi3.so, and the tests pass (30 passed).

- The release workflow builds Pyodide wheels with cibuildwheel
  (CIBW_PLATFORM: pyodide), one per Pyodide ABI (cp313, cp314, cp315),
  uploaded to PyPI with the others; the PR tests build and test them too.
- ffibuild.py: no limited API (abi3) under Emscripten. A Pyodide wheel is
  tied to one Pyodide version anyway, and Pyodide 315 names abi3
  extensions _xorfilter.abi3-"wasm32-emscripten".so (quotes in
  SOABI_PLATFORM), which Python cannot import. Native builds are unchanged.
- tests: draw the keys with randrange instead of sample(range(1 << 62)),
  whose len() overflows a 32-bit ssize_t (WebAssembly).
@lemire
lemire merged commit 075949b into master Nov 14, 2026
40 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant