187 lines
5.3 KiB
Bash
Executable File
187 lines
5.3 KiB
Bash
Executable File
#!/bin/bash
|
||
set -euo pipefail
|
||
|
||
# Blitztext macOS App - Build & Run
|
||
# Voraussetzungen: Full Xcode with Command Line Tools, xcodegen
|
||
|
||
RUN_AFTER=false
|
||
INSTALL_APP=false
|
||
BUILD_CONFIGURATION="Release"
|
||
UNIVERSAL_ARCHS="arm64 x86_64"
|
||
|
||
for arg in "$@"; do
|
||
case "$arg" in
|
||
--debug)
|
||
BUILD_CONFIGURATION="Debug"
|
||
;;
|
||
--run)
|
||
RUN_AFTER=true
|
||
;;
|
||
--install)
|
||
INSTALL_APP=true
|
||
;;
|
||
--release)
|
||
BUILD_CONFIGURATION="Release"
|
||
;;
|
||
*)
|
||
echo "Unbekannte Option: $arg"
|
||
echo "Verwendung: ./build.sh [--install] [--run] [--release] [--debug]"
|
||
exit 1
|
||
;;
|
||
esac
|
||
done
|
||
|
||
verify_universal_app() {
|
||
local app_path="$1"
|
||
local app_name
|
||
local binary_path
|
||
local archs
|
||
|
||
app_name="$(basename "$app_path" .app)"
|
||
binary_path="$app_path/Contents/MacOS/$app_name"
|
||
|
||
if [ ! -f "$binary_path" ]; then
|
||
echo "❌ Konnte App-Binary nicht finden: $binary_path"
|
||
exit 1
|
||
fi
|
||
|
||
archs="$(lipo -archs "$binary_path" 2>/dev/null || true)"
|
||
|
||
if [[ -z "$archs" ]]; then
|
||
echo "❌ Konnte Architekturen nicht lesen: $binary_path"
|
||
file "$binary_path" 2>/dev/null || true
|
||
exit 1
|
||
fi
|
||
|
||
if [[ " $archs " != *" arm64 "* || " $archs " != *" x86_64 "* ]]; then
|
||
echo "❌ Build ist nicht universal. Erwartet: arm64 + x86_64"
|
||
echo " Gefunden: $archs"
|
||
file "$binary_path" 2>/dev/null || true
|
||
exit 1
|
||
fi
|
||
|
||
echo "✅ Universal Binary verifiziert: $archs"
|
||
}
|
||
|
||
ensure_xcodebuild_available() {
|
||
if xcodebuild -version >/dev/null 2>&1; then
|
||
return
|
||
fi
|
||
|
||
local default_xcode="/Applications/Xcode.app/Contents/Developer"
|
||
if [ -d "$default_xcode" ]; then
|
||
export DEVELOPER_DIR="$default_xcode"
|
||
if xcodebuild -version >/dev/null 2>&1; then
|
||
echo "⚠️ Aktiver Developer-Pfad nutzt kein vollständiges Xcode. Verwende: $DEVELOPER_DIR"
|
||
return
|
||
fi
|
||
fi
|
||
|
||
echo "❌ xcodebuild ist nicht verfügbar."
|
||
echo " Installiere Xcode und wähle es mit:"
|
||
echo " sudo xcode-select -s /Applications/Xcode.app/Contents/Developer"
|
||
exit 1
|
||
}
|
||
|
||
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
||
PROJECT_DIR="$SCRIPT_DIR/BlitztextMac"
|
||
PROJECT_FILE="$PROJECT_DIR/BlitztextMac.xcodeproj"
|
||
DERIVED_DATA_PATH="$SCRIPT_DIR/.derivedData-blitztextmac-build"
|
||
cd "$PROJECT_DIR"
|
||
|
||
ensure_xcodebuild_available
|
||
|
||
if command -v xcodegen &> /dev/null; then
|
||
echo "⚙️ Generiere Xcode-Projekt ..."
|
||
xcodegen generate 2>&1
|
||
elif [ -d "$PROJECT_FILE" ]; then
|
||
echo "⚠️ xcodegen nicht gefunden – nutze vorhandenes Xcode-Projekt."
|
||
else
|
||
echo "❌ xcodegen fehlt."
|
||
echo " Installiere xcodegen explizit mit:"
|
||
echo " brew install xcodegen"
|
||
echo " Oder stelle sicher, dass $PROJECT_FILE vorhanden ist."
|
||
exit 1
|
||
fi
|
||
|
||
# Bauen
|
||
echo "🔨 Baue Blitztext ..."
|
||
xcodebuild \
|
||
-project BlitztextMac.xcodeproj \
|
||
-scheme BlitztextMac \
|
||
-destination 'platform=macOS' \
|
||
-configuration "$BUILD_CONFIGURATION" \
|
||
-derivedDataPath "$DERIVED_DATA_PATH" \
|
||
ONLY_ACTIVE_ARCH=NO \
|
||
ARCHS="$UNIVERSAL_ARCHS" \
|
||
clean build
|
||
|
||
# App finden
|
||
APP_PATH="$DERIVED_DATA_PATH/Build/Products/$BUILD_CONFIGURATION/Blitztext.app"
|
||
|
||
if [ ! -d "$APP_PATH" ]; then
|
||
echo "❌ Build fehlgeschlagen – keine App gefunden."
|
||
exit 1
|
||
fi
|
||
|
||
verify_universal_app "$APP_PATH"
|
||
|
||
# Resources manuell ins Bundle kopieren (xcodegen kopiert sie nicht automatisch)
|
||
echo "📋 Kopiere Resources ..."
|
||
RESOURCES_DIR="$APP_PATH/Contents/Resources"
|
||
mkdir -p "$RESOURCES_DIR"
|
||
cp -f "$PROJECT_DIR/Resources/AppIcon.icns" "$RESOURCES_DIR/" 2>/dev/null || true
|
||
cp -f "$PROJECT_DIR/Resources/menubar_icon.png" "$RESOURCES_DIR/" 2>/dev/null || true
|
||
cp -f "$PROJECT_DIR/Resources/menubar_icon@2x.png" "$RESOURCES_DIR/" 2>/dev/null || true
|
||
|
||
# In Projektordner kopieren
|
||
DEST="$SCRIPT_DIR/Blitztext.app"
|
||
rm -rf "$DEST"
|
||
cp -R "$APP_PATH" "$DEST"
|
||
echo "🔏 Signiere lokale Development-App ad-hoc. Dieses Artefakt ist nicht notarisiert."
|
||
codesign --force --sign - "$DEST" 2>&1
|
||
verify_universal_app "$DEST"
|
||
|
||
RUN_TARGET="$DEST"
|
||
|
||
if [ "$INSTALL_APP" = true ]; then
|
||
APPS_DIR="/Applications"
|
||
INSTALL_DEST="$APPS_DIR/Blitztext.app"
|
||
if [ ! -w "$APPS_DIR" ]; then
|
||
echo "❌ /Applications ist nicht beschreibbar."
|
||
echo " Fuehre den Befehl mit passenden Rechten erneut aus oder ziehe die App manuell nach /Applications."
|
||
exit 1
|
||
fi
|
||
rm -rf "$INSTALL_DEST"
|
||
cp -R "$DEST" "$INSTALL_DEST"
|
||
echo "🔏 Signiere lokale Development-App ad-hoc. Dieses Artefakt ist nicht notarisiert."
|
||
codesign --force --sign - "$INSTALL_DEST" 2>&1
|
||
verify_universal_app "$INSTALL_DEST"
|
||
RUN_TARGET="$INSTALL_DEST"
|
||
fi
|
||
|
||
echo ""
|
||
echo "✅ Fertig! App liegt unter:"
|
||
echo " $DEST"
|
||
if [ "$INSTALL_APP" = true ]; then
|
||
echo " $RUN_TARGET"
|
||
fi
|
||
echo ""
|
||
echo "Build-Typ: $BUILD_CONFIGURATION"
|
||
echo "Architekturen: $UNIVERSAL_ARCHS"
|
||
echo "Kompatibel: Apple Silicon + Intel (macOS 14+)"
|
||
echo ""
|
||
echo "Naechste Schritte:"
|
||
echo "1. App starten"
|
||
echo "2. Mikrofon erlauben"
|
||
echo "3. Fuer direktes Einfuegen zusaetzlich Bedienungshilfen erlauben"
|
||
echo "4. In Blitztext deinen eigenen OpenAI API Key eintragen"
|
||
echo "5. Loslegen und bei Bedarf im Code weiterbauen"
|
||
echo ""
|
||
|
||
# Optional: direkt starten
|
||
if [ "$RUN_AFTER" = true ]; then
|
||
echo "🚀 Starte Blitztext ..."
|
||
open "$RUN_TARGET"
|
||
fi
|