mirror of
https://github.com/bryanthaboi/gen1recomp.git
synced 2026-08-28 18:06:09 +02:00
feat(linux): ship raw x86 AppImage, Flatpak bundle, and dual-env curl
Drop the pointless zip wrapper around the x86_64 AppImage, harden HostShell so bundled curl keeps APPDIR libs while host curl scrubs LD_LIBRARY_PATH / Steam LD_PRELOAD, and add a Flatpak channel with --device=all, bundled curl, and AppStream releases metadata. Portable mode now probes writability with a unique temp file and falls back soft on RO mounts / Flatpak.
This commit is contained in:
+32
-12
@@ -11,7 +11,7 @@
|
||||
#
|
||||
# Output: dist/mac/gen1recomp-macos.zip
|
||||
# dist/win/gen1recomp-win64.zip
|
||||
# dist/linux/gen1recomp-linux.zip (fused x86_64 AppImage)
|
||||
# dist/linux/gen1recomp-linux-x86_64.AppImage (fused x86_64 AppImage)
|
||||
# dist/android/debug/*.apk (full gradle output stays under
|
||||
# mobile/android/app/build/outputs/apk/embedNoRecord/)
|
||||
# dist/ios/<Config>-<sdk>/gen1recomp++.app (full xcodebuild output stays
|
||||
@@ -457,15 +457,31 @@ EOF
|
||||
# file-manager thumbnailers show for the file itself.
|
||||
[ -f "$ICON_SRC" ] || fail "missing icon source: $ICON_SRC"
|
||||
rm -f "$appdir/love.svg" "$appdir/love.png" "$appdir/.DirIcon"
|
||||
sips -z 512 512 "$ICON_SRC" --out "$appdir/$APP_NAME.png" >/dev/null
|
||||
if command -v sips >/dev/null 2>&1; then
|
||||
sips -z 512 512 "$ICON_SRC" --out "$appdir/$APP_NAME.png" >/dev/null
|
||||
elif command -v convert >/dev/null 2>&1; then
|
||||
convert "$ICON_SRC" -resize 512x512 "$appdir/$APP_NAME.png"
|
||||
else
|
||||
fail "need sips (macOS) or ImageMagick convert to resize $ICON_SRC"
|
||||
fi
|
||||
cp "$appdir/$APP_NAME.png" "$appdir/.DirIcon"
|
||||
|
||||
sed -i '' 's|^#FUSE_PATH="$APPDIR/my_game.love"$|FUSE_PATH="$APPDIR/game.love"|' "$appdir/AppRun"
|
||||
# sed -i '' is BSD; GNU sed wants sed -i (no empty backup suffix).
|
||||
if sed --version >/dev/null 2>&1; then
|
||||
sed -i 's|^#FUSE_PATH="$APPDIR/my_game.love"$|FUSE_PATH="$APPDIR/game.love"|' "$appdir/AppRun"
|
||||
else
|
||||
sed -i '' 's|^#FUSE_PATH="$APPDIR/my_game.love"$|FUSE_PATH="$APPDIR/game.love"|' "$appdir/AppRun"
|
||||
fi
|
||||
grep -q '^FUSE_PATH="\$APPDIR/game.love"$' "$appdir/AppRun" \
|
||||
|| fail "failed to enable FUSE_PATH in AppRun (upstream AppRun changed?)"
|
||||
|
||||
sed -i '' 's|^exec "\$APPDIR/bin/love"|if [ -n "$WAYLAND_DISPLAY" ] \&\& [ -z "$SDL_VIDEODRIVER" ]; then export SDL_VIDEODRIVER=x11; fi\
|
||||
exec "$APPDIR/bin/love"|' "$appdir/AppRun"
|
||||
local wayland_hook='if [ -n "$WAYLAND_DISPLAY" ] && [ -z "$SDL_VIDEODRIVER" ]; then export SDL_VIDEODRIVER=x11; fi\
|
||||
exec "$APPDIR/bin/love"'
|
||||
if sed --version >/dev/null 2>&1; then
|
||||
sed -i "s|^exec \"\$APPDIR/bin/love\"|$wayland_hook|" "$appdir/AppRun"
|
||||
else
|
||||
sed -i '' "s|^exec \"\$APPDIR/bin/love\"|$wayland_hook|" "$appdir/AppRun"
|
||||
fi
|
||||
|
||||
# Match the upstream image's compression (gzip, 128K blocks) so the
|
||||
# bundled runtime can read it.
|
||||
@@ -474,16 +490,20 @@ exec "$APPDIR/bin/love"|' "$appdir/AppRun"
|
||||
mksquashfs "$appdir" "$sfs_out" \
|
||||
-comp gzip -b 131072 -noappend -all-root -no-xattrs -quiet >/dev/null
|
||||
|
||||
local out_bin="$WORK/$APP_NAME-x86_64.AppImage"
|
||||
rm -f "$out_bin"
|
||||
mkdir -p "$DIST/linux"
|
||||
local out_bin="$DIST/linux/$APP_NAME-linux-x86_64.AppImage"
|
||||
rm -f "$out_bin" "$out_bin.sha256"
|
||||
head -c "$sfs_offset" "$love_appimage" > "$out_bin"
|
||||
cat "$sfs_out" >> "$out_bin"
|
||||
chmod +x "$out_bin"
|
||||
|
||||
local zip_out="$DIST/linux/$APP_NAME-linux.zip"
|
||||
rm -f "$zip_out"
|
||||
(cd "$WORK" && zip -q -9 -j "$zip_out" "$(basename "$out_bin")")
|
||||
say "Linux build: $zip_out"
|
||||
if command -v sha256sum >/dev/null 2>&1; then
|
||||
printf '%s %s\n' "$(sha256sum "$out_bin" | awk '{print $1}')" "$(basename "$out_bin")" \
|
||||
> "$out_bin.sha256"
|
||||
else
|
||||
printf '%s %s\n' "$(shasum -a 256 "$out_bin" | awk '{print $1}')" "$(basename "$out_bin")" \
|
||||
> "$out_bin.sha256"
|
||||
fi
|
||||
say "Linux build: $out_bin"
|
||||
}
|
||||
|
||||
# --------------------------------------------------------------- Android
|
||||
|
||||
Executable
+120
@@ -0,0 +1,120 @@
|
||||
#!/usr/bin/env bash
|
||||
# Build a single-file Flatpak bundle for x86_64 desktop Linux.
|
||||
#
|
||||
# Usage: scripts/build_flatpak.sh [--version X.Y.Z] [--game-love PATH]
|
||||
#
|
||||
# Output:
|
||||
# dist/flatpak/gen1recomp-<version>-linux.flatpak
|
||||
#
|
||||
# Requires: flatpak, flatpak-builder, and network on first run (Freedesktop
|
||||
# runtime + LÖVE AppImage download).
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
ROOT="$(cd "$(dirname "$0")/.." && pwd)"
|
||||
APP_ID="com.theboisclub.gen1recomp"
|
||||
VERSION="0.0.0"
|
||||
GAME_LOVE_IN=""
|
||||
DIST="$ROOT/dist/flatpak"
|
||||
BUILD_DIR="$ROOT/.bazinga/flatpak-build"
|
||||
REPO_DIR="$ROOT/.bazinga/flatpak-repo"
|
||||
STATE_DIR="$ROOT/.bazinga/flatpak-state"
|
||||
CACHE="$ROOT/.bazinga/flatpak-cache"
|
||||
|
||||
say() { printf '\033[1;32m==>\033[0m %s\n' "$*"; }
|
||||
warn() { printf '\033[1;33mwarn:\033[0m %s\n' "$*" >&2; }
|
||||
fail() { printf '\033[1;31merror:\033[0m %s\n' "$*" >&2; exit 1; }
|
||||
|
||||
while [ $# -gt 0 ]; do
|
||||
case "$1" in
|
||||
--version) VERSION="$2"; shift ;;
|
||||
--game-love) GAME_LOVE_IN="$2"; shift ;;
|
||||
-h|--help)
|
||||
sed -n '2,12p' "$0"
|
||||
exit 0
|
||||
;;
|
||||
*) fail "unknown argument: $1" ;;
|
||||
esac
|
||||
shift
|
||||
done
|
||||
|
||||
if ! printf '%s' "$VERSION" | grep -Eq '^[0-9]+\.[0-9]+\.[0-9]+$'; then
|
||||
fail "invalid --version '$VERSION' (expected X.Y.Z)"
|
||||
fi
|
||||
|
||||
command -v flatpak >/dev/null || fail "flatpak not found"
|
||||
command -v flatpak-builder >/dev/null || fail "flatpak-builder not found"
|
||||
|
||||
mkdir -p "$DIST" "$BUILD_DIR" "$REPO_DIR" "$STATE_DIR" "$CACHE"
|
||||
|
||||
LOVE_FILE="$CACHE/game.love"
|
||||
if [ -n "$GAME_LOVE_IN" ]; then
|
||||
[ -f "$GAME_LOVE_IN" ] || fail "game.love not found: $GAME_LOVE_IN"
|
||||
if [ "$(readlink -f "$GAME_LOVE_IN")" != "$(readlink -f "$LOVE_FILE")" ]; then
|
||||
cp "$GAME_LOVE_IN" "$LOVE_FILE"
|
||||
fi
|
||||
else
|
||||
say "packing game.love"
|
||||
"$ROOT/scripts/pack_love.sh" --output "$LOVE_FILE" --version "$VERSION"
|
||||
fi
|
||||
|
||||
# Stage local sources next to the generated manifest (flatpak path: is relative).
|
||||
cp "$ROOT/flatpak/$APP_ID.desktop" "$CACHE/$APP_ID.desktop"
|
||||
# AppStream rejects icons larger than the declared hicolor size.
|
||||
if command -v magick >/dev/null 2>&1; then
|
||||
magick "$ROOT/assets/logo/gen1recomp_cover.png" -resize 512x512 "$CACHE/icon.png"
|
||||
elif command -v convert >/dev/null 2>&1; then
|
||||
convert "$ROOT/assets/logo/gen1recomp_cover.png" -resize 512x512 "$CACHE/icon.png"
|
||||
else
|
||||
fail "need ImageMagick (magick/convert) to resize the Flatpak icon to 512x512"
|
||||
fi
|
||||
|
||||
|
||||
DATE="$(date -u +%Y-%m-%d)"
|
||||
python3 - "$ROOT/flatpak/$APP_ID.metainfo.xml" "$CACHE/$APP_ID.metainfo.xml" "$VERSION" "$DATE" <<'PY'
|
||||
import sys, pathlib, re
|
||||
src, dst, ver, date = sys.argv[1:5]
|
||||
text = pathlib.Path(src).read_text(encoding="utf-8")
|
||||
release = f' <release version="{ver}" date="{date}"/>'
|
||||
text = re.sub(
|
||||
r"<releases>.*?</releases>",
|
||||
"<releases>\n" + release + "\n </releases>",
|
||||
text,
|
||||
count=1,
|
||||
flags=re.S,
|
||||
)
|
||||
pathlib.Path(dst).write_text(text, encoding="utf-8")
|
||||
PY
|
||||
|
||||
cp "$ROOT/flatpak/$APP_ID.yml" "$CACHE/$APP_ID.yml"
|
||||
|
||||
say "installing Freedesktop runtime (no-op if present)"
|
||||
flatpak --user remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo || true
|
||||
flatpak --user install -y flathub \
|
||||
org.freedesktop.Platform//24.08 \
|
||||
org.freedesktop.Sdk//24.08 \
|
||||
|| warn "runtime install reported an error; flatpak-builder may still reuse cache"
|
||||
|
||||
say "building Flatpak ($APP_ID $VERSION)"
|
||||
# Run from CACHE so path: sources resolve.
|
||||
(
|
||||
cd "$CACHE"
|
||||
flatpak-builder --user --force-clean \
|
||||
--state-dir="$STATE_DIR" \
|
||||
--repo="$REPO_DIR" \
|
||||
"$BUILD_DIR" "$APP_ID.yml"
|
||||
)
|
||||
|
||||
OUT="$DIST/gen1recomp-${VERSION}-linux.flatpak"
|
||||
rm -f "$OUT"
|
||||
say "exporting bundle $OUT"
|
||||
flatpak build-bundle "$REPO_DIR" "$OUT" "$APP_ID" \
|
||||
--runtime-repo=https://flathub.org/repo/flathub.flatpakrepo
|
||||
chmod 644 "$OUT"
|
||||
if command -v sha256sum >/dev/null 2>&1; then
|
||||
printf '%s %s\n' "$(sha256sum "$OUT" | awk '{print $1}')" "$(basename "$OUT")" > "$OUT.sha256"
|
||||
else
|
||||
printf '%s %s\n' "$(shasum -a 256 "$OUT" | awk '{print $1}')" "$(basename "$OUT")" > "$OUT.sha256"
|
||||
fi
|
||||
say "Flatpak build: $OUT ($(du -h "$OUT" | cut -f1))"
|
||||
say "sha256: $(cut -d' ' -f1 "$OUT.sha256")"
|
||||
Reference in New Issue
Block a user