Files
voculinux/packaging/void
soubarnak 1d8b07727e feat(void): add xbps template for python3-pywhispercpp
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
2026-11-06 00:04:47 +05:30
..

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 shipped libggml-cpu (.GCC.command.line, .comment) for recorded -march=native/-mcpu=native/-mtune=native flags and fails on a match. The recorded-flags scan is a tripwire, not a proof: the proof is the pinned configuration plus setup.py's documented CMAKE_ARGS passthrough.
  • Shared libraries: BUILD_SHARED_LIBS=ON with an $ORIGIN rpath (as install.sh does), so the extension resolves the whisper.cpp libraries installed beside it with no LD_LIBRARY_PATH.
  • Offline build: the sdist vendors whisper.cpp, pybind11, and the ggml sources; the build fetches nothing beyond the declared distfiles. PYWHISPERCPP_VERSION is injected because the sdist carries no version.txt (its version otherwise comes from git metadata).
  • Runtime deps (python3-numpy, python3-requests, python3-tqdm, python3-platformdirs) are the sdist's own install_requires and 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.