1 #!/usr/bin/env bash
2 set -euo pipefail
3
4 ROOT_DIR=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")/../.." && pwd)
5 cd "$ROOT_DIR"
6
7 DIST_DIR="$ROOT_DIR/dist/swift"
8 PACKAGE_DIR="$DIST_DIR/Package"
9 HEADERS_DIR="$DIST_DIR/Headers"
10 FRAMEWORK_DIR="$DIST_DIR/OndeFramework.xcframework"
11 ZIP_PATH="$DIST_DIR/OndeFramework.xcframework.zip"
12 CHECKSUM_PATH="$DIST_DIR/OndeFramework.checksum.txt"
13 VERSION_PATH="$DIST_DIR/version.txt"
14 BINDGEN="$ROOT_DIR/uniffi-bindgen/target/release/uniffi-bindgen"
15
16 IOS_DEPLOYMENT_TARGET="${IOS_DEPLOYMENT_TARGET:-16.0}"
17 MACOS_DEPLOYMENT_TARGET="${MACOS_DEPLOYMENT_TARGET:-14.0}"
18 TVOS_DEPLOYMENT_TARGET="${TVOS_DEPLOYMENT_TARGET:-16.0}"
19 VISIONOS_DEPLOYMENT_TARGET="${VISIONOS_DEPLOYMENT_TARGET:-1.0}"
20 WATCHOS_DEPLOYMENT_TARGET="${WATCHOS_DEPLOYMENT_TARGET:-9.0}"
21
22 rm -rf "$FRAMEWORK_DIR" "$ZIP_PATH" "$CHECKSUM_PATH" "$VERSION_PATH"
23 mkdir -p "$DIST_DIR" "$PACKAGE_DIR/Sources/Onde" "$HEADERS_DIR"
24
25 cargo build --manifest-path uniffi-bindgen/Cargo.toml --release
26
27 # Build staticlibs only. Avoid the cdylib link step; the XCFramework consumes .a slices.
28 IPHONEOS_DEPLOYMENT_TARGET="$IOS_DEPLOYMENT_TARGET" cargo rustc --target aarch64-apple-ios --release --lib --crate-type staticlib
29 IPHONEOS_DEPLOYMENT_TARGET="$IOS_DEPLOYMENT_TARGET" cargo rustc --target aarch64-apple-ios-sim --release --lib --crate-type staticlib
30 MACOSX_DEPLOYMENT_TARGET="$MACOS_DEPLOYMENT_TARGET" cargo rustc --target aarch64-apple-darwin --release --lib --crate-type staticlib
31 TVOS_DEPLOYMENT_TARGET="$TVOS_DEPLOYMENT_TARGET" cargo +nightly rustc -Z build-std --target aarch64-apple-tvos --release --lib --crate-type staticlib
32 TVOS_DEPLOYMENT_TARGET="$TVOS_DEPLOYMENT_TARGET" cargo +nightly rustc -Z build-std --target aarch64-apple-tvos-sim --release --lib --crate-type staticlib
33 XROS_DEPLOYMENT_TARGET="$VISIONOS_DEPLOYMENT_TARGET" cargo +nightly rustc -Z build-std --target aarch64-apple-visionos --release --lib --crate-type staticlib
34 XROS_DEPLOYMENT_TARGET="$VISIONOS_DEPLOYMENT_TARGET" cargo +nightly rustc -Z build-std --target aarch64-apple-visionos-sim --release --lib --crate-type staticlib
35 WATCHOS_DEPLOYMENT_TARGET="$WATCHOS_DEPLOYMENT_TARGET" cargo +nightly rustc -Z build-std --target aarch64-apple-watchos --release --lib --crate-type staticlib
36 WATCHOS_DEPLOYMENT_TARGET="$WATCHOS_DEPLOYMENT_TARGET" cargo +nightly rustc -Z build-std --target aarch64-apple-watchos-sim --release --lib --crate-type staticlib
37
38 "$BINDGEN" generate "$ROOT_DIR/target/aarch64-apple-ios/release/libonde.a" --language swift --out-dir "$PACKAGE_DIR/Sources/Onde"
39
40 cp "$PACKAGE_DIR/Sources/Onde/ondeFFI.h" "$HEADERS_DIR/ondeFFI.h"
41 cp "$PACKAGE_DIR/Sources/Onde/ondeFFI.modulemap" "$HEADERS_DIR/module.modulemap"
42
43 cp "$ROOT_DIR/target/aarch64-apple-ios-sim/release/libonde.a" "$DIST_DIR/libonde-ios-sim.a"
44
45 cp "$ROOT_DIR/target/aarch64-apple-tvos-sim/release/libonde.a" "$DIST_DIR/libonde-tvos-sim.a"
46
47 cp "$ROOT_DIR/target/aarch64-apple-visionos-sim/release/libonde.a" "$DIST_DIR/libonde-visionos-sim.a"
48
49 cp "$ROOT_DIR/target/aarch64-apple-watchos-sim/release/libonde.a" "$DIST_DIR/libonde-watchos-sim.a"
50
51 cp "$ROOT_DIR/target/aarch64-apple-darwin/release/libonde.a" "$DIST_DIR/libonde-macos.a"
52
53 xcodebuild -create-xcframework \
54 -library "$ROOT_DIR/target/aarch64-apple-ios/release/libonde.a" -headers "$HEADERS_DIR" \
55 -library "$DIST_DIR/libonde-ios-sim.a" -headers "$HEADERS_DIR" \
56 -library "$ROOT_DIR/target/aarch64-apple-tvos/release/libonde.a" -headers "$HEADERS_DIR" \
57 -library "$DIST_DIR/libonde-tvos-sim.a" -headers "$HEADERS_DIR" \
58 -library "$ROOT_DIR/target/aarch64-apple-visionos/release/libonde.a" -headers "$HEADERS_DIR" \
59 -library "$DIST_DIR/libonde-visionos-sim.a" -headers "$HEADERS_DIR" \
60 -library "$ROOT_DIR/target/aarch64-apple-watchos/release/libonde.a" -headers "$HEADERS_DIR" \
61 -library "$DIST_DIR/libonde-watchos-sim.a" -headers "$HEADERS_DIR" \
62 -library "$DIST_DIR/libonde-macos.a" -headers "$HEADERS_DIR" \
63 -output "$FRAMEWORK_DIR"
64
65 export FRAMEWORK_DIR ZIP_PATH
66 python3 - <<'ZIP'
67 import os
68 import zipfile
69 from pathlib import Path
70 root = Path(os.environ['FRAMEWORK_DIR'])
71 out = Path(os.environ['ZIP_PATH'])
72 with zipfile.ZipFile(out, 'w', compression=zipfile.ZIP_DEFLATED, compresslevel=9) as zf:
73 for folder, _, files in os.walk(root):
74 for name in files:
75 path = Path(folder) / name
76 zf.write(path, path.relative_to(root.parent))
77 ZIP
78
79 CHECKSUM=$(swift package compute-checksum "$ZIP_PATH")
80 printf '%s
81 ' "$CHECKSUM" > "$CHECKSUM_PATH"
82
83 VERSION=$(python3 - <<'VER'
84 from pathlib import Path
85 import re
86 cargo = Path('Cargo.toml').read_text()
87 match = re.search(r'^version\s*=\s*"([^"]+)"', cargo, re.MULTILINE)
88 if not match:
89 raise SystemExit('Could not parse package.version from Cargo.toml')
90 print(match.group(1))
91 VER
92 )
93 printf '%s
94 ' "$VERSION" > "$VERSION_PATH"
95
96 echo "XCFramework: $FRAMEWORK_DIR"
97 echo "Zip: $ZIP_PATH"
98 echo "Checksum: $CHECKSUM"
99 echo "Version: $VERSION"