Add build script

This commit is contained in:
2026-05-01 16:45:29 +10:00
parent 9f6e607e78
commit 6576cc5e3c
2 changed files with 131 additions and 26 deletions

View File

@@ -5,33 +5,9 @@
<key>SchemeUserState</key> <key>SchemeUserState</key>
<dict> <dict>
<key>CommandNotch.xcscheme_^#shared#^_</key> <key>CommandNotch.xcscheme_^#shared#^_</key>
<dict> <dict/>
<key>orderHint</key>
<integer>0</integer>
</dict>
<key>CommandNotchTests.xcscheme_^#shared#^_</key>
<dict>
<key>orderHint</key>
<integer>2</integer>
</dict>
<key>CommandNotchUITests.xcscheme_^#shared#^_</key>
<dict>
<key>orderHint</key>
<integer>2</integer>
</dict>
<key>Release-CommandNotch.xcscheme_^#shared#^_</key> <key>Release-CommandNotch.xcscheme_^#shared#^_</key>
<dict> <dict/>
<key>orderHint</key>
<integer>1</integer>
</dict>
</dict>
<key>SuppressBuildableAutocreation</key>
<dict>
<key>1485207FA11756EC2DF4F08B</key>
<dict>
<key>primary</key>
<true/>
</dict>
</dict> </dict>
</dict> </dict>
</plist> </plist>

129
scripts/build-dmg.sh Executable file
View File

@@ -0,0 +1,129 @@
#!/usr/bin/env bash
set -euo pipefail
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
PROJECT_DIR="$ROOT_DIR/CommandNotch"
PROJECT_SPEC="$PROJECT_DIR/project.yml"
XCODEPROJ="$PROJECT_DIR/CommandNotch.xcodeproj"
SCHEME="Release-CommandNotch"
CONFIGURATION="Release"
APP_NAME="CommandNotch"
DERIVED_DATA_DIR="$ROOT_DIR/build/release"
DIST_DIR="$ROOT_DIR/dist"
STAGING_DIR="$DIST_DIR/dmg"
APP_BUNDLE="$DERIVED_DATA_DIR/Build/Products/$CONFIGURATION/$APP_NAME.app"
DMG_PATH="$DIST_DIR/$APP_NAME.dmg"
usage() {
cat <<EOF
Usage: $(basename "$0") [--skip-generate]
Builds $APP_NAME.app and packages it into a drag-to-Applications DMG.
Options:
--skip-generate Reuse the existing Xcode project without running xcodegen.
-h, --help Show this help text.
EOF
}
require_command() {
if ! command -v "$1" >/dev/null 2>&1; then
echo "error: required command not found: $1" >&2
exit 1
fi
}
configure_developer_dir() {
local current_dir
current_dir="$(xcode-select -p 2>/dev/null || true)"
if [[ "$current_dir" == "/Library/Developer/CommandLineTools" ]]; then
local xcode_dir="/Applications/Xcode.app/Contents/Developer"
if [[ -d "$xcode_dir" ]]; then
export DEVELOPER_DIR="$xcode_dir"
echo "Using Xcode developer directory: $DEVELOPER_DIR"
return
fi
echo "error: xcode-select is pointing at Command Line Tools, and /Applications/Xcode.app was not found." >&2
echo "Install Xcode or run: sudo xcode-select -s /Applications/Xcode.app/Contents/Developer" >&2
exit 1
fi
}
skip_generate=0
while (($# > 0)); do
case "$1" in
--skip-generate)
skip_generate=1
shift
;;
-h|--help)
usage
exit 0
;;
*)
echo "error: unknown argument: $1" >&2
usage >&2
exit 1
;;
esac
done
require_command xcodebuild
require_command hdiutil
if [[ $skip_generate -eq 0 ]]; then
require_command xcodegen
fi
configure_developer_dir
if [[ ! -f "$PROJECT_SPEC" ]]; then
echo "error: project spec not found at $PROJECT_SPEC" >&2
exit 1
fi
if [[ $skip_generate -eq 0 ]]; then
echo "Generating Xcode project..."
xcodegen generate --spec "$PROJECT_SPEC"
fi
if [[ ! -d "$XCODEPROJ" ]]; then
echo "error: Xcode project not found at $XCODEPROJ" >&2
exit 1
fi
echo "Building $APP_NAME.app..."
rm -rf "$DERIVED_DATA_DIR"
xcodebuild \
-project "$XCODEPROJ" \
-scheme "$SCHEME" \
-configuration "$CONFIGURATION" \
-derivedDataPath "$DERIVED_DATA_DIR" \
build
if [[ ! -d "$APP_BUNDLE" ]]; then
echo "error: built app bundle not found at $APP_BUNDLE" >&2
exit 1
fi
echo "Preparing DMG staging folder..."
rm -rf "$STAGING_DIR" "$DMG_PATH"
mkdir -p "$STAGING_DIR"
ditto "$APP_BUNDLE" "$STAGING_DIR/$APP_NAME.app"
ln -s /Applications "$STAGING_DIR/Applications"
echo "Creating DMG..."
hdiutil create \
-volname "$APP_NAME" \
-srcfolder "$STAGING_DIR" \
-ov \
-format UDZO \
"$DMG_PATH"
echo
echo "Done:"
echo " App: $APP_BUNDLE"
echo " DMG: $DMG_PATH"