Conversation
pyroaring publishes per-interpreter manylinux/musllinux wheels for x86_64, aarch64 and armv7l but none for riscv64. It is a Cython extension over the CRoaring amalgamation bundled in the source tree, so a plain build-from-checkout cibuildwheel job covers it; the workflow mirrors the build_wheels job of upstream's buildwheels.yml, narrowed to manylinux_riscv64 and to cp312/cp313/cp314/cp314t. Upstream keeps no [tool.cibuildwheel] table, so the test requirements, test command and `build` frontend are taken verbatim from its workflow env. Also carry a patch adding CRoaring's own licence to the wheel: roaring.c is compiled into the extension, and its Apache-2.0/MIT notice ships only in the sdist. The test command asserts both licences are installed so the patch cannot silently stop applying.
hypothesis became a Rust extension package in 6.156, and the only riscv64 wheels it publishes are cp310-abi3 and cp315-abi3.abi3t. Neither loads on free-threaded 3.14, so the cp314t test step falls back to the sdist, whose backend computes the target triple riscv64-unknown-linux-gnu -- a name rustup does not have -- and fails before pyroaring's own tests run. 6.155.7 is the last release published as py3-none-any. Pin it on the cp314t matrix entry alone so the GIL-ful interpreters keep resolving whatever hypothesis pip picks, as upstream's workflow does.
|
Redo everything from scratch now that hypothesis is available at https://pypi.riseproject.dev/simple/hypothesis |
|
Done in b7eb2a1. The Dropping the pin on its own would not have worked: this workflow had no Confirmed on the registry before pushing: |
pyroaring publishes per-interpreter manylinux/musllinux wheels for x86_64, aarch64 and armv7l plus macOS and Windows, but nothing for riscv64. It is a Cython extension over the CRoaring amalgamation that is bundled in the source tree (
pyroaring/roaring.c, CRoaring v4.6.1), so there is no external native dependency and a plain build-from-checkout cibuildwheel job covers it.The workflow mirrors the
build_wheelsjob of upstream'sbuildwheels.yml, narrowed tomanylinux_riscv64and tocp312/cp313/cp314/cp314t. Upstream keeps no[tool.cibuildwheel]table at 1.1.0, soCIBW_TEST_REQUIRES,CIBW_TEST_COMMANDandCIBW_BUILD_FRONTEND: buildare taken verbatim from its workflowenv:; the only riscv64 addition isCIBW_MANYLINUX_RISCV64_IMAGE. The matrix is per-interpreter because PyPI shows separatecpXY-cpXYwheels (no-abi3-tag) and upstream ships acp314-cp314tmanylinux wheel, so free threading is supported.Licensing
setup.pycompiles the bundledpyroaring/roaring.cinto alibcroaringstatic library that the extension links, so every wheel redistributes CRoaring in binary form. CRoaring is dual-licensed Apache-2.0/MIT and both require the copyright notice to travel with binary redistributions, but that notice lives only insideroaring.c, which ships in the sdist and not in the wheel — the published wheels carry pyroaring's own MITLICENSEalone.patches/pyroaring/1.1.0/0001-package-the-CRoaring-licence-in-the-built-wheel.patchrestores CRoaring'sLICENSEverbatim from the v4.6.1 release recorded inpyroaring/croaring_version.pxi, asLICENSE.CRoaringat the project root: setuptools' defaultlicense_filesglob isLICEN[CS]E*there, so no packaging change is needed and pyroaring's ownLICENSEcannot be dropped by replacing the default glob with a hand-written list. TaggedTo upstream— the same gap exists in every pyroaring wheel on PyPI, so it needs a maintainer discussion rather than a drive-by PR.The test command asserts
importlib.metadata.files('pyroaring')lists exactlyLICENSEandLICENSE.CRoaringunderdist-info/licenses/, so the patch cannot silently stop applying. Checked locally that the assertion fails against an unpatched wheel and passes against a patched one.The one divergence: hypothesis on the free-threaded job
hypothesis became a Rust extension package in 6.156, and the only riscv64 wheels it publishes are
cp310-abi3-manylinux_2_31_riscv64andcp315-abi3.abi3t-manylinux_2_31_riscv64. The first coverscp312/cp313/cp314fine, but neither loads on free-threaded 3.14, so thecp314ttest step fell back to the sdist, whose backend computes the target tripleriscv64-unknown-linux-gnu— a name rustup does not have — and died before pyroaring's own tests ran. 6.155.7 is the last release published aspy3-none-any, so thecp314tmatrix entry alone pinshypothesis<6.156; the GIL-ful interpreters keep resolving whatever pip picks, as upstream's workflow does.build-hypothesis.ymllanded onmainin #451 and buildscp314t, so this pin should go away once those wheels are actually onpypi.riseproject.dev(the index still 302s for hypothesis today) — at that pointCIBW_ENVIRONMENT: PIP_EXTRA_INDEX_URL=https://pypi.riseproject.dev/simple/restores upstream's unpinned line on every entry.Results
All four matrix jobs green, publish job dry-ran the four wheels ("Dry run (not on main branch — no upload will happen)"). Each job runs upstream's exact test command: 123 pytest tests from
test.pyplus 226 doctests fromcydoctest.py, and aunzip-equivalent check that thepyroaring...soreally is in the wheel.Local validation before pushing
setup_requires=['cython>=3.0.2']and released 1.1.0 against 3.2.x): builds clean, and all 123 tests pluscydoctest.pypass, so no version pin is warranted here.pyroaring...sowins over the checkout'spyroaring/directory when pytest inserts the project root onsys.path— that directory has no__init__.py, so it is only a namespace portion and the installed extension is what gets imported.actionlintclean apart from the usuallabel "ubuntu-24.04-riscv" is unknown.