df09c1c55d
481279c adds packaging/systemd/{daedalus-v4l2.service,modules-load} to
the upstream tree. This commit wires those into both the Arch
(PKGBUILD + .install) and Debian (build-deb.sh + postinst/prerm/postrm)
package layouts so that a fresh install of daedalus-v4l2 + daedalus-
v4l2-dkms on a Pi 5 leaves the kernel module loaded at next boot AND
the userspace broker daemon enabled — no manual modprobe / systemctl
enable dance needed.
arch/daedalus-v4l2:
* pkgver 0.1.0.r18.481279c, pkgrel reset to 1 (new upstream pin).
* Dropped 'systemd-libs' from depends — daemon doesn't link
libsystemd (no sd_notify); the .service unit is consumed by
systemd-the-init, no link-time dep required.
* package() now installs the .service to
/usr/lib/systemd/system/daedalus-v4l2.service and the modules-
load drop-in to /usr/lib/modules-load.d/daedalus-v4l2.conf.
* New .install file: post_install/post_upgrade run daemon-reload +
enable + systemd-modules-load + try-restart on upgrade; pre/post
remove tear down cleanly. No auto-start — operator decides.
arch/daedalus-v4l2-dkms:
* pkgver bump to 481279c, pkgrel reset to 1. Kernel module itself
is bit-identical to f0cd29a (commit only touches packaging/) but
bumping in lockstep keeps DKMS source-tree pkgver matched to the
userspace pkgver so /etc/modules-load.d points at a module that
actually exists.
debian/daedalus-v4l2:
* Same bump 481279c, PKGREL=1.
* build-deb.sh stages /lib/systemd/system/ + /usr/lib/modules-load.d/
and installs both files.
* Generates DEBIAN/postinst that runs daemon-reload, enables the
service, triggers systemd-modules-load, and conditionally starts
the service iff /dev/daedalus-v4l2 is already present (uses the
same ConditionPathExists= guard as the unit file so apt install
doesn't fail loudly on a host where dkms hasn't built yet).
* Generates DEBIAN/prerm (stop + disable on remove) and
DEBIAN/postrm (daemon-reload).
debian/daedalus-v4l2-dkms:
* Lockstep version bump, PKGREL=1. Postinst (loud-warn-on-missing-
headers) unchanged.
Verified the SHA via local rev-parse against ~/src/daedalus-v4l2 —
481279c is the "packaging/systemd: ship daedalus-v4l2.service +
modules-load drop-in" commit on main.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
182 lines
6.5 KiB
Bash
Executable File
182 lines
6.5 KiB
Bash
Executable File
#!/bin/bash
|
|
# Build daedalus-v4l2_<ver>_arm64.deb (userspace daemon + test tools).
|
|
#
|
|
# Mirrors arch/daedalus-v4l2 (Arch Linux build). The companion DKMS
|
|
# package (debian/daedalus-v4l2-dkms) carries the kernel module
|
|
# separately so apt/dpkg can split kernel-version-tied and userspace
|
|
# upgrade cadence.
|
|
#
|
|
# Sibling Arch package: ../../arch/daedalus-v4l2/PKGBUILD
|
|
# Sibling DKMS package: ../daedalus-v4l2-dkms/build-deb.sh
|
|
# Upstream repo: https://git.reauktion.de/reauktion/daedalus-v4l2
|
|
set -euo pipefail
|
|
|
|
# Same pin as the Arch PKGBUILD. 481279c = "Phase 8.13: byte-exact
|
|
# end-to-end via libva (consumer target hit)" — first commit where the
|
|
# full ffmpeg -hwaccel vaapi → libva → /dev/video0 → daemon path lands
|
|
# a pixel-correct decoded frame back in ffmpeg.
|
|
UPSTREAM_COMMIT=481279c9bffd19e32c8f3299897e9b63fc5a24aa
|
|
PKGVER=0.1.0+r18+g481279c
|
|
PKGREL=1 # reset for new upstream pin (481279c — Phase 8.13 close)
|
|
|
|
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 -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
|
|
|
|
# Build daemon (CMake)
|
|
cd "$SRCDIR/daemon"
|
|
cmake -B build -G Ninja \
|
|
-DCMAKE_BUILD_TYPE=Release \
|
|
-DCMAKE_INSTALL_PREFIX=/usr
|
|
cmake --build build
|
|
|
|
# Build test tools (in-tree Makefile)
|
|
cd "$work/$SRCDIR/tools"
|
|
make
|
|
|
|
# Stage
|
|
ROOT="$work/pkgroot"
|
|
mkdir -p "$ROOT/DEBIAN" \
|
|
"$ROOT/usr/bin" \
|
|
"$ROOT/usr/libexec/daedalus-v4l2" \
|
|
"$ROOT/usr/include" \
|
|
"$ROOT/usr/share/doc/daedalus-v4l2" \
|
|
"$ROOT/lib/systemd/system" \
|
|
"$ROOT/usr/lib/modules-load.d"
|
|
|
|
install -m 755 "$work/$SRCDIR/daemon/build/daedalus_v4l2_daemon" \
|
|
"$ROOT/usr/bin/daedalus_v4l2_daemon"
|
|
|
|
install -m 755 "$work/$SRCDIR/tools/test_chardev_pingpong" \
|
|
"$ROOT/usr/libexec/daedalus-v4l2/test_chardev_pingpong"
|
|
install -m 755 "$work/$SRCDIR/tools/test_m2m_decode" \
|
|
"$ROOT/usr/libexec/daedalus-v4l2/test_m2m_decode"
|
|
install -m 755 "$work/$SRCDIR/tools/test_m2m_stream" \
|
|
"$ROOT/usr/libexec/daedalus-v4l2/test_m2m_stream"
|
|
|
|
install -m 644 "$work/$SRCDIR/include/daedalus_v4l2_proto.h" \
|
|
"$ROOT/usr/include/daedalus_v4l2_proto.h"
|
|
|
|
# systemd unit + module autoload — without these the daemon never
|
|
# starts and the libva/VAAPI consumer's REQ_DECODE has nobody on
|
|
# the other end of /dev/daedalus-v4l2.
|
|
install -m 644 "$work/$SRCDIR/packaging/systemd/daedalus-v4l2.service" \
|
|
"$ROOT/lib/systemd/system/daedalus-v4l2.service"
|
|
install -m 644 "$work/$SRCDIR/packaging/systemd/daedalus-v4l2.modules-load" \
|
|
"$ROOT/usr/lib/modules-load.d/daedalus-v4l2.conf"
|
|
|
|
install -m 644 "$work/$SRCDIR/README.md" \
|
|
"$ROOT/usr/share/doc/daedalus-v4l2/README.md"
|
|
for d in "$work/$SRCDIR/docs/"*.md; do
|
|
install -m 644 "$d" "$ROOT/usr/share/doc/daedalus-v4l2/$(basename "$d")"
|
|
done
|
|
|
|
install -Dm644 "$HERE/debian/copyright" "$ROOT/usr/share/doc/daedalus-v4l2/copyright"
|
|
install -Dm644 "$HERE/debian/changelog" "$ROOT/usr/share/doc/daedalus-v4l2/changelog.Debian"
|
|
gzip -9 -n "$ROOT/usr/share/doc/daedalus-v4l2/changelog.Debian"
|
|
|
|
# DEBIAN/postinst — enable service + reload modules-load.d so the
|
|
# kernel module loads now if daedalus-v4l2-dkms is also installed.
|
|
# Does NOT auto-start the service — that requires /dev/daedalus-v4l2
|
|
# to already exist (the ConditionPathExists= in the .service file)
|
|
# which may not be true on the very first install before the user
|
|
# reboots or manually modprobes. Operator decides when to start.
|
|
cat > "$ROOT/DEBIAN/postinst" <<'POSTINST'
|
|
#!/bin/sh
|
|
set -e
|
|
|
|
if [ "$1" = "configure" ]; then
|
|
# Reload systemd so the new unit file is visible.
|
|
if command -v systemctl >/dev/null 2>&1; then
|
|
systemctl daemon-reload >/dev/null 2>&1 || true
|
|
systemctl enable daedalus-v4l2.service >/dev/null 2>&1 || true
|
|
fi
|
|
|
|
# Trigger /usr/lib/modules-load.d/daedalus-v4l2.conf without a
|
|
# reboot. Harmless if the module is already loaded; logs to
|
|
# journal if it can't load (most common cause: dkms hasn't built
|
|
# the module yet for the running kernel — see daedalus-v4l2-dkms
|
|
# postinst for the loud-warning path).
|
|
if command -v systemd-modules-load >/dev/null 2>&1; then
|
|
systemd-modules-load >/dev/null 2>&1 || true
|
|
fi
|
|
|
|
# Auto-start if /dev/daedalus-v4l2 came up (i.e. module loaded
|
|
# successfully). ConditionPathExists in the unit file means
|
|
# `systemctl start` is a no-op if the device isn't there yet —
|
|
# avoids spurious failures during apt install on a host where
|
|
# daedalus-v4l2-dkms hasn't built yet.
|
|
if [ -e /dev/daedalus-v4l2 ] && command -v systemctl >/dev/null 2>&1; then
|
|
systemctl start daedalus-v4l2.service >/dev/null 2>&1 || true
|
|
fi
|
|
fi
|
|
|
|
#DEBHELPER#
|
|
POSTINST
|
|
chmod 755 "$ROOT/DEBIAN/postinst"
|
|
|
|
cat > "$ROOT/DEBIAN/prerm" <<'PRERM'
|
|
#!/bin/sh
|
|
set -e
|
|
|
|
if [ "$1" = "remove" ] && command -v systemctl >/dev/null 2>&1; then
|
|
systemctl stop daedalus-v4l2.service >/dev/null 2>&1 || true
|
|
systemctl disable daedalus-v4l2.service >/dev/null 2>&1 || true
|
|
fi
|
|
|
|
#DEBHELPER#
|
|
PRERM
|
|
chmod 755 "$ROOT/DEBIAN/prerm"
|
|
|
|
cat > "$ROOT/DEBIAN/postrm" <<'POSTRM'
|
|
#!/bin/sh
|
|
set -e
|
|
|
|
if command -v systemctl >/dev/null 2>&1; then
|
|
systemctl daemon-reload >/dev/null 2>&1 || true
|
|
fi
|
|
|
|
#DEBHELPER#
|
|
POSTRM
|
|
chmod 755 "$ROOT/DEBIAN/postrm"
|
|
|
|
cat > "$ROOT/DEBIAN/control" <<EOF
|
|
Package: daedalus-v4l2
|
|
Version: ${PKGVER}-${PKGREL}
|
|
Section: video
|
|
Priority: optional
|
|
Architecture: arm64
|
|
Depends: ffmpeg-v4l2-request-fourier (>= 2:8.1+rfourier), libdrm2
|
|
Recommends: daedalus-v4l2-dkms
|
|
Maintainer: Markus Fritsche <mfritsche@reauktion.de>
|
|
Homepage: https://git.reauktion.de/reauktion/daedalus-v4l2
|
|
Description: Userspace daemon for the daedalus_v4l2 stateless decoder shim
|
|
daedalus-v4l2 ships the userspace daemon that backs the daedalus_v4l2
|
|
out-of-tree V4L2 kernel module on Raspberry Pi 5 / CM5. Together they
|
|
expose /dev/videoNN + /dev/mediaNN as a V4L2 stateless decoder for
|
|
VP9, AV1, and H.264 — actual decoding happens in this single-threaded
|
|
daemon via dlopen'd FFmpeg, with decoded NV12 / P010 frames shipped
|
|
back through dmabuf.
|
|
.
|
|
Consumed end-to-end by libva-v4l2-request-fourier (>= 1.0.0+r376) so
|
|
that 'ffmpeg -hwaccel vaapi' against vp9_small.ivf produces a
|
|
byte-exact NV12 frame.
|
|
.
|
|
The kernel module ships separately in daedalus-v4l2-dkms; install
|
|
both to actually serve V4L2 clients.
|
|
EOF
|
|
|
|
DEB_OUT="daedalus-v4l2_${PKGVER}-${PKGREL}_arm64.deb"
|
|
dpkg-deb --root-owner-group --build "$ROOT" "$HERE/$DEB_OUT"
|
|
echo "built: $HERE/$DEB_OUT"
|