mirror of
https://github.com/vercel-labs/scriptc.git
synced 2026-10-21 05:50:55 +08:00
- three library-mode-only triples join SCRIPTC_TARGET: aarch64-apple-ios, aarch64-apple-ios-simulator (darwin hosts with Xcode's iPhoneOS/iPhoneSimulator SDKs), and aarch64-linux-android (any host with an NDK). The consuming pattern is an embedding app linking profile-configured static archives — Xcode on the Apple side, Gradle/NDK on the Android side — so the executable lane refuses the triples with SC3002 and the pointer to --lib - zig bundles no Apple or bionic libc: resolveCc discovers the sysroot (xcrun for the selected Apple SDK; ANDROID_NDK_ROOT or the newest ndk/<version> under the SDK root) and spells it into targetArgs, where every cache tier already keys it. The canonical LLVM spellings map to zig's own with the minimum-version floors pinned: aarch64-ios.15.0[-simulator] stamps LC_BUILD_VERSION minos 15.0 into every object, aarch64-linux-android.26 pins the bionic stub level an embedder's minSdkVersion must meet. API 26 bionic carries everything the library-lane units call (arc4random_buf included), so no shim TU joins the archive - localization follows the existing object-format rule: both iOS platforms ride the Mach-O host-ld64 arm (ld64 reads iOS objects and preserves platform/minos through the -r merge), Android rides the cross-ELF arm (zig relocatable merge + in-process demotion) via the driver's zig spelling. abi.instance_per_thread needed no per-target work — thread-local statics compile identically on all three - admission is a pure env/host check ahead of toolchain discovery: an iOS triple off a darwin host and near-miss mobile spellings refuse SC3002 with the pairing or the supported set named, in compile() and compileLibrary() both, decorated by the profile teaching machinery - library-multi grows the mobile lanes: M12 admission shape always runs; SCRIPTC_IOS=1 builds localized a/b archives per target and emission (M1 symbol exactness, ambient audit, version floor), links probes with the Xcode clang, and EXECUTES the two-instance and four-thread probes on a booted simulator byte-for-byte against the desktop expectations (device-arch archives are build+link verified); SCRIPTC_ANDROID=1 does the same through the NDK clang and an emulator, reusing a running device or writing and booting a headless arm64 AVD directly - the surface manifest's coverage notes record the mobile posture (the library-admissible surface only; no mobile claim outside it), the profile spec and the platforms page carry the mobile matrix with the version floors, and non-mobile builds are unchanged byte-for-byte