From 4776dc01d23fc78d974c0e8834943e9f734bd631 Mon Sep 17 00:00:00 2001 From: Markus Fritsche Date: Mon, 18 May 2026 18:38:52 +0000 Subject: [PATCH] daedalus-v4l2-dkms: loud warning when DKMS build doesn't land Sonnet pre-deployment review caught a BLOCKER: on a fresh higgs (Debian 13 / Pi CM5) install without the RPi kernel headers pre-installed, the postinst's `dkms autoinstall || true` silently swallowed the build failure. Package appeared installed but the .ko was absent; `modprobe daedalus_v4l2` then failed and the entire stack was dead with no clear pointer to the cause. Fix in both ecosystems: debian/daedalus-v4l2-dkms/build-deb.sh: - After `dkms autoinstall`, verify the post-condition with `dkms status -m daedalus_v4l2 -v VER -k $(uname -r)`. - If the module isn't 'installed' / 'loaded' for the running kernel, emit a yellow-bolded ANSI warning naming the most likely cause (kernel headers package missing) and the exact recovery steps (linux-headers-rpi-2712 for RPi or linux-headers-$KERNELVER for Debian generic, then `dkms autoinstall` + `modprobe`). - Colour only on TTY; the warning is unconditional regardless. arch/daedalus-v4l2-dkms/: - New daedalus-v4l2-dkms.install with post_install + post_upgrade hooks that run the same `dkms status` check. - post_upgrade catches the case where a kernel-headers package was uninstalled / pruned between upgrades, silently regressing the build. - Wired into the PKGBUILD via install="${pkgname}.install". Both versions point at the actual repair commands rather than just saying "build failed", so the user is one apt/pacman away from a working stack instead of debugging dkms internals. Co-Authored-By: Claude Opus 4.7 (1M context) --- arch/daedalus-v4l2-dkms/PKGBUILD | 5 +- .../daedalus-v4l2-dkms.install | 61 +++++++++++++++++++ debian/daedalus-v4l2-dkms/build-deb.sh | 47 +++++++++++++- 3 files changed, 110 insertions(+), 3 deletions(-) create mode 100644 arch/daedalus-v4l2-dkms/daedalus-v4l2-dkms.install diff --git a/arch/daedalus-v4l2-dkms/PKGBUILD b/arch/daedalus-v4l2-dkms/PKGBUILD index 963f6a74d..aa5f71f33 100644 --- a/arch/daedalus-v4l2-dkms/PKGBUILD +++ b/arch/daedalus-v4l2-dkms/PKGBUILD @@ -28,10 +28,13 @@ url="https://git.reauktion.de/reauktion/daedalus-v4l2" license=('GPL-2.0-or-later') depends=('dkms') makedepends=('git') +install="${pkgname}.install" source=("git+https://git.reauktion.de/reauktion/daedalus-v4l2.git#commit=${_commit}" - "dkms.conf") + "dkms.conf" + "${pkgname}.install") sha256sums=('SKIP' + 'SKIP' 'SKIP') pkgver() { diff --git a/arch/daedalus-v4l2-dkms/daedalus-v4l2-dkms.install b/arch/daedalus-v4l2-dkms/daedalus-v4l2-dkms.install new file mode 100644 index 000000000..aa3429d43 --- /dev/null +++ b/arch/daedalus-v4l2-dkms/daedalus-v4l2-dkms.install @@ -0,0 +1,61 @@ +# post-install / post-upgrade hook for daedalus-v4l2-dkms. +# +# pacman + the dkms-helpers alpm hook will already attempt +# `dkms install` on its own. This script's job is to emit a +# loud, actionable warning when the module didn't actually +# build for the running kernel — most commonly because the +# kernel headers package isn't installed yet. +# +# Without this you get a silent failure: the package looks +# installed but `modprobe daedalus_v4l2` returns ENOENT. + +_check_dkms_built() { + local name=daedalus_v4l2 + local ver=$1 + local kernelver=$(uname -r) + + if ! command -v dkms >/dev/null 2>&1; then + return 1 # the hard-dep should have caught this + fi + + local status + status=$(dkms status -m "$name" -v "$ver" -k "$kernelver" 2>/dev/null || true) + if printf '%s\n' "$status" | grep -q -E 'installed|loaded'; then + return 0 # all good + fi + + cat >&2 < daedalus-v4l2-dkms: DKMS build did NOT land for kernel $kernelver. +==> dkms status -m $name -v $ver -k $kernelver: +==> $(printf '%s' "$status" | head -1) +==> +==> Most likely cause: kernel headers package is missing. +==> Arch / ALARM: pacman -S linux-rpi-headers (or linux-rpi5-headers) +==> Raspberry Pi OS: apt install linux-headers-rpi-2712 +==> +==> After installing headers, finish the install with: +==> sudo dkms autoinstall $name/$ver +==> sudo modprobe daedalus_v4l2 +==> +==> Until then daedalus_v4l2 will NOT be loadable and the +==> userspace daedalus-v4l2 daemon will have nothing to talk to. +EOF + return 1 +} + +post_install() { + _check_dkms_built "$1" || true +} + +post_upgrade() { + # New version pinned by the bump may have built fine, but if + # a kernel-headers package was uninstalled / pruned since the + # last upgrade we'd silently regress. Re-check. + _check_dkms_built "$1" || true +} + +pre_remove() { + # The dkms alpm hook handles dkms remove on its own; nothing + # we need to add here. + : +} diff --git a/debian/daedalus-v4l2-dkms/build-deb.sh b/debian/daedalus-v4l2-dkms/build-deb.sh index c027e0395..d282da003 100755 --- a/debian/daedalus-v4l2-dkms/build-deb.sh +++ b/debian/daedalus-v4l2-dkms/build-deb.sh @@ -78,10 +78,53 @@ set -e NAME=${MODULE_NAME} VERSION=${PKGVER} +KERNELVER=\$(uname -r) + +# Yellow + bold ANSI for the warning so it stands out in apt's +# stream of "Setting up" lines. Disable colour on non-TTY. +if [ -t 1 ]; then + Y=\$(printf '\\033[1;33m'); R=\$(printf '\\033[0m') +else + Y=''; R='' +fi + +warn() { + printf '%s==> daedalus-v4l2-dkms: %s%s\\n' "\$Y" "\$1" "\$R" >&2 +} + +if [ "\$1" = "configure" ]; then + if ! command -v dkms >/dev/null 2>&1; then + warn "dkms not installed; module \$NAME/\$VERSION not registered." + warn "Install 'dkms' then run: dkms add \$NAME/\$VERSION && dkms autoinstall" + exit 0 + fi -if [ "\$1" = "configure" ] && command -v dkms >/dev/null 2>&1; then dkms add "\$NAME/\$VERSION" 2>/dev/null || true - dkms autoinstall "\$NAME/\$VERSION" || true + + # Don't let autoinstall failure mask the actual problem behind '|| true'. + # Run it, capture the result, then verify post-condition. + autoinstall_rc=0 + dkms autoinstall "\$NAME/\$VERSION" || autoinstall_rc=\$? + + # Verify the module actually built + installed for the running kernel. + status=\$(dkms status -m "\$NAME" -v "\$VERSION" -k "\$KERNELVER" 2>/dev/null || true) + if ! printf '%s\\n' "\$status" | grep -q -E 'installed|loaded'; then + warn "" + warn "DKMS build did NOT land for kernel \$KERNELVER." + warn " dkms status -m \$NAME -v \$VERSION -k \$KERNELVER:" + warn " \$(printf '%s' "\$status" | head -1)" + warn "" + warn "Most likely cause: kernel headers package is missing." + warn " Raspberry Pi OS / Pi 5: apt install linux-headers-rpi-2712" + warn " Debian generic: apt install linux-headers-\$KERNELVER" + warn "" + warn "After installing headers, finish the install with:" + warn " sudo dkms autoinstall \$NAME/\$VERSION" + warn " sudo modprobe daedalus_v4l2" + warn "" + warn "Until then daedalus_v4l2 will NOT be loadable and the" + warn "userspace daedalus-v4l2 daemon will have nothing to talk to." + fi fi #DEBHELPER#