#!/usr/bin/env bash set -euo pipefail trap 'status=$?; printf "macOS packaging failed at line %s: %s\n" "$LINENO" "$BASH_COMMAND" >&2; exit "$status"' ERR project_dir="$(CDPATH= cd -- "$(dirname -- "$0")/.." && pwd)" binary_path="${1:-$project_dir/target/release/flectar-mail}" output_dir="${2:-$project_dir/target/macos}" architecture="${3:-$(uname -m)}" case "$architecture" in arm64|aarch64) asset_architecture="arm64" pdfium_target="mac-arm64" ;; x64|x86_64|amd64) asset_architecture="x64" pdfium_target="mac-x64" ;; *) printf 'Unsupported macOS architecture: %s\n' "$architecture" >&2 exit 1 ;; esac app_dir="$output_dir/Flectar Mail.app" archive_path="$output_dir/flectar-mail-macos-$asset_architecture" if [[ ! -x "$binary_path" ]]; then printf 'Missing release binary: %s\n' "$binary_path" >&2 exit 1 fi rm -rf "$app_dir" mkdir -p \ "$app_dir/Contents/MacOS" \ "$app_dir/Contents/Frameworks" \ "$app_dir/Contents/Library/LaunchAgents" \ "$app_dir/Contents/Resources/Licenses/Flectar Mail" \ "$app_dir/Contents/Resources/Licenses/Google Sans Flex" \ "$app_dir/Contents/Resources/Licenses/Noto Emoji" \ "$app_dir/Contents/Resources/Licenses/PDFium" cp "$binary_path" "$app_dir/Contents/MacOS/flectar-mail" # Registered with Login Items through SMAppService for "Start automatically". cp "$project_dir/platform/macos/com.flectar.mail.login.plist" \ "$app_dir/Contents/Library/LaunchAgents/com.flectar.mail.login.plist" plutil -lint "$app_dir/Contents/Library/LaunchAgents/com.flectar.mail.login.plist" python3 "$project_dir/scripts/stage-pdfium.py" \ "$pdfium_target" "$app_dir/Contents/Frameworks" \ --licenses-destination "$app_dir/Contents/Resources/Licenses/PDFium" chmod 0755 "$app_dir/Contents/Frameworks/libpdfium.dylib" icon_source="$project_dir/resources/app-icon/flectar-mail-masked.png" iconset_dir="$output_dir/FlectarMail.iconset" rm -rf "$iconset_dir" mkdir -p "$iconset_dir" sips -z 16 16 "$icon_source" --out "$iconset_dir/icon_16x16.png" >/dev/null sips -z 32 32 "$icon_source" --out "$iconset_dir/icon_16x16@2x.png" >/dev/null sips -z 32 32 "$icon_source" --out "$iconset_dir/icon_32x32.png" >/dev/null sips -z 64 64 "$icon_source" --out "$iconset_dir/icon_32x32@2x.png" >/dev/null sips -z 128 128 "$icon_source" --out "$iconset_dir/icon_128x128.png" >/dev/null sips -z 256 256 "$icon_source" --out "$iconset_dir/icon_128x128@2x.png" >/dev/null sips -z 256 256 "$icon_source" --out "$iconset_dir/icon_256x256.png" >/dev/null sips -z 512 512 "$icon_source" --out "$iconset_dir/icon_256x256@2x.png" >/dev/null sips -z 512 512 "$icon_source" --out "$iconset_dir/icon_512x512.png" >/dev/null cp "$icon_source" "$iconset_dir/icon_512x512@2x.png" iconutil -c icns "$iconset_dir" -o "$app_dir/Contents/Resources/FlectarMail.icns" rm -rf "$iconset_dir" cp "$project_dir/LICENSE" "$app_dir/Contents/Resources/Licenses/Flectar Mail/LICENSE" cp -R "$project_dir/LICENSES" "$app_dir/Contents/Resources/Licenses/Flectar Mail/LICENSES" cp "$project_dir/THIRD_PARTY_NOTICES.md" \ "$app_dir/Contents/Resources/Licenses/Flectar Mail/THIRD_PARTY_NOTICES.md" cp "$project_dir/resources/fonts/google-sans-flex/OFL.txt" \ "$app_dir/Contents/Resources/Licenses/Google Sans Flex/OFL.txt" cp "$project_dir/resources/fonts/google-sans-flex/README.md" \ "$app_dir/Contents/Resources/Licenses/Google Sans Flex/README.md" cp "$project_dir/resources/fonts/noto-emoji/OFL.txt" \ "$app_dir/Contents/Resources/Licenses/Noto Emoji/OFL.txt" cp "$project_dir/resources/fonts/noto-emoji/README.md" \ "$app_dir/Contents/Resources/Licenses/Noto Emoji/README.md" version="$(sed -n 's/^version = "\([^"]*\)"/\1/p' "$project_dir/Cargo.toml" | head -1)" native_version="${version%%-*}" sed \ -e "s/@VERSION@/$native_version/g" \ "$project_dir/platform/macos/Info.plist.in" > "$app_dir/Contents/Info.plist" # Sign nested code before the containing app. Distribution signing and # notarization replace these ad-hoc identities when Apple credentials exist. codesign --force --sign - "$app_dir/Contents/Frameworks/libpdfium.dylib" codesign --force --sign - "$app_dir" python3 "$project_dir/scripts/test-pdf-preview.py" "$app_dir/Contents/MacOS/flectar-mail" mkdir -p "$output_dir" ditto -c -k --sequesterRsrc --keepParent "$app_dir" "$archive_path.zip" printf 'Built %s\n' "$archive_path.zip" # Use a separate source folder so the disk image contains only the app and the # usual Applications shortcut, not the ZIP or a previous disk image. staging="$output_dir/dmg-staging" rm -rf "$staging" mkdir -p "$staging" ditto "$app_dir" "$staging/Flectar Mail.app" ln -s /Applications "$staging/Applications" hdiutil create -volname "Flectar Mail" -srcfolder "$staging" -ov -format UDZO \ "$archive_path.dmg" hdiutil verify "$archive_path.dmg" codesign --verify --deep --strict "$app_dir" rm -rf "$staging" printf 'Built %s\n' "$archive_path.dmg"