From 2841881a016edd223d200a888a97966836f196f1 Mon Sep 17 00:00:00 2001 From: Gato Date: Tue, 23 Jun 2026 07:02:32 +0200 Subject: [PATCH] feat: script de packaging Flatpak Co-Authored-By: Claude Opus 4.8 (1M context) --- .gitignore | 7 +++ flatpak/build-flatpak.sh | 92 +++++++++++++++++++++++++++++++ flatpak/com.pena.app.metainfo.xml | 24 ++++++++ flatpak/com.pena.app.yml | 48 ++++++++++++++++ 4 files changed, 171 insertions(+) create mode 100755 flatpak/build-flatpak.sh create mode 100644 flatpak/com.pena.app.metainfo.xml create mode 100644 flatpak/com.pena.app.yml diff --git a/.gitignore b/.gitignore index d6fb660..194db12 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,9 @@ src-tauri/target/ src-tauri/gen/ + +# Artefacts de build Flatpak +flatpak/.build/ +flatpak/.repo/ +flatpak/.flatpak-builder/ +flatpak/pena.deb +flatpak/*.flatpak diff --git a/flatpak/build-flatpak.sh b/flatpak/build-flatpak.sh new file mode 100755 index 0000000..db6697a --- /dev/null +++ b/flatpak/build-flatpak.sh @@ -0,0 +1,92 @@ +#!/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/ou export en fichier .flatpak +# +# Usage : +# ./build-flatpak.sh # build + installation locale (--user) +# ./build-flatpak.sh --bundle # build + export d'un fichier Pena.flatpak +# ./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" + +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" + +DO_BUNDLE=0 +BUILD_DEB=1 +for arg in "$@"; do + case "$arg" in + --bundle) DO_BUNDLE=1 ;; + --no-deb) BUILD_DEB=0 ;; + -h|--help) sed -n '2,16p' "$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 +if ! command -v flatpak-builder >/dev/null 2>&1; then + echo "flatpak-builder est requis. Installez-le :" >&2 + echo " flatpak install -y flathub org.flatpak.Builder" >&2 + echo " (puis lancez ce script via : flatpak run org.flatpak.Builder ...)" >&2 + echo " ou sur Fedora : sudo dnf install flatpak-builder" >&2 + exit 1 +fi + +# --- Runtime / SDK GNOME ----------------------------------------------------- +echo ">> Vérification du runtime GNOME ${RUNTIME_VERSION}…" +if ! flatpak info "org.gnome.Platform//${RUNTIME_VERSION}" >/dev/null 2>&1; then + flatpak install -y --user flathub \ + "org.gnome.Platform//${RUNTIME_VERSION}" \ + "org.gnome.Sdk//${RUNTIME_VERSION}" +fi + +# --- 1. Build du .deb via Tauri --------------------------------------------- +if [[ "$BUILD_DEB" -eq 1 ]]; then + echo ">> Build du paquet .deb (cargo tauri build --bundles deb)…" + ( 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" + +# --- 2. Build Flatpak -------------------------------------------------------- +echo ">> Construction du Flatpak…" +rm -rf "$BUILD_DIR" +FB_ARGS=(--force-clean --user --repo="$REPO_DIR") +if [[ "$DO_BUNDLE" -eq 0 ]]; then + FB_ARGS+=(--install) +fi +flatpak-builder "${FB_ARGS[@]}" "$BUILD_DIR" "$MANIFEST" + +# --- 3. Export d'un fichier .flatpak (optionnel) ----------------------------- +if [[ "$DO_BUNDLE" -eq 1 ]]; then + OUT="$SCRIPT_DIR/Pena.flatpak" + echo ">> Export du bundle : $OUT" + flatpak build-bundle "$REPO_DIR" "$OUT" "$APP_ID" "$RUNTIME_VERSION" 2>/dev/null \ + || flatpak build-bundle "$REPO_DIR" "$OUT" "$APP_ID" + echo ">> Installer avec : flatpak install --user $OUT" +else + echo ">> Installé. Lancer avec : flatpak run $APP_ID" +fi + +echo ">> Terminé." diff --git a/flatpak/com.pena.app.metainfo.xml b/flatpak/com.pena.app.metainfo.xml new file mode 100644 index 0000000..a7a62f0 --- /dev/null +++ b/flatpak/com.pena.app.metainfo.xml @@ -0,0 +1,24 @@ + + + com.pena.app + CC0-1.0 + MIT + Pena + Lecteur de fichiers Markdown + +

+ Pena est une application de bureau pour lire des fichiers Markdown. + La conversion Markdown vers HTML est réalisée côté Rust (comrak), avec + coloration syntaxique des blocs de code et plusieurs thèmes de lecture. +

+
+ com.pena.app.desktop + + Utility + TextEditor + + + + + +
diff --git a/flatpak/com.pena.app.yml b/flatpak/com.pena.app.yml new file mode 100644 index 0000000..dbcda56 --- /dev/null +++ b/flatpak/com.pena.app.yml @@ -0,0 +1,48 @@ +id: com.pena.app +runtime: org.gnome.Platform +runtime-version: '48' +sdk: org.gnome.Sdk +command: pena + +finish-args: + # Affichage + - --socket=wayland + - --socket=fallback-x11 + - --device=dri + - --share=ipc + # Lecture des fichiers Markdown ouverts par l'utilisateur + - --filesystem=home + +modules: + - name: pena + buildsystem: simple + sources: + - type: file + path: pena.deb + - type: file + path: com.pena.app.metainfo.xml + build-commands: + - | + set -eux + # Extraction du .deb produit par `cargo tauri build` + ar -x pena.deb + tar -xf data.tar.gz + + # Binaire principal -> /app/bin/pena (correspond à `command:`) + bin="$(find usr/bin -maxdepth 1 -type f | head -n1)" + install -Dm755 "$bin" /app/bin/pena + + # Fichier .desktop : renommé en .desktop (exigence Flatpak) + desktop="$(find usr/share/applications -name '*.desktop' | head -n1)" + install -Dm644 "$desktop" /app/share/applications/com.pena.app.desktop + sed -i \ + -e 's/^Exec=.*/Exec=pena/' \ + -e 's/^Icon=.*/Icon=com.pena.app/' \ + /app/share/applications/com.pena.app.desktop + + # Icône : on prend la plus grande disponible + icon="$(find usr/share/icons -name '*.png' | sort | tail -n1)" + install -Dm644 "$icon" /app/share/icons/hicolor/128x128/apps/com.pena.app.png + + # Métadonnées AppStream + install -Dm644 com.pena.app.metainfo.xml /app/share/metainfo/com.pena.app.metainfo.xml