#!/bin/bash # 交叉编译 mosh(blinksh/ios 分支) + protobuf-lite → MoshCore.xcframework(iOS device/simulator/macOS)。 # crypto 后端 = Apple CommonCrypto(系统内建);特性宏由 build/mosh/config.h 手写提供(绕过 autotools)。 # 产出 library-only xcframework(头文件与 modulemap 由包内 C target 提供,避免 modulemap 撞车,同 CSSHCore 教训)。 set -euo pipefail BUILD="$(cd "$(dirname "$0")" && pwd)" # vendor/build VENDOR="$(cd "$BUILD/.." && pwd)" # vendor MOSH_SRC="$VENDOR/mosh/src" PROTOBUF="$VENDOR/protobuf" PROTOBUF_SRC="$PROTOBUF/src" MOSH_CMAKE="$BUILD/mosh" OUT="$BUILD/mosh-out" ARTIFACTS="$VENDOR/../artifacts" IOS_DEPLOY=17.0 MAC_DEPLOY=14.0 build_slice() { local name="$1" sysname="$2" sysroot="$3" archs="$4" deploy="$5" echo "==================== slice: $name ($archs @ $sysroot) ====================" rm -rf "$OUT/$name"; mkdir -p "$OUT/$name" local common=( -G Ninja -DCMAKE_BUILD_TYPE=Release -DCMAKE_SYSTEM_NAME="$sysname" -DCMAKE_OSX_SYSROOT="$sysroot" -DCMAKE_OSX_ARCHITECTURES="$archs" -DCMAKE_OSX_DEPLOYMENT_TARGET="$deploy" ) # --- protobuf-lite(仅 lite runtime;mosh 的 .proto 是 proto2 + LITE_RUNTIME) --- cmake -S "$PROTOBUF" -B "$OUT/$name/protobuf" "${common[@]}" \ -Dprotobuf_BUILD_TESTS=OFF \ -Dprotobuf_BUILD_PROTOC_BINARIES=OFF \ -Dprotobuf_BUILD_LIBPROTOC=OFF \ -Dprotobuf_BUILD_SHARED_LIBS=OFF \ -DCMAKE_CXX_STANDARD=14 cmake --build "$OUT/$name/protobuf" --target libprotobuf-lite -j8 # --- moshios(我们的 CMakeLists,编 src/*.cc) --- cmake -S "$MOSH_CMAKE" -B "$OUT/$name/mosh" "${common[@]}" \ -DMOSH_SRC="$MOSH_SRC" \ -DPROTOBUF_SRC="$PROTOBUF_SRC" cmake --build "$OUT/$name/mosh" -j8 # --- 合并静态库 → 单一 libMoshCore.a --- libtool -static -o "$OUT/$name/libMoshCore.a" \ "$OUT/$name/mosh/libmoshios.a" \ "$OUT/$name/protobuf/libprotobuf-lite.a" echo "[+] $name → $(lipo -archs "$OUT/$name/libMoshCore.a")" } pack_xcframework() { echo "==================== packing MoshCore.xcframework (library-only) ====================" rm -rf "$ARTIFACTS/MoshCore.xcframework"; mkdir -p "$ARTIFACTS" local args=() for s in "$@"; do args+=(-library "$OUT/$s/libMoshCore.a") done xcodebuild -create-xcframework "${args[@]}" -output "$ARTIFACTS/MoshCore.xcframework" echo "[+] MoshCore.xcframework:"; ls "$ARTIFACTS/MoshCore.xcframework" } case "${1:-all}" in iossim) build_slice iossim iOS iphonesimulator "arm64;x86_64" "$IOS_DEPLOY" ;; device) build_slice ios-arm64 iOS iphoneos "arm64" "$IOS_DEPLOY" ;; macos) build_slice macos Darwin macosx "arm64" "$MAC_DEPLOY" ;; all) build_slice iossim iOS iphonesimulator "arm64;x86_64" "$IOS_DEPLOY" build_slice ios-arm64 iOS iphoneos "arm64" "$IOS_DEPLOY" build_slice macos Darwin macosx "arm64" "$MAC_DEPLOY" pack_xcframework iossim ios-arm64 macos ;; pack) shift; pack_xcframework "$@" ;; esac