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#