Spec #16 ticket #26: Void template for the whisper.cpp Python binding, built from the pinned 1.5.0 sdist with the Vulkan backend (default-on option), shared libraries, and portable CPU flags. Includes the podman build/smoke harness, pinned base-image pins, and offline policy tests. Refs: #26
Void packaging
Void Linux (glibc, x86_64) templates in void-packages layout, built with the standard Void source tooling. Submission to upstream void-packages is out of scope for spec #16; these templates serve the signed personal xbps repository first.
Layout
packaging/void/
├── README.md this file
├── build.sh podman harness: lint + xbps-src build + import smoke
├── tool_checksums.txt pinned base image and void-packages commit
└── srcpkgs/
├── python3-pywhispercpp/ ticket #26: whisper.cpp Python binding
├── ... ticket #25: small Python dependencies
└── voculinux ticket #27: the application
srcpkgs/ mirrors void-packages so the tree overlays cleanly:
cp -r packaging/void/srcpkgs/. /path/to/void-packages/srcpkgs/
(build.sh does this inside the container.)
Templates
| Template | Ticket | Notes |
|---|---|---|
python3-pywhispercpp |
#26 | Vulkan backend on by default; see below |
python3-pywhispercpp
Version 1.5.0, pinned to the same version install.sh
(PYWHISPERCPP_VERSION) and uv.lock pin — never newest upstream.
The sdist checksum in the template must equal the sha256 uv.lock records
for the sdist; tests/test_void_pywhispercpp_template.py fails otherwise.
- Vulkan is a build option, on by default. Rebuild CPU-only with
build.sh python3-pywhispercpp -- -o ~vulkan pkg. There is no CUDA build: Void ships no CUDA toolkit package. Rebuilding locally with a hand-installed toolkit (GGML_CUDA=1) is a documented, unsupported escape hatch. - Portable CPU flags: every ggml SIMD option is pinned off
(
-DGGML_NATIVE=OFF -DGGML_SSE42=OFF ...), the plain x86-64 baseline already used by the Flatpak (#938,#957). The offline test asserts each pin in the template (the build configuration), and the harness scans the shippedlibggml-cpu(.GCC.command.line,.comment) for recorded-march=native/-mcpu=native/-mtune=nativeflags and fails on a match. The recorded-flags scan is a tripwire, not a proof: the proof is the pinned configuration plussetup.py's documentedCMAKE_ARGSpassthrough. - Shared libraries:
BUILD_SHARED_LIBS=ONwith an$ORIGINrpath (asinstall.shdoes), so the extension resolves the whisper.cpp libraries installed beside it with noLD_LIBRARY_PATH. - Offline build: the sdist vendors whisper.cpp, pybind11, and the
ggml sources; the build fetches nothing beyond the declared distfiles.
PYWHISPERCPP_VERSIONis injected because the sdist carries noversion.txt(its version otherwise comes from git metadata). - Runtime deps (
python3-numpy,python3-requests,python3-tqdm,python3-platformdirs) are the sdist's owninstall_requiresand were verified to exist in current void-packages; the container build re-verifies via dependency resolution.
Building
packaging/void/build.sh python3-pywhispercpp
packaging/void/build.sh python3-pywhispercpp -- -o ~vulkan pkg
Podman only, never Docker. The base image digest and the void-packages
commit come from tool_checksums.txt; bump them there, never in the
script. Ticket #28 wires this into the package smoke gate.