#!/bin/bash set -e echo "==================================" echo "RetroArr Build (macOS Intel x64)" echo "==================================" # 1. Build Frontend echo "[1/3] Building Frontend..." npm run build # 2. Publish Backend for macOS Intel echo "[2/3] Publishing Backend (OSX-X64)..." dotnet publish src/RetroArr.Host/RetroArr.Host.csproj \ -c Release \ -r osx-x64 \ --self-contained true \ -p:PublishSingleFile=true \ -p:PublishTrimmed=false \ -p:IncludeNativeLibrariesForSelfExtract=true \ -o build_artifacts/osx-x64 # 3. Create .app Bundle echo "[3/3] Packaging .app..." APP_NAME="build_artifacts/RetroArr" rm -rf "${APP_NAME}.app" mkdir -p "${APP_NAME}.app/Contents/MacOS" mkdir -p "${APP_NAME}.app/Contents/Resources" # Create Icon ICON_SRC="frontend/src/assets/app_logo.png" if [ -f "$ICON_SRC" ] && command -v iconutil >/dev/null; then echo "Generating .icns icon..." ICONSET_DIR="MyIcon.iconset" mkdir -p "$ICONSET_DIR" sips -z 16 16 "$ICON_SRC" --out "$ICONSET_DIR/icon_16x16.png" > /dev/null sips -z 32 32 "$ICON_SRC" --out "$ICONSET_DIR/icon_16x16@2x.png" > /dev/null sips -z 32 32 "$ICON_SRC" --out "$ICONSET_DIR/icon_32x32.png" > /dev/null sips -z 64 64 "$ICON_SRC" --out "$ICONSET_DIR/icon_32x32@2x.png" > /dev/null sips -z 128 128 "$ICON_SRC" --out "$ICONSET_DIR/icon_128x128.png" > /dev/null sips -z 256 256 "$ICON_SRC" --out "$ICONSET_DIR/icon_128x128@2x.png" > /dev/null sips -z 256 256 "$ICON_SRC" --out "$ICONSET_DIR/icon_256x256.png" > /dev/null sips -z 512 512 "$ICON_SRC" --out "$ICONSET_DIR/icon_256x256@2x.png" > /dev/null sips -z 512 512 "$ICON_SRC" --out "$ICONSET_DIR/icon_512x512.png" > /dev/null sips -z 1024 1024 "$ICON_SRC" --out "$ICONSET_DIR/icon_512x512@2x.png" > /dev/null iconutil -c icns "$ICONSET_DIR" -o "${APP_NAME}.app/Contents/Resources/AppIcon.icns" rm -rf "$ICONSET_DIR" fi # Copy Executable & Core Files # Since it's SingleFile, we only need the main executable and any native libs that didn't bundle cp -a build_artifacts/osx-x64/* "${APP_NAME}.app/Contents/MacOS/" chmod +x "${APP_NAME}.app/Contents/MacOS/RetroArr.Host" # Copy UI Assets - Photino needs them relative to the exe mkdir -p "${APP_NAME}.app/Contents/MacOS/_output/UI" cp -a _output/UI/* "${APP_NAME}.app/Contents/MacOS/_output/UI/" 2>/dev/null || true # Create Info.plist cat > "${APP_NAME}.app/Contents/Info.plist" < CFBundleName RetroArr CFBundleDisplayName RetroArr CFBundleIdentifier app.RetroArr.desktop CFBundleVersion 0.4.0 CFBundlePackageType APPL CFBundleSignature ???? CFBundleExecutable RetroArr.Host CFBundleIconFile AppIcon LSMinimumSystemVersion 10.15 NSHighResolutionCapable EOF # Remove quarantine and sign if command -v xattr >/dev/null; then echo "Removing quarantine attributes..." xattr -cr "${APP_NAME}.app" fi if command -v codesign >/dev/null; then echo "Ad-hoc signing the app..." # Sign all dylibs first, then the app find "${APP_NAME}.app/Contents/MacOS" -name "*.dylib" -exec codesign --force --sign - {} \; codesign --force --deep --sign - "${APP_NAME}.app" fi # Create DMG (if hdiutil is available) if command -v hdiutil >/dev/null; then echo "Creating .dmg for Intel..." rm -f "build_artifacts/RetroArr-Intel.dmg" # Create a temporary folder for the DMG structure DMG_STAGING="build_artifacts/dmg_staging" rm -rf "$DMG_STAGING" mkdir -p "$DMG_STAGING" # Copy the .app and create a symlink to Applications cp -Rp "${APP_NAME}.app" "$DMG_STAGING/" ln -s /Applications "$DMG_STAGING/Applications" hdiutil create -volname "RetroArr Intel" -srcfolder "$DMG_STAGING" -ov -format UDZO "build_artifacts/RetroArr-Intel.dmg" # Cleanup staging rm -rf "$DMG_STAGING" fi # Create a PKG (Real Installer Wizard) # Create a PKG (Real Installer Wizard) - DISABLED # if command -v pkgbuild >/dev/null; then # echo "Creating .pkg installer for Intel..." # rm -f "build_artifacts/RetroArr-Intel.pkg" # pkgbuild --component "${APP_NAME}.app" \ # --install-location /Applications \ # --identifier "app.RetroArr.desktop.pkg" \ # --version "0.1.2-beta" \ # "build_artifacts/RetroArr-Intel.pkg" # # if command -v productsign >/dev/null && [ -n "$INSTALLER_CERT_NAME" ]; then # echo "Note: PKG is created but not signed with a developer cert (requires Apple Developer ID)." # fi # fi echo "==================================" echo "Intel Build Complete!" echo "Artifact: build_artifacts/RetroArr-Intel.dmg" echo "=================================="