multimark is a compiled Python package (CFFI bindings to vendored cmark-gfm C sources). Pre-built wheels are published to PyPI on each release. This document describes what gets built, for which platforms, and why.
multimark uses the Python stable ABI (abi3) with a floor of CPython 3.9. A single wheel per platform covers all Python versions from 3.9 onward, including future releases. The test suite runs on Python 3.9 through 3.14.
Built with cibuildwheel using the cp39-abi3 tag.
| Platform | Architectures | Wheel tag |
|---|---|---|
| Linux (manylinux/musllinux) | x86_64, aarch64 | cp39-abi3-manylinux_*_{x86_64,aarch64}, cp39-abi3-musllinux_*_{x86_64,aarch64} |
| macOS | x86_64, arm64 | cp39-abi3-macosx_*_x86_64, cp39-abi3-macosx_*_arm64 |
| Windows | x86_64 | cp39-abi3-win_amd64 |
Linux aarch64 wheels are built and tested under QEMU on the x86_64 GitHub Actions runner.
Skipped: 32-bit Windows (win32), 32-bit Linux (manylinux_i686), musl 32-bit (musllinux_i686).
Built with cibuildwheel 4.x using CIBW_PLATFORM=pyodide, and published to PyPI with the native wheels. They use the PEP 783 pyemscripten platform tag, so micropip.install("multimark") finds them. These allow multimark to run in browser-based Python environments (Pyodide, JupyterLite, Shinylive).
| Pyodide Version | Python | Emscripten | Wheel tag |
|---|---|---|---|
| 314.x | 3.14 | 5.0.3 | cp39-abi3-pyemscripten_2026_0_wasm32 |
Pyodide 0.28/0.29 (Python 3.13) is a different ABI and is not built. Its pyemscripten_2025_0 wheel would only install on Pyodide 0.29.4 and later, because earlier versions bundle a micropip older than 0.11.1, which does not recognise the pyemscripten tag.
Threading and CLI tests are skipped under Pyodide (emscripten does not support pthreads or subprocesses). For the same reason, markdown_to_html_batch(..., workers=N) with N > 1 raises RuntimeError under Pyodide. Leave workers unset there.
The Pyodide wheel is uploaded to PyPI in its own job, after the native wheels and sdist. If the Pyodide build, its tests, or its upload fail, the native release is still published.
An sdist (multimark-*.tar.gz) is also published. Building from source requires a C compiler and the vendored cmark-gfm sources (included in the tarball).
| Target | Command |
|---|---|
| Native wheel | make dist-wheel |
| Pyodide wheel | make dist-pyodide |
| Source distribution | make dist-sdist |
| All of the above | make dist-all |
Three manually triggered GitHub Actions workflows mirror the release pipeline without publishing:
- Test Wheel Build (
test-build.yml): native abi3 wheels on all platforms - Test Pyodide Build (
pyodide.yml): emscripten/WASM wheels - Test Sdist Build (
test-sdist.yml): source distribution
gh workflow run test-build.yml
gh workflow run pyodide.yml
gh workflow run test-sdist.ymlAll cibuildwheel settings live in pyproject.toml under [tool.cibuildwheel]. The release CI workflow (ci.yml) and local Makefile targets read from the same configuration. Native wheels are built with cibuildwheel 2.23.4 and Pyodide wheels with 4.2.1.