Shelf/build.sh

72 lines
1.6 KiB
Bash
Executable File

#!/bin/bash
set -e
APP_NAME="Shelf"
BUILD_DIR="build"
APP_BUNDLE="$BUILD_DIR/$APP_NAME.app"
CONTENTS="$APP_BUNDLE/Contents"
ICON_SVG="resources/shelf.svg"
find_sdk() {
local tmp="/tmp/shelf_sdk_check_$$.swift"
printf 'let _=0\n' > "$tmp"
local default_sdk
default_sdk="$(xcrun --show-sdk-path 2>/dev/null)"
if swiftc -sdk "$default_sdk" -typecheck "$tmp" 2>/dev/null; then
rm -f "$tmp"
echo "$default_sdk"
return
fi
local sdk_dir
sdk_dir="$(dirname "$default_sdk")"
for sdk in $(ls -rd "$sdk_dir"/MacOSX[0-9]*.sdk 2>/dev/null); do
if swiftc -sdk "$sdk" -typecheck "$tmp" 2>/dev/null; then
rm -f "$tmp"
echo "$sdk"
return
fi
done
rm -f "$tmp"
echo "Error: no macOS SDK compatible with installed Swift compiler" >&2
exit 1
}
MACOS_SDK="$(find_sdk)"
rm -rf "$APP_BUNDLE"
mkdir -p "$CONTENTS/MacOS" "$CONTENTS/Resources"
# Build Rust core
(cd core && cargo build --release)
# Generate icon
core/target/release/shelf-icon "$ICON_SVG" "$CONTENTS/Resources/AppIcon.icns" --nearest-neighbor
# Build Swift
swiftc \
-target arm64-apple-macosx14.0 \
-sdk "$MACOS_SDK" \
-import-objc-header bridge/shelf_core.h \
-L core/target/release \
-lshelf_core \
-framework Cocoa \
-framework SwiftUI \
-framework Carbon \
-framework UniformTypeIdentifiers \
-framework ServiceManagement \
-framework Quartz \
-O \
-o "$CONTENTS/MacOS/$APP_NAME" \
src/*.swift
cp resources/Info.plist "$CONTENTS/"
codesign --force --sign "${MACOS_SIGNING_IDENTITY:--}" "$APP_BUNDLE"
echo "Built: $APP_BUNDLE"