#!/bin/bash set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_DIR="$(dirname "$SCRIPT_DIR")" cd "$PROJECT_DIR" echo "==> Building release binary..." cargo build --release -p outlay-gtk echo "==> Creating AppDir structure..." rm -rf AppDir mkdir -p AppDir/usr/bin mkdir -p AppDir/usr/share/applications mkdir -p AppDir/usr/share/icons/hicolor/scalable/apps mkdir -p AppDir/usr/share/glib-2.0/schemas mkdir -p AppDir/usr/share/fonts/truetype/liberation # Copy binary cp target/release/outlay-gtk AppDir/usr/bin/ # Copy desktop file cp outlay-gtk/data/io.github.outlay.desktop AppDir/ cp outlay-gtk/data/io.github.outlay.desktop AppDir/usr/share/applications/ # Copy app icon cp outlay-gtk/data/icons/hicolor/scalable/apps/io.github.outlay.svg AppDir/usr/share/icons/hicolor/scalable/apps/ # Copy Tabler action icons mkdir -p AppDir/usr/share/icons/hicolor/scalable/actions cp outlay-gtk/data/icons/hicolor/scalable/actions/outlay-*.svg AppDir/usr/share/icons/hicolor/scalable/actions/ cp outlay-gtk/data/icons/hicolor/scalable/actions/tabler-*.svg AppDir/usr/share/icons/hicolor/scalable/actions/ # Copy GSettings schema cp outlay-gtk/data/io.github.outlay.gschema.xml AppDir/usr/share/glib-2.0/schemas/ glib-compile-schemas AppDir/usr/share/glib-2.0/schemas/ # Bundle Liberation Sans fonts (needed for PDF report generation) FONT_DIR="/usr/share/fonts/truetype/liberation" if [ -d "$FONT_DIR" ]; then cp "$FONT_DIR"/LiberationSans-*.ttf AppDir/usr/share/fonts/truetype/liberation/ echo "==> Bundled Liberation Sans fonts" fi # Bundle JetBrains Mono fonts (needed for amount display) mkdir -p AppDir/usr/share/fonts cp outlay-gtk/data/fonts/*.ttf AppDir/usr/share/fonts/ echo "==> Bundled JetBrains Mono fonts" # Bundle tesseract OCR (needed for receipt amount detection) TESSERACT_BIN="$(command -v tesseract 2>/dev/null || true)" if [ -n "$TESSERACT_BIN" ]; then cp "$TESSERACT_BIN" AppDir/usr/bin/tesseract # Bundle tessdata (English trained data) mkdir -p AppDir/usr/bin/tessdata TESSDATA_DIR="" for candidate in /usr/share/tesseract-ocr/5/tessdata /usr/share/tesseract-ocr/4.00/tessdata /usr/share/tessdata /usr/local/share/tessdata; do if [ -f "$candidate/eng.traineddata" ]; then TESSDATA_DIR="$candidate" break fi done if [ -n "$TESSDATA_DIR" ]; then cp "$TESSDATA_DIR/eng.traineddata" AppDir/usr/bin/tessdata/ echo "==> Bundled tesseract + eng.traineddata" else echo "==> WARNING: tesseract found but eng.traineddata not found - OCR may not work" fi # Bundle tesseract's shared library dependencies for lib in $(ldd "$TESSERACT_BIN" 2>/dev/null | grep -oP '/\S+\.so\S*' | grep -v '^/lib'); do if [ -f "$lib" ]; then mkdir -p AppDir/usr/lib cp -n "$lib" AppDir/usr/lib/ 2>/dev/null || true fi done else echo "==> WARNING: tesseract not found - OCR will not be available in AppImage" echo " Install with: sudo apt install tesseract-ocr" fi # Download linuxdeploy if not present LINUXDEPLOY="linuxdeploy-x86_64.AppImage" if [ ! -f "$LINUXDEPLOY" ]; then echo "==> Downloading linuxdeploy..." wget -q "https://github.com/linuxdeploy/linuxdeploy/releases/download/continuous/$LINUXDEPLOY" chmod +x "$LINUXDEPLOY" fi # Download GTK plugin if not present GTK_PLUGIN="linuxdeploy-plugin-gtk.sh" if [ ! -f "$GTK_PLUGIN" ]; then echo "==> Downloading linuxdeploy GTK plugin..." wget -q "https://raw.githubusercontent.com/linuxdeploy/linuxdeploy-plugin-gtk/master/$GTK_PLUGIN" chmod +x "$GTK_PLUGIN" fi echo "==> Building AppImage..." export DEPLOY_GTK_VERSION=4 ./"$LINUXDEPLOY" \ --appdir AppDir \ --plugin gtk \ --output appimage \ --desktop-file AppDir/io.github.outlay.desktop \ --icon-file AppDir/usr/share/icons/hicolor/scalable/apps/io.github.outlay.svg echo "==> Done! AppImage created." ls -lh Outlay-*.AppImage 2>/dev/null || echo "Note: Output filename may vary."