forked from unom/punktfunk
Same bug as the Arch package, in the other two packagings. The .deb CLIENT recommended `pipewire-pulse`. Apt installs Recommends by default and the shim Conflicts with `pulseaudio`, so this proposed pulling the user's sound server out from under them in exchange for something the client cannot use: audio.rs drives libpipewire-0.3 directly and opens no Pulse socket. (SDL is initialized with zero subsystems — gamepads only, on demand — so it brings no audio backend either.) The RPM HOST hard-Required `pipewire-pulseaudio`, which conflicts with `pulseaudio` on Fedora too — uninstallable for anyone running real PulseAudio. The host doesn't speak Pulse either; the shim is for the GAMES, which commonly emit through the PulseAudio API, and real PulseAudio serves those equally well. Demoted to Recommends, so the default Fedora box is unchanged and the informed choice stops being blocked. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
161 lines
7.1 KiB
Bash
161 lines
7.1 KiB
Bash
#!/usr/bin/env bash
|
|
# Build the punktfunk-client .deb (the native GTK4 client) for Ubuntu/Debian desktops.
|
|
#
|
|
# Counterpart to build-deb.sh (the host package); same conventions: runtime Depends are
|
|
# computed by dpkg-shlibdeps from the binary's DT_NEEDED (GTK4/libadwaita, SDL3, the
|
|
# FFmpeg/PipeWire/Opus sonames), so build inside the Ubuntu 26.04 rust-ci image to pin
|
|
# the package names the target boxes ship. The client links no NVIDIA libs — no filter
|
|
# needed.
|
|
#
|
|
# Usage: VERSION=0.0.1~ci42.gdeadbee [ARCH=amd64] [TARGET=<rust triple>] \
|
|
# bash packaging/debian/build-client-deb.sh
|
|
# Output: dist/punktfunk-client_<version>_<arch>.deb
|
|
#
|
|
# TARGET cross-compiles (and moves the binaries under target/<triple>/release). Set it
|
|
# together with ARCH — e.g. ARCH=arm64 TARGET=aarch64-unknown-linux-gnu inside the
|
|
# ci/rust-ci-arm64cross.Dockerfile image, which carries the matching :arm64 sysroot.
|
|
set -euo pipefail
|
|
|
|
VERSION="${VERSION:?set VERSION (e.g. 0.0.1 or 0.0.1~ci42.gdeadbee)}"
|
|
ARCH="${ARCH:-amd64}"
|
|
TARGET="${TARGET:-}"
|
|
PKG="punktfunk-client"
|
|
CRATE="punktfunk-client-linux"
|
|
ROOTDIR="$(cd "$(dirname "$0")/../.." && pwd)"
|
|
cd "$ROOTDIR"
|
|
|
|
# Cargo drops a cross build under target/<triple>/release, a native one straight in
|
|
# target/release.
|
|
if [ -n "$TARGET" ]; then
|
|
OUTDIR="target/$TARGET/release"
|
|
CARGO_TARGET_ARGS=(--target "$TARGET")
|
|
else
|
|
OUTDIR="target/release"
|
|
CARGO_TARGET_ARGS=()
|
|
fi
|
|
|
|
BIN="$OUTDIR/$PKG"
|
|
# The Vulkan/Skia session streamer the shell execs for a connect — shipped alongside the shell
|
|
# (the shell resolves it as its /usr/bin sibling), or desktop streaming breaks.
|
|
SESSION_BIN="$OUTDIR/punktfunk-session"
|
|
if [ ! -x "$BIN" ] || [ ! -x "$SESSION_BIN" ]; then
|
|
echo "==> building $CRATE + punktfunk-client-session (release${TARGET:+ for $TARGET})"
|
|
cargo build --release --locked "${CARGO_TARGET_ARGS[@]}" -p "$CRATE" -p punktfunk-client-session
|
|
fi
|
|
|
|
STAGE="$(mktemp -d)"
|
|
trap 'rm -rf "$STAGE"' EXIT
|
|
DOCDIR="$STAGE/usr/share/doc/$PKG"
|
|
|
|
# --- file layout --------------------------------------------------------------
|
|
install -Dm0755 "$BIN" "$STAGE/usr/bin/$PKG"
|
|
install -Dm0755 "$SESSION_BIN" "$STAGE/usr/bin/punktfunk-session"
|
|
install -Dm0644 packaging/linux/io.unom.Punktfunk.desktop \
|
|
"$STAGE/usr/share/applications/io.unom.Punktfunk.desktop"
|
|
# DualSense hidraw access (full pad fidelity through SDL's HIDAPI driver).
|
|
install -Dm0644 scripts/70-punktfunk-client.rules \
|
|
"$STAGE/usr/lib/udev/rules.d/70-punktfunk-client.rules"
|
|
# UDP receive-buffer tuning (32 MB) — without it the kernel clamps the client's SO_RCVBUF and
|
|
# high-bitrate streams overflow it at the receiver (measured: 4 MB cap = 31.6% loss at 2 Gbps,
|
|
# 32 MB = 0%). systemd-sysctl applies it at boot; the postinst applies it on install.
|
|
install -Dm0644 scripts/99-punktfunk-client-net.conf \
|
|
"$STAGE/usr/lib/sysctl.d/99-punktfunk-client-net.conf"
|
|
install -Dm0644 LICENSE-MIT "$DOCDIR/LICENSE-MIT"
|
|
install -Dm0644 LICENSE-APACHE "$DOCDIR/LICENSE-APACHE"
|
|
install -Dm0644 README.md "$DOCDIR/README.md"
|
|
# Third-party crate attributions (regenerate with scripts/gen-third-party-notices.sh).
|
|
if [ -f THIRD-PARTY-NOTICES.txt ]; then
|
|
install -Dm0644 THIRD-PARTY-NOTICES.txt "$DOCDIR/THIRD-PARTY-NOTICES.txt"
|
|
fi
|
|
|
|
cat > "$DOCDIR/copyright" <<EOF
|
|
Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
|
|
Upstream-Name: punktfunk
|
|
Source: https://git.unom.io/unom/punktfunk
|
|
|
|
Files: *
|
|
Copyright: unom and the punktfunk contributors
|
|
License: MIT or Apache-2.0
|
|
Dual-licensed. Full texts in /usr/share/doc/$PKG/LICENSE-MIT and
|
|
/usr/share/doc/$PKG/LICENSE-APACHE.
|
|
EOF
|
|
printf '%s (%s) stable; urgency=medium\n\n * Automated build %s.\n\n -- unom <packages@unom.io> %s\n' \
|
|
"$PKG" "$VERSION" "$VERSION" "$(date -uR 2>/dev/null || echo 'Thu, 01 Jan 1970 00:00:00 +0000')" \
|
|
| gzip -9n > "$DOCDIR/changelog.Debian.gz"
|
|
|
|
# --- dependencies --------------------------------------------------------------
|
|
SHLIB_TMP="$(mktemp -d)"
|
|
mkdir -p "$SHLIB_TMP/debian"
|
|
cat > "$SHLIB_TMP/debian/control" <<EOF
|
|
Source: $PKG
|
|
|
|
Package: $PKG
|
|
Architecture: any
|
|
Depends: \${shlibs:Depends}
|
|
EOF
|
|
# Resolve DT_NEEDED for BOTH the shell and the session streamer (dpkg-shlibdeps merges).
|
|
SHDEPS="$(cd "$SHLIB_TMP" && dpkg-shlibdeps -O --ignore-missing-info \
|
|
"$ROOTDIR/$BIN" "$ROOTDIR/$SESSION_BIN" 2>/dev/null \
|
|
| sed -n 's/^shlibs:Depends=//p')"
|
|
rm -rf "$SHLIB_TMP"
|
|
[ -n "$SHDEPS" ] || { echo "dpkg-shlibdeps produced no deps — is dpkg-dev installed?" >&2; exit 1; }
|
|
|
|
# Manual addition shlibdeps can't see: the session streamer loads libvulkan at runtime (ash,
|
|
# dlopen — not a DT_NEEDED), and streaming can't start without it, so it's a hard Depends.
|
|
SHDEPS="$SHDEPS, libvulkan1"
|
|
|
|
# Manual additions shlibdeps can't see: the PipeWire daemon + session manager are runtime
|
|
# services (audio playback / mic capture degrade gracefully without them — Recommends).
|
|
# NOT pipewire-pulse: the client speaks native PipeWire (audio.rs → libpipewire-0.3) and never
|
|
# opens a Pulse socket, and the shim Conflicts with pulseaudio — so recommending it only nags
|
|
# users who run real PulseAudio, in exchange for nothing the client can use.
|
|
RECOMMENDS="pipewire, wireplumber"
|
|
|
|
INSTALLED_KB="$(du -k -s "$STAGE" | cut -f1)"
|
|
|
|
install -d "$STAGE/DEBIAN"
|
|
cat > "$STAGE/DEBIAN/control" <<EOF
|
|
Package: $PKG
|
|
Version: $VERSION
|
|
Architecture: $ARCH
|
|
Maintainer: unom <packages@unom.io>
|
|
Installed-Size: $INSTALLED_KB
|
|
Section: net
|
|
Priority: optional
|
|
Homepage: https://git.unom.io/unom/punktfunk
|
|
Depends: $SHDEPS
|
|
Recommends: $RECOMMENDS
|
|
Description: Low-latency desktop/game streaming client (punktfunk/1, GTK4)
|
|
The native Linux client for punktfunk, a Linux-first low-latency desktop and
|
|
game streaming stack. Discovers hosts on the LAN (mDNS), trusts them via
|
|
certificate pinning with a SPAKE2 PIN pairing ceremony, and streams HEVC video
|
|
(GF(2^16) Leopard FEC + AES-GCM over UDP, QUIC control plane) with Opus audio,
|
|
microphone passthrough, and full gamepad support including DualSense touchpad,
|
|
motion, adaptive triggers and lightbar through SDL3.
|
|
.
|
|
The host creates a virtual output at exactly this client's resolution and
|
|
refresh rate — no scaling. See the punktfunk-host package for the host side.
|
|
EOF
|
|
|
|
cat > "$STAGE/DEBIAN/postinst" <<'EOF'
|
|
#!/bin/sh
|
|
set -e
|
|
if [ "$1" = "configure" ]; then
|
|
# Pick up the DualSense hidraw rule without a reboot (best-effort, no-op in containers).
|
|
udevadm control --reload-rules 2>/dev/null || true
|
|
udevadm trigger --subsystem-match=hidraw 2>/dev/null || true
|
|
update-desktop-database /usr/share/applications 2>/dev/null || true
|
|
# Apply the UDP recv-buffer tuning now (also auto-applied at boot by systemd-sysctl).
|
|
sysctl -p /usr/lib/sysctl.d/99-punktfunk-client-net.conf >/dev/null 2>&1 || true
|
|
fi
|
|
exit 0
|
|
EOF
|
|
chmod 0755 "$STAGE/DEBIAN/postinst"
|
|
|
|
mkdir -p dist
|
|
OUT="dist/${PKG}_${VERSION}_${ARCH}.deb"
|
|
dpkg-deb --root-owner-group --build "$STAGE" "$OUT" >/dev/null
|
|
echo "built $OUT"
|
|
echo " Depends: $SHDEPS"
|
|
dpkg-deb -I "$OUT" | sed -n 's/^/ /p' | grep -E 'Version|Installed-Size' || true
|