#!/bin/bash set -euo pipefail APP_NAME="TagLauncher" PROJECT_DIR="$(cd "$(dirname "$0")" && pwd)" BUILD_DIR="$PROJECT_DIR/build" APP_BUNDLE="$BUILD_DIR/$APP_NAME.app" MACOS_DIR="$APP_BUNDLE/Contents/MacOS" RESOURCES_DIR="$APP_BUNDLE/Contents/Resources" SWIFT_DIR="$PROJECT_DIR/Apptag" SDK_PATH=$(xcrun --sdk macosx --show-sdk-path) TARGET="arm64-apple-macosx15.0" # --- Optional: App Store / Sandbox signing --- # Set CODESIGN_IDENTITY to your "Apple Distribution" or "Mac Developer" cert name. # Example: CODESIGN_IDENTITY="Apple Distribution: Your Name (TEAMID)" CODESIGN_IDENTITY="${CODESIGN_IDENTITY:-}" ENTITLEMENTS="$SWIFT_DIR/TagLauncher.entitlements" APP_STORE_MODE=false if [ -n "${APP_STORE:-}" ] && [ "$APP_STORE" = "1" ]; then APP_STORE_MODE=true if [ -z "$CODESIGN_IDENTITY" ]; then echo "⚠️ APP_STORE=1 but CODESIGN_IDENTITY not set. Will ad-hoc sign with entitlements." fi if [ ! -f "$ENTITLEMENTS" ]; then echo "❌ APP_STORE=1 requires entitlements at: $ENTITLEMENTS" exit 1 fi fi echo "==> Cleaning..." rm -rf "$BUILD_DIR" echo "==> Creating bundle structure..." mkdir -p "$MACOS_DIR" mkdir -p "$RESOURCES_DIR" echo "==> Compiling Swift files..." swiftc \ -o "$MACOS_DIR/$APP_NAME" \ -framework AppKit \ -framework SwiftUI \ -framework Carbon \ -sdk "$SDK_PATH" \ -target "$TARGET" \ -Osize \ "$SWIFT_DIR"/*.swift echo "==> Copying Info.plist..." cp "$SWIFT_DIR/Info.plist" "$APP_BUNDLE/Contents/Info.plist" echo "==> Copying AppIcon.icns..." if [ -f "$PROJECT_DIR/icon-icns.icns" ]; then cp "$PROJECT_DIR/icon-icns.icns" "$RESOURCES_DIR/AppIcon.icns" elif [ -f "$SWIFT_DIR/AppIcon.iconset/icon_512x512@2x.png" ]; then iconutil -c icns "$SWIFT_DIR/AppIcon.iconset" -o "$RESOURCES_DIR/AppIcon.icns" 2>/dev/null fi echo "==> Copying Localization files..." cp -r "$SWIFT_DIR/Localization" "$RESOURCES_DIR/Localization" echo "==> Embedding PkgInfo..." echo -n "APPL????" > "$APP_BUNDLE/Contents/PkgInfo" echo "==> Setting permissions..." chmod +x "$MACOS_DIR/$APP_NAME" echo "==> Stripping debug symbols..." strip -x "$MACOS_DIR/$APP_NAME" # --- Signing --- if [ "$APP_STORE_MODE" = true ] || [ -n "$CODESIGN_IDENTITY" ]; then echo "==> Signing with entitlements..." if [ -n "$CODESIGN_IDENTITY" ]; then CODESIGN_ARGS="--sign \"$CODESIGN_IDENTITY\"" else CODESIGN_ARGS="--sign -" fi if [ -f "$ENTITLEMENTS" ]; then eval codesign --force --deep $CODESIGN_ARGS --entitlements "$ENTITLEMENTS" "$APP_BUNDLE" echo " Signed with entitlements: $ENTITLEMENTS" else eval codesign --force --deep $CODESIGN_ARGS "$APP_BUNDLE" echo " Signed (no entitlements file found)" fi else # Default: ad-hoc sign without entitlements (local dev) echo "==> Ad-hoc signing..." codesign --force --deep --sign - "$APP_BUNDLE" fi echo "" echo "✅ App built at: $APP_BUNDLE" echo " Run: open $APP_BUNDLE" # --- App Store mode: remind about next steps --- if [ "$APP_STORE_MODE" = true ]; then echo "" echo "📦 App Store build ready. Next steps:" echo " 1. Verify sandbox: spctl -a -v \"$APP_BUNDLE\"" echo " 2. Test in sandbox: sandbox-exec -f <(echo '(version 1)(allow default)') open \"$APP_BUNDLE\"" echo " 3. Upload via Transporter or 'xcrun altool --upload-app'" fi