#!/bin/bash # Tigre (codeclass) - Empacota o TigreAppUI em um bundle .app real. # Sobe um nivel: o script vive em admin/, o projeto e a pasta pai. # # Uso: # admin/make-app.command # build debug + bundle no ~/Applications # TIGRE_APP_CONFIG=release admin/... # build release (otimizado) # TIGRE_APP_DIR=/tmp/Tigre.app admin/... # bundle em outro local # # O que faz: # 1) compila o TigreAppUI (swift build) # 2) gera o icone do app (make_icon.py + sips + iconutil -> AppIcon.icns) # 3) monta ~/Applications/Tigre.app: # Tigre.app/ # └── Contents/ # ├── Info.plist # ├── MacOS/Tigre (binario compilado) # └── Resources/AppIcon.icns # 4) codesign ad-hoc (evita atrito com Gatekeeper/LaunchServices) # # NÃO instala nem desinstala nada no sistema: um .app e so uma pasta; cada # execucao SOBRESCREVE o bundle. "Desinstalar" = apagar a pasta. set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" PROJECT_DIR="$(dirname "$SCRIPT_DIR")" CLASSDIR="$PROJECT_DIR/codeclass" APP_NAME="Tigre" APP_DIR="${TIGRE_APP_DIR:-$HOME/Applications/$APP_NAME.app}" CONFIG="${TIGRE_APP_CONFIG:-debug}" CONTENTS="$APP_DIR/Contents" MACOS_DIR="$CONTENTS/MacOS" RES_DIR="$CONTENTS/Resources" echo "============================================================" echo " Tigre :: Empacotando $APP_NAME.app" echo " Config: $CONFIG" echo " Destino: $APP_DIR" echo "============================================================" echo # 1) Toolchain Swift (Xcode 26 / swift 6.3). Respeita PATH se ja configurado. SWIFT="$(command -v swift || true)" if [ -z "$SWIFT" ] && [ -x "/Volumes/Merongo/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift" ]; then export PATH="/Volumes/Merongo/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin:$PATH" SWIFT="swift" fi if [ -z "$SWIFT" ]; then echo "ERRO: swift nao encontrado no PATH nem no Xcode padrao." exit 1 fi # 2) Compilar o codeclass (ida incremental; release e mais lento) echo "[1/4] Compilando o codeclass ($CONFIG)..." cd "$CLASSDIR" STDOUT_LOG="/tmp/tigre-build.log" if "$SWIFT" build -c "$CONFIG" > "$STDOUT_LOG" 2>&1; then tail -3 "$STDOUT_LOG" | sed 's/^/ /' || true else echo " ERRO de compilacao. Ultimas linhas:" tail -20 "$STDOUT_LOG" | sed 's/^/ /' exit 1 fi BIN="$CLASSDIR/.build/$CONFIG/TigreAppUI" if [ ! -x "$BIN" ]; then echo "ERRO: binario nao encontrado apos build: $BIN" exit 1 fi echo " Build OK." echo # 3) Icone do app # Fonte: app-icon.png na RAIZ do projeto (prioridade), depois admin/app-icon.png # (compat), e fallback make_icon.py (gera o "T" laranja sintetico). echo "[2/4] Gerando icone (AppIcon.icns)..." CUSTOM_ICON="" for _cand in "$PROJECT_DIR/app-icon.png" "$SCRIPT_DIR/app-icon.png"; do if [ -f "$_cand" ]; then CUSTOM_ICON="$_cand" break fi done ICON_PNG="/tmp/tigre_icon_1024.png" if [ -n "$CUSTOM_ICON" ]; then echo " Usando icone customizado ($(echo "$CUSTOM_ICON" | sed "s|$PROJECT_DIR|.|"), $(sips -g pixelWidth "$CUSTOM_ICON" 2>/dev/null | awk '/pixelWidth/{print $2}')px)" # Resample p/ 1024 (o iconutil exige o slot 512@2x = 1024) e deriva os demais sips -z 1024 1024 "$CUSTOM_ICON" --out "$ICON_PNG" >/dev/null 2>&1 else echo " app-icon.png ausente — usando icone padrao (make_icon.py)" python3 "$SCRIPT_DIR/make_icon.py" "$ICON_PNG" fi ICONSET="/tmp/Tigre.iconset" rm -rf "$ICONSET" mkdir -p "$ICONSET" for sz in 16 32 128 256 512; do sips -z "$sz" "$sz" "$ICON_PNG" --out "$ICONSET/icon_${sz}x${sz}.png" >/dev/null 2>&1 dbl=$((sz * 2)) sips -z "$dbl" "$dbl" "$ICON_PNG" --out "$ICONSET/icon_${sz}x${sz}@2x.png" >/dev/null 2>&1 done iconutil -c icns "$ICONSET" -o "/tmp/TigreAppIcon.icns" rm -rf "$ICONSET" "$ICON_PNG" echo " Icone OK." # 4) Montar o bundle .app echo "[3/4] Montando o bundle..." rm -rf "$APP_DIR" mkdir -p "$MACOS_DIR" "$RES_DIR" cp "$BIN" "$MACOS_DIR/$APP_NAME" cp "/tmp/TigreAppIcon.icns" "$RES_DIR/AppIcon.icns" cat > "$CONTENTS/Info.plist" < CFBundleName Tigre CFBundleDisplayName Tigre CFBundleIdentifier com.genial.tigre CFBundleVersion 0.1.0 CFBundleShortVersionString 0.1.0 CFBundlePackageType APPL CFBundleExecutable ${APP_NAME} CFBundleIconFile AppIcon LSMinimumSystemVersion 14.0 LSUIElement NSHighResolutionCapable LSApplicationCategoryType public.app-category.productivity PLIST echo " Bundle montado." # 5) Assinatura ad-hoc (sem identity de Developer ID, suficiente p/ uso local) echo "[4/4] Assinatura ad-hoc..." codesign --force --deep -s - "$APP_DIR" 2>&1 | sed 's/^/ /' || true echo " Pronto: $APP_DIR" echo echo " Para lançar: open \"$APP_DIR\"" echo " Para remover: rm -rf \"$APP_DIR\"" echo