efbcc4cdb6
apple / swift (push) Successful in 1m21s
ci / web (push) Successful in 54s
apple / screenshots (push) Successful in 6m19s
ci / docs-site (push) Successful in 1m6s
ci / bench (push) Successful in 5m16s
release / apple (push) Successful in 10m54s
android-screenshots / screenshots (push) Successful in 4m1s
ci / rust (push) Successful in 26m27s
decky / build-publish (push) Successful in 20s
android / android (push) Successful in 14m8s
deb / build-publish (push) Successful in 10m58s
docker / deploy-docs (push) Successful in 9s
docker / build-push (--build-arg FEDORA_VERSION=44, ci, ci/fedora-rpm.Dockerfile, punktfunk-fedora44-rpm) (push) Successful in 12s
docker / build-push (ci, ci/fedora-rpm.Dockerfile, punktfunk-fedora-rpm) (push) Successful in 11s
docker / build-push (., web/Dockerfile, punktfunk-web) (push) Successful in 11s
docker / build-push (ci, ci/rust-ci-noble.Dockerfile, punktfunk-rust-ci-noble) (push) Successful in 9s
docker / build-push (ci, ci/rust-ci.Dockerfile, punktfunk-rust-ci) (push) Successful in 12s
docker / build-push (docs-site, docs-site/Dockerfile, punktfunk-docs) (push) Successful in 10s
deb / build-publish-host (push) Successful in 10m40s
linux-client-screenshots / screenshots (push) Successful in 7m14s
web-screenshots / screenshots (push) Successful in 2m49s
flatpak / build-publish (push) Failing after 8m19s
windows-host / package (push) Successful in 16m34s
windows-msix / package (arm64, C:\Users\Public\ffmpeg-arm64, --no-default-features, aarch64-pc-windows-msvc, C:\t-a64) (push) Successful in 6m54s
rpm / build-publish (43, bazzite, punktfunk-fedora-rpm) (push) Successful in 16m15s
rpm / build-publish (44, fedora-44, punktfunk-fedora44-rpm) (push) Successful in 16m37s
windows-msix / package (x64, C:\Users\Public\ffmpeg, , x86_64-pc-windows-msvc, C:\t) (push) Successful in 6m58s
arch / build-publish (push) Successful in 12m31s
Every Linux package declared its maintainer as `noreply@anthropic.com` — the git co-author trailer address, copied out of commit metadata into PACKAGE metadata, where it is user-visible: * deb: `Maintainer:` in the host/client/web/scripting control files, plus the generated debian/changelog trailer (`dpkg -s punktfunk`) * rpm: all three %changelog entries (`rpm -q --changelog`) * arch: the PKGBUILD Maintainer comment So installed packages named Anthropic as the maintainer of this project, and pointed anyone with a packaging problem at an address that discards mail. packages@unom.io is the project's real packaging identity — it's already the EdDSA key (AF245C506F4E4763, "punktfunk packages") that sign-rpms.sh signs every RPM with, and it's what packaging/rpm/README and the bootc Containerfile document. The RPMs were therefore SIGNED by packages@unom.io while DECLARING noreply@anthropic.com; those now agree. Checked the other publisher surfaces — the Inno installer (AppPublisher=unom), the flatpak metainfo (developer id io.unom) and the decky package.json were already correct. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
142 lines
6.2 KiB
Bash
142 lines
6.2 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] bash packaging/debian/build-client-deb.sh
|
|
# Output: dist/punktfunk-client_<version>_<arch>.deb
|
|
set -euo pipefail
|
|
|
|
VERSION="${VERSION:?set VERSION (e.g. 0.0.1 or 0.0.1~ci42.gdeadbee)}"
|
|
ARCH="${ARCH:-amd64}"
|
|
PKG="punktfunk-client"
|
|
CRATE="punktfunk-client-linux"
|
|
ROOTDIR="$(cd "$(dirname "$0")/../.." && pwd)"
|
|
cd "$ROOTDIR"
|
|
|
|
BIN="target/release/$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="target/release/punktfunk-session"
|
|
if [ ! -x "$BIN" ] || [ ! -x "$SESSION_BIN" ]; then
|
|
echo "==> building $CRATE + punktfunk-client-session (release)"
|
|
cargo build --release --locked -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).
|
|
RECOMMENDS="pipewire, wireplumber, pipewire-pulse"
|
|
|
|
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
|