#!/usr/bin/env bash # Build a "thin" PixelPass AppImage: the gui-enabled release binary plus only # its non-excludelisted shared libraries. The graphics stack (libGL, wayland, # xkbcommon, X11) is intentionally left to the host — those libs are on the # AppImage excludelist because they must match the host driver — and the # runtime tools PixelPass shells out to (gst-launch-1.0, pactl, mpv/vlc) are # expected on the host PATH, the same contract the Arch package documents. # # Usage: packaging/appimage/build-appimage.sh # Output: packaging/appimage/pixelpass-x86_64.AppImage set -euo pipefail here="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" repo="$(cd "$here/../.." && pwd)" tools="$here/.tools" appdir="$here/AppDir" mkdir -p "$tools" # linuxdeploy is itself an AppImage; run it without FUSE so this works on hosts # (and CI) that lack libfuse2. export APPIMAGE_EXTRACT_AND_RUN=1 # Embed the version from Cargo.toml into the AppImage filename metadata. VERSION="$(grep -m1 '^version' "$repo/Cargo.toml" | sed -E 's/.*"(.*)".*/\1/')" export VERSION echo ">> building release binary (--features gui)" ( cd "$repo" && cargo build --release --features gui ) # Honour CARGO_TARGET_DIR so an isolated build (e.g. inside an old-glibc # distrobox) doesn't have to clobber the host's target/. bin="${CARGO_TARGET_DIR:-$repo/target}/release/pixelpass" echo ">> fetching linuxdeploy" ld="$tools/linuxdeploy-x86_64.AppImage" if [ ! -x "$ld" ]; then curl -fL --retry 3 -o "$ld" \ "https://github.com/linuxdeploy/linuxdeploy/releases/download/continuous/linuxdeploy-x86_64.AppImage" chmod +x "$ld" fi echo ">> assembling AppDir" rm -rf "$appdir" mkdir -p "$appdir/usr/bin" install -m755 "$bin" "$appdir/usr/bin/pixelpass" echo ">> running linuxdeploy (bundles libs, builds the AppImage)" # -e: analyse this binary for libraries to bundle (only libpipewire et al. that # aren't excludelisted will be copied; glibc + graphics libs are skipped). # -d/-i: desktop entry + icon for desktop integration. # --custom-apprun: our launcher that opens --gui from a file manager. ( cd "$here" && OUTPUT="pixelpass-${VERSION}-x86_64.AppImage" "$ld" \ --appdir "$appdir" \ -e "$bin" \ -d "$repo/assets/pixelpass.desktop" \ -i "$repo/assets/pixelpass-256.png" \ --icon-filename pixelpass \ --custom-apprun "$here/AppRun" \ --output appimage ) echo ">> done: $here/pixelpass-${VERSION}-x86_64.AppImage"