#!/bin/bash # Baut den mediaremote-adapter aus dem mitgelieferten Quellcode. # # Wird als Build-Schritt des App-Targets aufgerufen. Repliziert das # CMakeLists.txt des Projekts mit clang — cmake ist keine Voraussetzung, die # man einem Mitentwickler zumuten will. # # Der Umweg über /usr/bin/perl ist kein Trick um seiner selbst willen: seit # macOS 15.4 prüft mediaremoted Entitlements, und Fremdprogramme bekommen keine # Now-Playing-Daten mehr. Perl ist ein berechtigtes Systemprogramm und lädt das # hier gebaute Framework. # # Quelle: https://github.com/ungive/mediaremote-adapter (BSD-3-Clause), # eingebettet unter Vendor/ — siehe ONYX-VERSION.txt für den Stand. set -euo pipefail export DEVELOPER_DIR=/Applications/Xcode.app/Contents/Developer SRC="${SRC:-$(cd "$(dirname "$0")/.." && pwd)/Vendor/mediaremote-adapter}" OUT="${OUT:?Zielverzeichnis fehlt}" NAME=MediaRemoteAdapter FW="$OUT/$NAME.framework" [[ -d "$SRC" ]] || { echo "Quellen fehlen unter $SRC" >&2; exit 1; } rm -rf "$OUT" mkdir -p "$FW/Versions/A/Headers" "$FW/Versions/A/Resources" SOURCES=( "$SRC"/src/adapter/{env,get,globals,keys,now_playing,repeat,seek,send,shuffle,speed,stream,test}.m "$SRC"/src/private/MediaRemote.m "$SRC"/src/utility/{Debounce,helpers}.m ) echo "→ Framework-Binary" xcrun clang -dynamiclib -fobjc-arc -fvisibility=default -O2 \ -arch arm64 -mmacosx-version-min=26.0 \ -I"$SRC/include" -I"$SRC/src" \ -framework Foundation -framework AppKit -framework UniformTypeIdentifiers \ -install_name "@rpath/$NAME.framework/Versions/A/$NAME" \ -o "$FW/Versions/A/$NAME" \ "${SOURCES[@]}" cp "$SRC/include/$NAME.h" "$FW/Versions/A/Headers/" cat > "$FW/Versions/A/Resources/Info.plist" < CFBundleExecutable$NAME CFBundleIdentifiercom.vandenbe.$NAME CFBundleName$NAME CFBundlePackageTypeFMWK CFBundleShortVersionString0.1 CFBundleVersion0.1.0 PLIST ln -sf A "$FW/Versions/Current" ln -sf "Versions/Current/$NAME" "$FW/$NAME" ln -sf Versions/Current/Headers "$FW/Headers" ln -sf Versions/Current/Resources "$FW/Resources" echo "→ Test-Client" xcrun clang -fobjc-arc -O2 -arch arm64 \ -I"$SRC/src/test" \ -framework Foundation -framework MediaPlayer \ -o "$OUT/${NAME}TestClient" \ "$SRC"/src/test/{main,NowPlayingTest}.m # Signieren. # # Ad-hoc genügt zum Entwickeln, aber nicht zum Notarisieren: Apple verlangt, # dass jede Mach-O-Datei im Bundle mit derselben Developer-ID signiert ist, # mit Hardened Runtime und sicherem Zeitstempel. Eine ad-hoc signierte # Bibliothek führt zur Ablehnung — und die merkt man erst nach dem Hochladen. if [ -n "${SIGN_IDENTITY:-}" ]; then echo "→ signieren mit $SIGN_IDENTITY" codesign --force --options runtime --timestamp \ --sign "$SIGN_IDENTITY" "$FW/Versions/A/$NAME" codesign --force --options runtime --timestamp \ --sign "$SIGN_IDENTITY" "$FW" codesign --force --options runtime --timestamp \ --sign "$SIGN_IDENTITY" "$OUT/${NAME}TestClient" else echo "→ ad-hoc signieren" codesign --force --deep --sign - "$FW" codesign --force --sign - "$OUT/${NAME}TestClient" fi cp "$SRC/bin/mediaremote-adapter.pl" "$OUT/" echo echo "Fertig: $OUT" ls -la "$OUT"