build: survive low-memory boards in the receiver install script
The Raspberry Pi Zero 2 W (512 MB RAM) ran out of memory compiling signaling.cpp — nlohmann/json peaks well above available RAM at -O3, and ninja runs 6 parallel jobs on a quad-core — so the OOM killer terminated the compiler with 'Killed signal terminated program cc1plus'. When less than 1.5 GB RAM is detected, the install script now adds 1 GB of temporary build-time swap (fallocate with a dd fallback, removed on exit; some filesystems such as btrfs refuse swapfiles outright, in which case it warns and continues) and compiles with a single job. The cleanup trap also covers the SDL3 source directory. The swap mechanics were live-tested with a small swapfile (swapon/ swapoff lifecycle); this dev machine's filesystem rejects swapfiles, which is what exposed the need for the warning fallback. The Pi's ext4 rootfs accepts them.
This commit is contained in:
@@ -34,6 +34,19 @@ ENABLE_SERVICE="${SC_RECEIVER_SERVICE:-1}"
|
|||||||
log() { printf '\n=== %s\n' "$*"; }
|
log() { printf '\n=== %s\n' "$*"; }
|
||||||
die() { printf 'install-receiver: error: %s\n' "$*" >&2; exit 1; }
|
die() { printf 'install-receiver: error: %s\n' "$*" >&2; exit 1; }
|
||||||
|
|
||||||
|
TEMP_SWAP=""
|
||||||
|
SDL_DIR=""
|
||||||
|
cleanup() {
|
||||||
|
if [ -n "${TEMP_SWAP}" ]; then
|
||||||
|
swapoff "${TEMP_SWAP}" 2>/dev/null || true
|
||||||
|
rm -f "${TEMP_SWAP}"
|
||||||
|
fi
|
||||||
|
if [ -n "${SDL_DIR}" ]; then
|
||||||
|
rm -rf "${SDL_DIR}"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
trap cleanup EXIT
|
||||||
|
|
||||||
[ "$(id -u)" = 0 ] || die "run with sudo (installs to ${INSTALL_DIR})"
|
[ "$(id -u)" = 0 ] || die "run with sudo (installs to ${INSTALL_DIR})"
|
||||||
[ -f "${REPO_ROOT}/meson.build" ] || die "run from the screen_cast repository"
|
[ -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"
|
command -v apt-get >/dev/null 2>&1 || die "this script supports apt-based systems only"
|
||||||
@@ -62,7 +75,6 @@ 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)"
|
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
|
apt-get install -y --no-install-recommends cmake git
|
||||||
SDL_DIR="$(mktemp -d)"
|
SDL_DIR="$(mktemp -d)"
|
||||||
trap 'rm -rf "${SDL_DIR}"' EXIT
|
|
||||||
git clone --depth 1 --branch release-3.2.x \
|
git clone --depth 1 --branch release-3.2.x \
|
||||||
https://github.com/libsdl-org/SDL.git "${SDL_DIR}/SDL"
|
https://github.com/libsdl-org/SDL.git "${SDL_DIR}/SDL"
|
||||||
cmake -S "${SDL_DIR}/SDL" -B "${SDL_DIR}/build" \
|
cmake -S "${SDL_DIR}/SDL" -B "${SDL_DIR}/build" \
|
||||||
@@ -82,13 +94,45 @@ if ! printf '#include <format>\nint main() { return 0; }\n' |
|
|||||||
Trixie or newer ships one). Aborting before a long build."
|
Trixie or newer ships one). Aborting before a long build."
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# --- memory-constrained boards ----------------------------------------------
|
||||||
|
# The signaling unit includes nlohmann/json.hpp, which can peak well above
|
||||||
|
# the RAM of small boards; the OOM killer then terminates the compiler
|
||||||
|
# ("Killed signal terminated program cc1plus"). Give such boards temporary
|
||||||
|
# swap and a single compile job.
|
||||||
|
BUILD_JOBS="$(nproc)"
|
||||||
|
MEM_TOTAL_KB="$(awk '/^MemTotal:/ {print $2}' /proc/meminfo)"
|
||||||
|
if [ "${MEM_TOTAL_KB}" -lt 1500000 ]; then
|
||||||
|
SWAP_TOTAL_KB="$(awk '/^SwapTotal:/ {print $2}' /proc/meminfo)"
|
||||||
|
if [ "${SWAP_TOTAL_KB}" -lt 1000000 ]; then
|
||||||
|
FREE_KB="$(df -k --output=avail / | awk 'NR==2 {print $1}')"
|
||||||
|
if [ "${FREE_KB}" -lt 1572864 ]; then
|
||||||
|
die "board has little RAM and not enough free disk for 1 GB of temporary build swap; build on a larger machine or add swap manually"
|
||||||
|
fi
|
||||||
|
log "low-memory board: adding 1 GB of temporary swap for the build (removed afterwards)"
|
||||||
|
TEMP_SWAP="/var/tmp/screencast-build.swap"
|
||||||
|
if ! (fallocate -l 1G "${TEMP_SWAP}" 2>/dev/null ||
|
||||||
|
dd if=/dev/zero of="${TEMP_SWAP}" bs=1M count=1024 status=none); then
|
||||||
|
die "failed to write the swapfile"
|
||||||
|
fi
|
||||||
|
chmod 600 "${TEMP_SWAP}"
|
||||||
|
if ! mkswap "${TEMP_SWAP}" >/dev/null 2>&1 || ! swapon "${TEMP_SWAP}" 2>/dev/null; then
|
||||||
|
# Some filesystems (e.g. btrfs) refuse swapfiles outright.
|
||||||
|
rm -f "${TEMP_SWAP}"
|
||||||
|
TEMP_SWAP=""
|
||||||
|
log "WARNING: could not activate a swapfile on this filesystem; continuing with a single compile job — the build may still run out of memory"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
BUILD_JOBS=1
|
||||||
|
log "low-memory board: compiling with a single job"
|
||||||
|
fi
|
||||||
|
|
||||||
# --- build the receiver ------------------------------------------------------
|
# --- build the receiver ------------------------------------------------------
|
||||||
log "configuring a receiver-only build in ${BUILD_DIR}"
|
log "configuring a receiver-only build in ${BUILD_DIR}"
|
||||||
rm -rf "${BUILD_DIR}"
|
rm -rf "${BUILD_DIR}"
|
||||||
meson setup "${BUILD_DIR}" "${REPO_ROOT}" -Dsender=false
|
meson setup "${BUILD_DIR}" "${REPO_ROOT}" -Dsender=false
|
||||||
|
|
||||||
log "compiling (this takes a few minutes on small boards)"
|
log "compiling (this takes a while on small boards)"
|
||||||
meson compile -C "${BUILD_DIR}"
|
meson compile -C "${BUILD_DIR}" --jobs "${BUILD_JOBS}"
|
||||||
|
|
||||||
if [ "${SKIP_TESTS}" != "1" ]; then
|
if [ "${SKIP_TESTS}" != "1" ]; then
|
||||||
log "running the test suite"
|
log "running the test suite"
|
||||||
|
|||||||
Reference in New Issue
Block a user