build: add receiver-only configuration and a Pi install script
The receiver does not need the sender's PipeWire/xdg-desktop-portal capture stack, which small ARM boards neither have nor want. Add a -Dsender=false meson option that skips the capture backend and the sender pipeline (SC_HAS_SENDER guards in main.cpp/pipelines.cpp); receiver-only builds refuse --send with a clear message while --receive and --discover work unchanged. scripts/install-receiver.sh targets such boards (e.g. Raspberry Pi Zero 2 W): installs build and runtime dependencies via apt, checks the compiler for C++20 <format> support before the long build (GCC 13+, i.e. Raspberry Pi OS Trixie), builds SDL3 from source when the distro does not package it, compiles a receiver-only binary, runs the test suite, installs to /usr/local/bin, and enables avahi-daemon. Also refresh the stale README (phases, dependencies, current roadmap, Pi receiver section). Validated in both configurations: meson test 5/5 each; the receiver-only build has no PipeWire/portal references, refuses --send cleanly, and --discover works headlessly.
This commit is contained in:
Executable
+120
@@ -0,0 +1,120 @@
|
||||
#!/usr/bin/env bash
|
||||
#
|
||||
# install-receiver.sh — build and install the screencast RECEIVER on a
|
||||
# small ARM board (e.g. a Raspberry Pi Zero 2 W).
|
||||
#
|
||||
# Why a separate script: the sender pulls in PipeWire and the
|
||||
# xdg-desktop-portal capture stack, which a headless receiver board neither
|
||||
# has nor needs. This script configures the build with -Dsender=false so
|
||||
# only the receiver binary is compiled.
|
||||
#
|
||||
# Usage (from the repository root, on the target machine):
|
||||
#
|
||||
# sudo ./scripts/install-receiver.sh
|
||||
#
|
||||
# Environment overrides:
|
||||
# SC_RECEIVER_INSTALL_DIR install target (default /usr/local/bin)
|
||||
# SC_RECEIVER_SKIP_TESTS set to 1 to skip the test suite (faster install)
|
||||
#
|
||||
# Requirements:
|
||||
# - Debian/Raspberry Pi OS (apt) with GCC 13 or newer (the code uses
|
||||
# C++20 <format>; Raspberry Pi OS Trixie or newer ships a suitable GCC)
|
||||
# - a running avahi-daemon (installed and enabled by this script)
|
||||
# - a graphical session or KMS console for the receiver window
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
||||
BUILD_DIR="${REPO_ROOT}/build-receiver"
|
||||
INSTALL_DIR="${SC_RECEIVER_INSTALL_DIR:-/usr/local/bin}"
|
||||
SKIP_TESTS="${SC_RECEIVER_SKIP_TESTS:-0}"
|
||||
|
||||
log() { printf '\n=== %s\n' "$*"; }
|
||||
die() { printf 'install-receiver: error: %s\n' "$*" >&2; exit 1; }
|
||||
|
||||
[ "$(id -u)" = 0 ] || die "run with sudo (installs to ${INSTALL_DIR})"
|
||||
[ -f "${REPO_ROOT}/meson.build" ] || die "run from the screen_cast repository"
|
||||
command -v apt-get >/dev/null 2>&1 || die "this script supports apt-based systems only"
|
||||
|
||||
export DEBIAN_FRONTEND=noninteractive
|
||||
|
||||
# --- build and runtime dependencies -----------------------------------------
|
||||
log "installing build and runtime dependencies (this may take a while)"
|
||||
apt-get update -qq || apt-get update
|
||||
apt-get install -y --no-install-recommends \
|
||||
build-essential \
|
||||
meson \
|
||||
ninja-build \
|
||||
pkg-config \
|
||||
libavcodec-dev \
|
||||
libavutil-dev \
|
||||
libswscale-dev \
|
||||
nlohmann-json3-dev \
|
||||
libavahi-client-dev \
|
||||
avahi-daemon \
|
||||
ca-certificates
|
||||
|
||||
# The receiver renders with SDL3. Older releases do not package it; build a
|
||||
# minimal SDL3 from source in that case.
|
||||
if ! apt-get install -y --no-install-recommends libsdl3-dev; then
|
||||
log "libsdl3-dev is not packaged; building SDL3 from source (15-30 min on small boards)"
|
||||
apt-get install -y --no-install-recommends cmake git
|
||||
SDL_DIR="$(mktemp -d)"
|
||||
trap 'rm -rf "${SDL_DIR}"' EXIT
|
||||
git clone --depth 1 --branch release-3.2.x \
|
||||
https://github.com/libsdl-org/SDL.git "${SDL_DIR}/SDL"
|
||||
cmake -S "${SDL_DIR}/SDL" -B "${SDL_DIR}/build" \
|
||||
-DCMAKE_BUILD_TYPE=Release \
|
||||
-DSDL_TESTS=OFF \
|
||||
-DSDL_INSTALL_DOCS=OFF \
|
||||
-DSDL_EXAMPLES=OFF
|
||||
cmake --build "${SDL_DIR}/build" --parallel "$(nproc)"
|
||||
cmake --install "${SDL_DIR}/build"
|
||||
fi
|
||||
|
||||
# --- compiler sanity check ---------------------------------------------------
|
||||
log "checking the compiler for C++20 <format> support"
|
||||
if ! printf '#include <format>\nint main() { return 0; }\n' |
|
||||
g++ -std=c++20 -x c++ - -o /dev/null 2>/dev/null; then
|
||||
die "g++ lacks C++20 <format>; install GCC 13 or newer (Raspberry Pi OS \
|
||||
Trixie or newer ships one). Aborting before a long build."
|
||||
fi
|
||||
|
||||
# --- build the receiver ------------------------------------------------------
|
||||
log "configuring a receiver-only build in ${BUILD_DIR}"
|
||||
rm -rf "${BUILD_DIR}"
|
||||
meson setup "${BUILD_DIR}" "${REPO_ROOT}" -Dsender=false
|
||||
|
||||
log "compiling (this takes a few minutes on small boards)"
|
||||
meson compile -C "${BUILD_DIR}"
|
||||
|
||||
if [ "${SKIP_TESTS}" != "1" ]; then
|
||||
log "running the test suite"
|
||||
meson test -C "${BUILD_DIR}" --print-errorlogs
|
||||
fi
|
||||
|
||||
# --- install -----------------------------------------------------------------
|
||||
log "installing the receiver to ${INSTALL_DIR}"
|
||||
install -m 755 "${BUILD_DIR}/src/app/screencast" "${INSTALL_DIR}/screencast"
|
||||
|
||||
systemctl enable --now avahi-daemon 2>/dev/null || true
|
||||
|
||||
log "done."
|
||||
cat <<'EOF'
|
||||
|
||||
The receiver is installed. On this machine run:
|
||||
|
||||
screencast --receive
|
||||
|
||||
and on the sending machine:
|
||||
|
||||
screencast --send # discovers this receiver on the LAN
|
||||
|
||||
Notes for small boards (e.g. Pi Zero 2 W):
|
||||
- Decoding is software H.264; expect smooth playback for small streams
|
||||
and a lower frame rate at high resolutions.
|
||||
- Stop the receiver with Ctrl-C; never kill -9 (it would leave stale
|
||||
mDNS records that break discovery for ~75 minutes).
|
||||
- The receiver needs avahi-daemon (enabled) and a graphical session or
|
||||
KMS console to open its window.
|
||||
EOF
|
||||
Reference in New Issue
Block a user