#!/usr/bin/env bash # Builds KestroveCoreFFI.xcframework + Swift bindings into ../kestrove-apple/Packages/KestroveCore, and the # universal kestrove-nmh the macOS app embeds to serve the browser extension (Packages/KestroveCore/bin). set -euo pipefail cd "$(dirname "$0")/.." OUT=../kestrove-apple/Packages/KestroveCore LIB=libkv_ffi.a rustup target add aarch64-apple-ios aarch64-apple-ios-sim aarch64-apple-darwin x86_64-apple-darwin # browser-bridge on every slice: the Swift bindings are generated once, so every slice must export the same API. for t in aarch64-apple-ios aarch64-apple-ios-sim aarch64-apple-darwin x86_64-apple-darwin; do cargo build -p kv-ffi --release --target "$t" --features browser-bridge done export MACOSX_DEPLOYMENT_TARGET=14.0 # The helper's bundle id (embedded Info.plist, see crates/kv-nmh/build.rs): the app's own + ".nmh". BUNDLE_PREFIX=$(sed -n 's/^ *BUNDLE_PREFIX: *\([A-Za-z0-9.-]*\).*/\1/p' ../kestrove-apple/project.yml | head -1) export KV_NMH_BUNDLE_ID="${BUNDLE_PREFIX:-app.kestrove}.nmh" # With debug info and unstripped, so a dSYM can be made (App Store Connect wants one per executable). for t in aarch64-apple-darwin x86_64-apple-darwin; do CARGO_PROFILE_RELEASE_DEBUG=true CARGO_PROFILE_RELEASE_STRIP=false cargo build -p kv-nmh --release --target "$t" done cargo build -p kv-ffi --features browser-bridge # host dylib for library-mode bindgen mkdir -p out/swift cargo run -p kv-ffi --bin uniffi-bindgen -- generate --library target/debug/libkv_ffi.dylib --language swift --out-dir out/swift mkdir -p out/headers cp out/swift/kv_ffiFFI.h out/headers/ cp out/swift/kv_ffiFFI.modulemap out/headers/module.modulemap mkdir -p out/macos lipo -create target/aarch64-apple-darwin/release/$LIB target/x86_64-apple-darwin/release/$LIB -output out/macos/$LIB rm -rf "$OUT/KestroveCoreFFI.xcframework" xcodebuild -create-xcframework \ -library target/aarch64-apple-ios/release/$LIB -headers out/headers \ -library target/aarch64-apple-ios-sim/release/$LIB -headers out/headers \ -library out/macos/$LIB -headers out/headers \ -output "$OUT/KestroveCoreFFI.xcframework" mkdir -p "$OUT/Sources/KestroveCore" cp out/swift/kv_ffi.swift "$OUT/Sources/KestroveCore/Generated.swift" mkdir -p "$OUT/bin" lipo -create target/aarch64-apple-darwin/release/kestrove-nmh target/x86_64-apple-darwin/release/kestrove-nmh \ -output "$OUT/bin/kestrove-nmh" # Symbols go to the dSYM (same UUIDs), then the shipped binary is stripped. Mac/embed-nmh.sh puts the dSYM # into the archive. rm -rf "$OUT/bin/kestrove-nmh.dSYM" dsymutil "$OUT/bin/kestrove-nmh" -o "$OUT/bin/kestrove-nmh.dSYM" strip -x "$OUT/bin/kestrove-nmh" echo "✅ XCFramework + bindings written to $OUT"