Files
tessera-ctl/.gitea/scripts/appimage-strip-wayland.sh
T
schalli da9a65c7d0
Tessera CI/CD / Lint & Type Check (push) Successful in 50s
Tessera CI/CD / Tests (push) Successful in 1m38s
Tessera CI/CD / Desktop-Pakete bauen (push) Successful in 12m14s
Tessera CI/CD / Build & Publish Images (push) Successful in 3m26s
fix(261006-dcs): Linux-AppImage ohne mitgebrachte libwayland (weisses Fenster auf Arch)
linuxdeploy packt libwayland-* des Debian-Baus ein; auf Arch/EndeavourOS
bricht WebKitGTK damit mit EGL_BAD_PARAMETER ab. Neuer CI-Schritt
entfernt sie, packt mit der Original-runtime neu und signiert neu.
In archlinux- und debian:trixie-Containern unter Xvfb nachgewiesen.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-06 09:36:56 +02:00

71 lines
3.1 KiB
Bash
Executable File

#!/bin/sh
# appimage-strip-wayland.sh -- entfernt die mitgebrachten libwayland-*.so aus
# dem fertigen Linux-AppImage, packt es neu und signiert es fuer den Updater neu.
#
# Befund 06.10.2026 (EndeavourOS/Arch, weisses Fenster): linuxdeploy packt die
# libwayland-Bibliotheken des Bau-Systems (Debian) ein. Auf Systemen mit
# neuerem Mesa bricht WebKitGTK damit beim Start ab ("Could not create default
# EGL display: EGL_BAD_PARAMETER. Aborting...") -- das Fenster bleibt weiss.
# Nachgestellt in einem archlinux-Container unter Xvfb; ohne die vier
# libwayland-Dateien startet die App dort sauber. Die Bibliotheken gehoeren zum
# Grundsystem jeder Linux-Arbeitsumgebung (GTK haengt ohnehin davon ab), das
# Weglassen nimmt also nichts weg, was auf einem Zielsystem fehlen koennte.
#
# Tauri reicht linuxdeploy keine Ausschlussliste durch (linuxdeploy kennt
# --exclude-library, aber keine Umgebungsvariable dafuer), deshalb
# Nachbearbeitung: entpacken, loeschen, mit dem appimagetool aus Tauris
# eigenem linuxdeploy-plugin-appimage neu packen, `tauri signer sign` schreibt
# die .sig neu (die alte passt nach dem Neupacken nicht mehr).
#
# Aufruf aus dem Repo-Wurzelverzeichnis, nach `tauri build --bundles appimage`.
# Ohne TAURI_SIGNING_PRIVATE_KEY (lokaler Bau) wird nur neu gepackt, die
# veraltete .sig geloescht.
set -eu
APPIMAGE_DIR="apps/desktop/src-tauri/target/release/bundle/appimage"
TOOL_IMAGE="${TAURI_TOOLS_DIR:-${XDG_CACHE_HOME:-$HOME/.cache}/tauri}/linuxdeploy-plugin-appimage.AppImage"
APPIMAGE="$(find "$APPIMAGE_DIR" -maxdepth 1 -name '*.AppImage' | head -n 1)"
if [ -z "$APPIMAGE" ]; then
echo "Kein AppImage in $APPIMAGE_DIR gefunden." >&2
exit 1
fi
if [ ! -f "$TOOL_IMAGE" ]; then
echo "appimagetool-Quelle $TOOL_IMAGE fehlt (wird von tauri build angelegt)." >&2
exit 1
fi
WORK="$(mktemp -d)"
trap 'rm -rf "$WORK"' EXIT
APPIMAGE_ABS="$(cd "$(dirname "$APPIMAGE")" && pwd)/$(basename "$APPIMAGE")"
(cd "$WORK" && "$APPIMAGE_ABS" --appimage-extract >/dev/null && mv squashfs-root app)
(cd "$WORK" && "$TOOL_IMAGE" --appimage-extract >/dev/null && mv squashfs-root tool)
REMOVED="$(find "$WORK/app" -name 'libwayland-*.so*' -print)"
if [ -z "$REMOVED" ]; then
echo "Keine libwayland-Bibliotheken im AppImage -- nichts zu tun."
exit 0
fi
echo "Entferne aus dem AppImage:"
echo "$REMOVED" | sed "s#$WORK/app/# #"
echo "$REMOVED" | xargs rm -f
# Dieselbe Startdatei (runtime) wie im Original wiederverwenden: kein
# Nachladen aus dem Internet, keine andere runtime-Fassung als von Tauri.
OFFSET="$("$APPIMAGE_ABS" --appimage-offset)"
head -c "$OFFSET" "$APPIMAGE_ABS" > "$WORK/runtime"
ARCH=x86_64 "$WORK/tool/usr/bin/appimagetool" --no-appstream --runtime-file "$WORK/runtime" \
"$WORK/app" "$WORK/neu.AppImage" >/dev/null 2>&1
chmod +x "$WORK/neu.AppImage"
mv "$WORK/neu.AppImage" "$APPIMAGE_ABS"
rm -f "$APPIMAGE_ABS.sig"
if [ -n "${TAURI_SIGNING_PRIVATE_KEY:-}" ]; then
pnpm --filter @tessera/desktop exec tauri signer sign "$APPIMAGE_ABS" >/dev/null
test -s "$APPIMAGE_ABS.sig"
echo "AppImage neu gepackt und signiert: $(basename "$APPIMAGE_ABS")"
else
echo "AppImage neu gepackt (ohne Schluessel, keine Signatur): $(basename "$APPIMAGE_ABS")"
fi