libva-v4l2-request-fourier-debian: pin trixie libva-dev for ABI #44
Reference in New Issue
Block a user
Delete Branch "claude-noether/marfrit-packages:noether/libva-trixie-abi-pin"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Fix CI ABI skew between Arch runner and Debian target
Bug
libva-v4l2-request-fourier .deb currently unusable on Debian trixie. Built on the Arch CI runner where libva is 2.23 (VA-API 1.23), the driver exports __vaDriverInit_1_23. Trixie ships libva 2.22 (VA-API 1.22) and looks up __vaDriverInit_1_22. dlsym returns NULL, libva fallbacks to __vaDriverInit_1_0 (sentinel error name), and ffmpeg -hwaccel vaapi / vainfo / firefox-vaapi all fail to initialise on every Pi 5 / CM5 that installed the package.
Verified on higgs (Pi CM5, kernel 6.18.29+rpt-rpi-2712, libva-v4l2-request-fourier 1.0.0+r378+gc332d34-1 freshly installed): vainfo -> libva error has no function __vaDriverInit_1_0, vaInitialize -1.
Why libva but not ffmpeg
ffmpeg-v4l2-request-fourier (also built on Arch) links libva but does not EXPORT any vaDriverInit symbol — it just uses libva public API which is forward-compatible. libva-v4l2-request-fourier IS the driver and exports _vaDriverInit_, where the name is computed at compile time from <va/va.h>. So pkg-config CFLAGS pointing at Arch headers -> wrong symbol name -> loader cannot bind. readelf -d confirms the .so has no NEEDED entry for libva.so — only the symbol name matters.
Fix
debian/libva-v4l2-request-fourier/build-deb.sh now downloads libva-dev / libva2 / libva-drm2 from Debian archive (trixie 2.22.0-3 pin), extracts to a sysroot, rewrites pkgconfig prefixes, sets PKG_CONFIG_PATH so meson sees trixie headers regardless of runner libva-dev. Link step still resolves -lva against the sysroot libva.so.2 (any version works; resulting .so has no NEEDED libva entry).
Hard sanity check at end of build-deb.sh: fail the build if the produced .so does not export __vaDriverInit_1_22. Future ABI-skew failures loud at CI time instead of silent install-then-refuse-to-load.
Tested on boltzmann (aarch64) — sysroot build produces a .so exporting __vaDriverInit_1_22 (nm -D verified).
Source unchanged from c332d34; only build env differs. PKGREL 1 -> 2 (rebuild against pinned trixie libva-dev).
Companion / blast radius
LIBVA-2 unblocker — the runtime libva-bind failure has been masking the LIBVA-1 per-codec dispatch on higgs. Once the new -2 .deb lands on packages.reauktion.de, apt upgrade + daedalus daemon log + rpi-hevc-dec routing can be validated end-to-end.
Other libva-API consumers (ffmpeg-v4l2-request-fourier, mpv-fourier) do NOT have this bug — they only USE the libva API at source level, no symbol-name baking. No need to pin libva-dev for those.
🤖 Generated with Claude Code
Please check your fix - actrunner-debian-aarch64-bohr is available.
Thanks — switched the libva-v4l2-request-fourier-debian job to runs-on: debian-aarch64-bohr (
051da5e8don the branch). Dropped the sysroot download from build-deb.sh; native trixie libva-dev (2.22) gives us __vaDriverInit_1_22 naturally. Kept the post-build nm -D sanity check so a future runner change can not silently regress.Follow-up commit on top of v1 (no force-push) so the review thread keeps both approaches visible. Ready for re-review.
Please amend the PR - runner is named "actrunner-debian-aarch64-bohr"
Tried to amend but the force-push was sandbox-blocked. Pushed the rename as a follow-up commit instead:
5feab57b6— switches runs-on to the full label, in build.yml + build-deb.sh comments + the -2 changelog entry. Pure label rename; no behavior change.PR branch now:
a1ff6de(sysroot) ->051da5e(runner switch) ->5feab57(correct label). Squash on merge if you want a single clean commit.