98 lines
2.8 KiB
Bash
Executable File
98 lines
2.8 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
|
|
set -euo pipefail
|
|
|
|
REPO_ROOT="$(cd "$(dirname "$0")/.." && pwd)"
|
|
cd "$REPO_ROOT"
|
|
source "$REPO_ROOT/scripts/version-common.sh"
|
|
|
|
if [[ "$(uname -s)" != "Darwin" ]]; then
|
|
echo "error: this script must run on macOS" >&2
|
|
exit 1
|
|
fi
|
|
|
|
SKIP_BUILD=0
|
|
for arg in "$@"; do
|
|
case "$arg" in
|
|
--no-build) SKIP_BUILD=1 ;;
|
|
-h|--help) sed -n '2,13p' "$0"; exit 0 ;;
|
|
*) echo "error: unknown arg: $arg" >&2; exit 2 ;;
|
|
esac
|
|
done
|
|
|
|
VERSION="$(smplayer_current_version macos)"
|
|
|
|
APP_DISPLAY_NAME="smPlayer"
|
|
VOL_NAME="$APP_DISPLAY_NAME"
|
|
DMG_NAME="${APP_DISPLAY_NAME}-${VERSION}-macos.dmg"
|
|
APP_SRC="build/macos/Build/Products/Release/sm_emby.app"
|
|
DIST_DIR="dist"
|
|
DMG_PATH="${DIST_DIR}/${DMG_NAME}"
|
|
|
|
if [[ "$SKIP_BUILD" -eq 0 ]]; then
|
|
BUILD_ARGS=(build macos --release)
|
|
if ! smplayer_has_flutter_option --build-name "${BUILD_ARGS[@]}"; then
|
|
BUILD_ARGS+=(--build-name "$VERSION")
|
|
fi
|
|
if ! smplayer_has_dart_define SMPLAYER_VERSION "${BUILD_ARGS[@]}"; then
|
|
BUILD_ARGS+=("--dart-define=SMPLAYER_VERSION=$VERSION")
|
|
fi
|
|
|
|
echo "==> flutter ${BUILD_ARGS[*]}"
|
|
flutter "${BUILD_ARGS[@]}"
|
|
fi
|
|
|
|
if [[ ! -d "$APP_SRC" ]]; then
|
|
echo "error: app bundle not found at $APP_SRC" >&2
|
|
echo " run without --no-build, or build first: flutter build macos --release" >&2
|
|
exit 1
|
|
fi
|
|
|
|
STAGE_DIR="$(mktemp -d -t smemby-dmg)"
|
|
cleanup() {
|
|
if [[ -n "${MOUNTED_DEV:-}" ]] && hdiutil info | grep -q "$MOUNTED_DEV"; then
|
|
hdiutil detach "$MOUNTED_DEV" -quiet || true
|
|
fi
|
|
rm -rf "$STAGE_DIR"
|
|
}
|
|
trap cleanup EXIT
|
|
|
|
echo "==> staging .app at $STAGE_DIR"
|
|
mkdir -p "$STAGE_DIR/dmg"
|
|
cp -R "$APP_SRC" "$STAGE_DIR/dmg/${APP_DISPLAY_NAME}.app"
|
|
ln -s /Applications "$STAGE_DIR/dmg/Applications"
|
|
|
|
mkdir -p "$DIST_DIR"
|
|
rm -f "$DMG_PATH"
|
|
|
|
echo "==> hdiutil create $DMG_PATH"
|
|
hdiutil create \
|
|
-volname "$VOL_NAME" \
|
|
-srcfolder "$STAGE_DIR/dmg" \
|
|
-ov -format UDZO \
|
|
"$DMG_PATH" >/dev/null
|
|
|
|
echo "==> verifying DMG mounts"
|
|
ATTACH_OUT="$(LANG=C LC_ALL=C hdiutil attach "$DMG_PATH" -nobrowse -readonly -noautoopen)"
|
|
MOUNTED_DEV="$(printf '%s\n' "$ATTACH_OUT" | awk '/^\/dev\//{print $1; exit}')"
|
|
MOUNT_POINT="$(printf '%s\n' "$ATTACH_OUT" | awk -F'\t' '/\/Volumes\//{print $NF; exit}')"
|
|
|
|
if [[ -z "$MOUNTED_DEV" || -z "$MOUNT_POINT" ]]; then
|
|
echo "error: failed to parse hdiutil attach output" >&2
|
|
echo "$ATTACH_OUT" >&2
|
|
exit 1
|
|
fi
|
|
|
|
if [[ ! -d "$MOUNT_POINT/${APP_DISPLAY_NAME}.app" ]] || [[ ! -L "$MOUNT_POINT/Applications" ]]; then
|
|
echo "error: DMG layout verification failed (missing app or Applications symlink)" >&2
|
|
hdiutil detach "$MOUNTED_DEV" -quiet || true
|
|
exit 1
|
|
fi
|
|
hdiutil detach "$MOUNTED_DEV" -quiet
|
|
MOUNTED_DEV=""
|
|
|
|
SIZE_HUMAN="$(du -h "$DMG_PATH" | awk '{print $1}')"
|
|
echo
|
|
echo "✓ DMG ready: $DMG_PATH ($SIZE_HUMAN)"
|
|
echo " Unsigned: first launch on another Mac requires right-click -> Open."
|