a5b99b2928
apple / swift (push) Successful in 55s
deb / build-publish (push) Successful in 2m26s
decky / build-publish (push) Successful in 10s
ci / web (push) Successful in 29s
ci / docs-site (push) Successful in 33s
android / android (push) Successful in 1m52s
ci / bench (push) Has been cancelled
docker / build-push (., web/Dockerfile, punktfunk-web) (push) Successful in 5s
docker / build-push (ci, ci/fedora-rpm.Dockerfile, punktfunk-fedora-rpm) (push) Successful in 35s
docker / build-push (--build-arg FEDORA_VERSION=44, ci, ci/fedora-rpm.Dockerfile, punktfunk-fedora44-rpm) (push) Successful in 3m4s
docker / build-push (docs-site, docs-site/Dockerfile, punktfunk-docs) (push) Successful in 4s
docker / build-push (ci, ci/rust-ci.Dockerfile, punktfunk-rust-ci) (push) Successful in 2m18s
flatpak / build-publish (push) Failing after 2m43s
rpm / build-publish (bazzite, punktfunk-fedora-rpm) (push) Successful in 8m15s
rpm / build-publish (fedora-44, punktfunk-fedora44-rpm) (push) Successful in 8m7s
docker / deploy-docs (push) Has been cancelled
ci / rust (push) Failing after 48s
The flatpak CI was failing at "Downloading sources" with "No space left
on device": flatpak-cargo-generator walks the whole workspace Cargo.lock
and emits a `type: git` source for the windows-rs crates (windows +
windows-reactor + ~12 sub-crates, pinned by punktfunk-client-windows),
and flatpak-builder then FULL-clones that multi-GB repo — for a bundle
that only ever compiles `-p punktfunk-client-linux` and never touches a
windows-* crate.
New packaging/flatpak/prune-windows-lock.py writes a copy of Cargo.lock
with the windows-rs git packages stripped (matches on the `source =`
line, so a crate that merely lists a windows dependency is kept;
dependency-free so it also runs on the Deck's stock python). Both the CI
and build-flatpak.sh feed that pruned lock to the generator. The
committed Cargo.lock is untouched — cargo --offline only needs vendored
sources for the crates it actually builds, and the windows-rs crates are
not in the Linux client's dependency closure.
Verified locally: 14 crates pruned (507 -> 493 packages), zero windows-rs
`source =` lines remain, output parses as TOML, all Linux-client deps
(gtk4/ffmpeg-sys-next/sdl3/pipewire) intact.
This unblocks the flatpak build carrying the VAAPI green-screen fix
(64b1679) for the Steam Deck.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
89 lines
4.3 KiB
Bash
Executable File
89 lines
4.3 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# Build the punktfunk Linux client as a single-file `.flatpak` bundle.
|
|
#
|
|
# Works on the Steam Deck (org.flatpak.Builder from Flathub, user-scope, NO root) and on any
|
|
# Linux box with flatpak + flatpak-builder. The CI does the same steps (.gitea/workflows/flatpak.yml).
|
|
#
|
|
# On the Deck (one-time):
|
|
# flatpak install --user -y flathub org.flatpak.Builder
|
|
# Then run this script from the repo root:
|
|
# bash packaging/flatpak/build-flatpak.sh
|
|
# Output: dist/punktfunk-client-<version>.flatpak (install with `flatpak install --user <file>`)
|
|
#
|
|
# Env knobs:
|
|
# VERSION=... version string for the bundle name (default: git describe / 0.0.1-dev)
|
|
# ONLINE=1 skip offline cargo-sources.json; build with --share=network (fast local
|
|
# iteration, non-reproducible). Default: offline (regenerates cargo-sources).
|
|
# BUILDER=... override the flatpak-builder invocation (default: auto-detect host
|
|
# flatpak-builder, else `flatpak run org.flatpak.Builder`).
|
|
set -euo pipefail
|
|
|
|
ROOTDIR="$(cd "$(dirname "$0")/../.." && pwd)"
|
|
cd "$ROOTDIR"
|
|
|
|
APP_ID="io.unom.Punktfunk"
|
|
MANIFEST="packaging/flatpak/io.unom.Punktfunk.yml"
|
|
VERSION="${VERSION:-$(git describe --tags --always --dirty 2>/dev/null || echo 0.0.1-dev)}"
|
|
VERSION="${VERSION#v}"
|
|
BUNDLE="dist/punktfunk-client-${VERSION}.flatpak"
|
|
|
|
# --- pick a flatpak-builder (host binary, or the org.flatpak.Builder flatpak on the Deck) ---
|
|
if [ -n "${BUILDER:-}" ]; then
|
|
FPB=($BUILDER)
|
|
elif command -v flatpak-builder >/dev/null 2>&1; then
|
|
FPB=(flatpak-builder)
|
|
elif flatpak info org.flatpak.Builder >/dev/null 2>&1; then
|
|
FPB=(flatpak run org.flatpak.Builder)
|
|
else
|
|
echo "error: need flatpak-builder. On the Deck: flatpak install --user -y flathub org.flatpak.Builder" >&2
|
|
exit 1
|
|
fi
|
|
|
|
# --- ensure Flathub is available for the runtime/SDK/extensions ---
|
|
flatpak remote-add --user --if-not-exists flathub \
|
|
https://dl.flathub.org/repo/flathub.flatpakrepo
|
|
|
|
# --- offline crate cache (skip with ONLINE=1) -------------------------------------------
|
|
EXTRA_ARGS=()
|
|
if [ "${ONLINE:-0}" = "1" ]; then
|
|
echo "==> ONLINE build (cargo fetches from crates.io; non-reproducible)"
|
|
EXTRA_ARGS+=(--build-args=--share=network)
|
|
# The manifest references cargo-sources.json; provide an empty list so it stays valid.
|
|
[ -f packaging/flatpak/cargo-sources.json ] || echo '[]' > packaging/flatpak/cargo-sources.json
|
|
elif [ -f packaging/flatpak/cargo-sources.json ] && [ "${FORCE_GEN:-0}" != "1" ]; then
|
|
# Reuse a cargo-sources.json that was generated elsewhere (e.g. on a dev box with network +
|
|
# python aiohttp/toml, then rsynced to a build host that lacks them — like the Deck). The
|
|
# offline crate cache is a pure function of Cargo.lock, so this is reproducible. FORCE_GEN=1
|
|
# to regenerate anyway.
|
|
echo "==> reusing existing packaging/flatpak/cargo-sources.json (FORCE_GEN=1 to regenerate)"
|
|
else
|
|
echo "==> generating offline cargo-sources.json from Cargo.lock"
|
|
GEN=/tmp/flatpak-cargo-generator.py
|
|
if [ ! -f "$GEN" ]; then
|
|
curl -fsSL -o "$GEN" \
|
|
https://raw.githubusercontent.com/flatpak/flatpak-builder-tools/master/cargo/flatpak-cargo-generator.py
|
|
fi
|
|
# Needs python3 + aiohttp + tomlkit. On a host that lacks them (e.g. the Deck), generate on the
|
|
# Mac / a dev box instead and rsync the result next to the manifest (reused by the branch above).
|
|
# Prune the microsoft/windows-rs git crates first (punktfunk-client-windows only) — otherwise
|
|
# flatpak-builder full-clones that multi-GB repo and fills the disk. See prune-windows-lock.py.
|
|
python3 packaging/flatpak/prune-windows-lock.py Cargo.lock /tmp/Cargo.flatpak.lock
|
|
python3 "$GEN" /tmp/Cargo.flatpak.lock -o packaging/flatpak/cargo-sources.json
|
|
fi
|
|
|
|
# --- build into a local ostree repo, then export a single-file bundle --------------------
|
|
echo "==> flatpak-builder ($APP_ID, version $VERSION)"
|
|
"${FPB[@]}" --user --force-clean --disable-rofiles-fuse \
|
|
--install-deps-from=flathub \
|
|
"${EXTRA_ARGS[@]}" \
|
|
--repo="$ROOTDIR/.flatpak-repo" \
|
|
"$ROOTDIR/.flatpak-build" "$MANIFEST"
|
|
|
|
mkdir -p dist
|
|
flatpak build-bundle "$ROOTDIR/.flatpak-repo" "$BUNDLE" "$APP_ID"
|
|
echo "built $BUNDLE"
|
|
ls -lh "$BUNDLE"
|
|
echo
|
|
echo "install: flatpak install --user -y $BUNDLE"
|
|
echo "run: flatpak run $APP_ID (or: flatpak run $APP_ID --connect host:port)"
|