#!/bin/bash # Construit Zonza.app — un LANCEUR léger (pas un bundle autonome). # # Pourquoi un lanceur plutôt que PyInstaller/py2app : empaqueter MLX + multiprocessing + # hotkey globale sans compte développeur Apple se bat en permanence contre macOS (bombe à # fork, permissions TCC réinitialisées à chaque rebuild, shaders Metal non bundlés). Le # lanceur exécute le code via le venv du dépôt, où TOUT fonctionne de façon stable. # # RÈGLE DE PROPRETÉ : ce script est l'UNIQUE chemin de build. Il construit DIRECTEMENT # dans /Applications — jamais dans /tmp ni dans le dépôt. C'est ce qui garantit qu'une # seule entrée existe dans LaunchServices (l'historique de builds éparpillés est ce qui # avait créé des icônes en double avec l'ancienne app Dictée). # # Limite : non distribuable seul (l'utilisateur doit cloner le dépôt + créer le venv). # # Usage : ./build_app.sh → installe directement /Applications/Zonza.app set -euo pipefail HERE="$(cd "$(dirname "$0")" && pwd)" APP="/Applications/Zonza.app" CONTENTS="$APP/Contents" PYBIN="$HERE/.venv/bin/python3" [ -x "$PYBIN" ] || { echo "Erreur : venv introuvable ($PYBIN). Lance : python3 -m venv .venv && .venv/bin/pip install -r requirements.txt"; exit 1; } # icône (générée si absente) [ -f "$HERE/assets/icon.icns" ] || { "$PYBIN" "$HERE/assets/make_icon.py" && "$HERE/assets/make_icns.sh"; } echo "→ construction du lanceur $APP …" rm -rf "$APP" mkdir -p "$CONTENTS/MacOS" "$CONTENTS/Resources" # exécutable : un script qui lance l'app via le python du venv (PWD = dépôt) cat > "$CONTENTS/MacOS/zonza" < "$CONTENTS/Info.plist" <<'PLIST' CFBundleNameZonza CFBundleDisplayNameZonza CFBundleIdentifiercloud.mrtechlab.zonza CFBundleVersion1.0 CFBundleShortVersionString1.0 CFBundlePackageTypeAPPL CFBundleExecutablezonza CFBundleIconFileicon LSUIElement NSMicrophoneUsageDescription Zonza a besoin du micro pour transcrire votre voix localement. PLIST # enregistrement propre dans LaunchServices (remplace toute entrée précédente du même chemin) LSREGISTER=/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/LaunchServices.framework/Versions/A/Support/lsregister "$LSREGISTER" -f "$APP" 2>/dev/null || true touch "$APP" echo "✓ $APP installé." echo " Lance Zonza depuis Spotlight, accorde Surveillance de l'entrée + Accessibilité une" echo " fois (à 'python3' ou 'Zonza' selon ce que macOS propose), c'est définitif."