#!/usr/bin/env bash # # Construit un paquet Flatpak de Pena à partir du .deb généré par Tauri. # # Étapes : # 1. `cargo tauri build --bundles deb` -> produit le .deb autonome # 2. Copie du .deb à côté du manifeste sous le nom `pena.deb` # 3. `flatpak-builder` construit le bundle dans la sandbox GNOME # 4. Installation locale (--user) ET export du fichier pena.flatpak # # Le fichier `pena.flatpak` est TOUJOURS exporté à côté du script. # # Usage : # ./build-flatpak.sh # build + installation (--user) + pena.flatpak # ./build-flatpak.sh --no-install # build + pena.flatpak seul (pas d'installation) # ./build-flatpak.sh --no-deb # réutilise le .deb déjà présent (build rapide) # set -euo pipefail APP_ID="com.pena.app" RUNTIME_VERSION="48" RUST_CONTAINER="ubuntu-rust" # distrobox contenant cargo-tauri + libs GTK/WebKit SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_DIR="$(dirname "$SCRIPT_DIR")" # .../Pena-tauri MANIFEST="$SCRIPT_DIR/${APP_ID}.yml" BUILD_DIR="$SCRIPT_DIR/.build" # arbre de build flatpak-builder REPO_DIR="$SCRIPT_DIR/.repo" # dépôt ostree temporaire DEB_TARGET="$SCRIPT_DIR/pena.deb" TAURI_CONF="$PROJECT_DIR/src-tauri/tauri.conf.json" METAINFO="$SCRIPT_DIR/${APP_ID}.metainfo.xml" DO_INSTALL=1 BUILD_DEB=1 for arg in "$@"; do case "$arg" in --no-install|--bundle) DO_INSTALL=0 ;; # --bundle : alias rétrocompatible --no-deb) BUILD_DEB=0 ;; -h|--help) sed -n '2,17p' "$0"; exit 0 ;; *) echo "Argument inconnu : $arg" >&2; exit 1 ;; esac done # --- Vérification des outils ------------------------------------------------- need() { command -v "$1" >/dev/null 2>&1 || { echo "Outil manquant : $1" >&2; exit 1; }; } need flatpak # flatpak-builder : commande native, sinon le Flatpak org.flatpak.Builder # (cas des distributions atomiques type Bazzite/Silverblue). if command -v flatpak-builder >/dev/null 2>&1; then FLATPAK_BUILDER=(flatpak-builder) elif flatpak info org.flatpak.Builder >/dev/null 2>&1; then FLATPAK_BUILDER=(flatpak run org.flatpak.Builder) else echo "flatpak-builder est requis. Installez-le :" >&2 echo " flatpak install -y flathub org.flatpak.Builder" >&2 echo " ou sur Fedora classique : sudo dnf install flatpak-builder" >&2 exit 1 fi # --- Remote flathub (scope --user) ------------------------------------------- # flatpak-builder est lancé en --user et installe les dépendances (runtime/SDK # via --install-deps-from=flathub) dans cette même installation. Le remote # flathub doit donc exister au niveau --user, ce qui n'est pas le cas par # défaut sur les distributions atomiques (où flathub est un remote système). echo ">> Vérification du remote flathub (--user)…" flatpak remote-add --if-not-exists --user flathub \ https://flathub.org/repo/flathub.flatpakrepo # --- 0. Version : source de vérité = tauri.conf.json ------------------------- # On lit la version applicative depuis tauri.conf.json et on la répercute dans # le metainfo AppStream (release) afin que le Flatpak porte toujours la # dernière version déclarée dans les sources. need jq VERSION="$(jq -r '.version' "$TAURI_CONF")" if [[ -z "$VERSION" || "$VERSION" == "null" ]]; then echo "Impossible de lire la version dans $TAURI_CONF" >&2 exit 1 fi TODAY="$(date -u +%Y-%m-%d)" echo ">> Version applicative : $VERSION (build du $TODAY)" # Met à jour (ou insère) l'entrée du metainfo pour cette version. if grep -q "version=\"$VERSION\"" "$METAINFO"; then echo ">> Release $VERSION déjà présente dans le metainfo." else echo ">> Ajout de la release $VERSION au metainfo…" sed -i \ "s##\n #" \ "$METAINFO" fi # --- 1. Build du .deb via Tauri --------------------------------------------- if [[ "$BUILD_DEB" -eq 1 ]]; then # La compilation Tauri exige les libs de dev GTK/WebKit, absentes de l'hôte # (distribution atomique). On build donc dans le distrobox `$RUST_CONTAINER`, # qui embarque cargo-tauri et ces libs. flatpak-builder reste sur l'hôte. need distrobox echo ">> Build du paquet .deb dans le distrobox $RUST_CONTAINER…" distrobox enter "$RUST_CONTAINER" -- \ bash -lc "cd '$PROJECT_DIR' && cargo tauri build --bundles deb" fi DEB_SRC="$(find "$PROJECT_DIR/src-tauri/target/release/bundle/deb" -name '*.deb' 2>/dev/null | sort | tail -n1 || true)" if [[ -z "$DEB_SRC" ]]; then echo "Aucun .deb trouvé. Lancez le script sans --no-deb." >&2 exit 1 fi echo ">> Utilisation du .deb : $DEB_SRC" cp -f "$DEB_SRC" "$DEB_TARGET" # Icône installée dans le Flatpak (128x128) depuis les sources du projet. cp -f "$PROJECT_DIR/src-tauri/icons/128x128.png" "$SCRIPT_DIR/icon.png" # --- 2. Build Flatpak -------------------------------------------------------- # Construit l'app dans un dépôt OSTree local ($REPO_DIR) ; les dépendances # manquantes (runtime/SDK) sont récupérées depuis flathub. echo ">> Construction du Flatpak…" rm -rf "$BUILD_DIR" FB_ARGS=(--force-clean --user --install-deps-from=flathub --repo="$REPO_DIR") if [[ "$DO_INSTALL" -eq 1 ]]; then FB_ARGS+=(--install) fi "${FLATPAK_BUILDER[@]}" "${FB_ARGS[@]}" "$BUILD_DIR" "$MANIFEST" # --- 3. Export du fichier .flatpak (toujours) -------------------------------- # Le bundle autonome est systématiquement exporté à côté du manifeste. OUT="$SCRIPT_DIR/pena.flatpak" echo ">> Export du bundle : $OUT" flatpak build-bundle "$REPO_DIR" "$OUT" "$APP_ID" \ --runtime-repo=https://flathub.org/repo/flathub.flatpakrepo echo ">> Nettoyage du dépôt OSTree temporaire…" rm -rf "$REPO_DIR" if [[ "$DO_INSTALL" -eq 1 ]]; then echo ">> Pena $VERSION installé (--user) et bundle exporté : $OUT" echo ">> Lancer avec : flatpak run $APP_ID" else echo ">> Bundle exporté : $OUT" echo ">> Installer avec : flatpak install --user $OUT" fi echo ">> Terminé."