#!/bin/bash # Build daedalus-v4l2-dkms__all.deb (kernel module via DKMS). # # Installs kernel/ source tree to /usr/src/daedalus_v4l2-${PKGVER}/ # plus a dkms.conf. Postinst registers with DKMS (dkms add + build + # install). Prerm deregisters. Result: the daedalus_v4l2 module # auto-rebuilds against any installed kernel headers without users # needing to remember to dkms-add it. # # Architecture: all. The kernel module itself is per-kernel-version, # but the SOURCE package is arch-independent. # # Sibling Arch package: ../../arch/daedalus-v4l2-dkms/PKGBUILD # Sibling userspace package: ../daedalus-v4l2/build-deb.sh set -euo pipefail UPSTREAM_COMMIT=872eec505eb91b561892d02a0526749348ddc121 PKGVER=0.1.0+r45+g872eec5 PKGREL=1 # reset for new upstream pin (872eec5 — PROTO_MAX_PAYLOAD 64 KiB -> 1 MiB, closes #19); lock-step with daedalus-v4l2 0.1.0+r45+g872eec5 REQUIRED MODULE_NAME=daedalus_v4l2 HERE=$(dirname "$(readlink -f "$0")") # Reproducible build. 2026-05-18 23:00 UTC — Phase 8.13 close. export SOURCE_DATE_EPOCH=1779231600 work=$(mktemp -d) trap "rm -rf $work" EXIT cd "$work" curl --connect-timeout 10 --max-time 600 --retry 3 --retry-delay 5 -sSLfo daedalus-v4l2.tar.gz \ "https://git.reauktion.de/reauktion/daedalus-v4l2/archive/${UPSTREAM_COMMIT}.tar.gz" tar xzf daedalus-v4l2.tar.gz SRCDIR=daedalus-v4l2 ROOT="$work/pkgroot" SRCROOT="$ROOT/usr/src/${MODULE_NAME}-${PKGVER}" mkdir -p "$SRCROOT/include" \ "$ROOT/DEBIAN" \ "$ROOT/usr/share/doc/daedalus-v4l2-dkms" # Copy kernel/ source files to the DKMS source dir. cp -r "$work/$SRCDIR/kernel/." "$SRCROOT/" # Embed the shared protocol header inline (rather than referencing # ../include/ which doesn't exist after DKMS extracts the tree). # Patch the Makefile to find it at $SRCROOT/include/ instead. install -m 644 "$work/$SRCDIR/include/daedalus_v4l2_proto.h" \ "$SRCROOT/include/daedalus_v4l2_proto.h" sed -i 's|-I\$(src)/\.\./include|-I$(src)/include|' "$SRCROOT/Makefile" # Generate dkms.conf with the actual version substituted. cat > "$SRCROOT/dkms.conf" < "$ROOT/DEBIAN/postinst" < 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 dkms add "\$NAME/\$VERSION" 2>/dev/null || true # Enumerate every kernel whose headers are actually present # (/lib/modules//build resolves to a directory). We iterate # all of them — not just \$(uname -r) — so that installing this # package after a kernel update covers the newly-installed kernel # too, and so that a later kernel-headers install for a previously # uncovered version gets picked up on dpkg-reconfigure. Without # this, autoinstall (which targets only the running kernel) leaves # /dev/daedalus-v4l2 absent after a kernel switch + reboot # (marfrit/marfrit-packages#64). kvers='' for d in /lib/modules/*/build; do [ -d "\$d" ] || continue k=\$(basename "\$(dirname "\$d")") kvers="\$kvers \$k" done if [ -z "\$kvers" ]; then warn "" warn "No kernels with headers found under /lib/modules/*/build." warn "Install kernel headers (e.g. linux-headers-rpi-2712 on Pi OS)" warn "then finish with:" warn " sudo dkms autoinstall \$NAME/\$VERSION" exit 0 fi failed='' for k in \$kvers; do dkms autoinstall -k "\$k" "\$NAME/\$VERSION" >/dev/null 2>&1 || true s=\$(dkms status -m "\$NAME" -v "\$VERSION" -k "\$k" 2>/dev/null || true) if ! printf '%s\\n' "\$s" | grep -q -E 'installed|loaded'; then failed="\$failed \$k" fi done if [ -n "\$failed" ]; then warn "" warn "DKMS build did NOT land for kernel(s):\$failed" warn "" warn "Most likely cause: kernel headers missing for those versions." warn " Raspberry Pi OS / Pi 5: apt install linux-headers-rpi-2712" warn " Debian generic: apt install linux-headers-" warn "" warn "After installing headers, finish with:" for k in \$failed; do warn " sudo dkms autoinstall -k \$k \$NAME/\$VERSION" done warn " sudo modprobe daedalus_v4l2 (after booting that kernel)" warn "" warn "Until then daedalus_v4l2 will NOT be loadable on those kernels" warn "and the userspace daedalus-v4l2 daemon will have nothing to talk to." fi fi #DEBHELPER# EOF chmod 755 "$ROOT/DEBIAN/postinst" cat > "$ROOT/DEBIAN/prerm" </dev/null 2>&1; then dkms remove "\$NAME/\$VERSION" --all || true fi #DEBHELPER# EOF chmod 755 "$ROOT/DEBIAN/prerm" cat > "$ROOT/DEBIAN/control" <= 2.1.0.0) Recommends: daedalus-v4l2, linux-headers-rpi-2712 | linux-headers-rpi | linux-headers-generic | linux-headers Maintainer: Markus Fritsche Homepage: https://git.reauktion.de/reauktion/daedalus-v4l2 Description: V4L2 stateless decoder shim kernel module (DKMS) — Pi 5 / CM5 Out-of-tree V4L2 m2m kernel module for the daedalus-v4l2 stack on Raspberry Pi 5 / CM5. Registers /dev/videoNN (V4L2 stateless m2m decoder), /dev/mediaNN (media controller with request API), and /dev/daedalus-v4l2 (chardev bridge to the userspace daemon). . The actual decode happens in the userspace daemon shipped by the daedalus-v4l2 package — this module is just the kernel-side V4L2 plumbing. Install both to actually serve VAAPI / V4L2 clients. . Built via DKMS against the running kernel's headers. EOF DEB_OUT="daedalus-v4l2-dkms_${PKGVER}-${PKGREL}_all.deb" dpkg-deb --root-owner-group --build "$ROOT" "$HERE/$DEB_OUT" echo "built: $HERE/$DEB_OUT"