From 8fd517bac2e5d60ec7c993f423b1400326894131 Mon Sep 17 00:00:00 2001 From: tei Date: Thu, 17 Sep 2026 14:51:22 +0900 Subject: [PATCH] fix: validate STEP-081 ios device build --- ..._iOS_Metal_Renderer与真机Smoke入口设计_v1.md | 2 +- ...-081_iOS_Metal_Renderer与真机Smoke入口_v1.md | 15 ++++++++--- ...enderer与真机Smoke入口_RDC编译验证报告_v1.md | 25 +++++++++++++++++++ platform/ios/app/CMakeLists.txt | 3 +++ platform/ios/app/MBXViewController.mm | 6 ++--- 粒子开发记录.md | 2 +- 6 files changed, 45 insertions(+), 8 deletions(-) create mode 100644 docs/报告/STEP-081_iOS_Metal_Renderer与真机Smoke入口_RDC编译验证报告_v1.md diff --git a/docs/30_设计/STEP-081_iOS_Metal_Renderer与真机Smoke入口设计_v1.md b/docs/30_设计/STEP-081_iOS_Metal_Renderer与真机Smoke入口设计_v1.md index 4d6f97413..8702a29d7 100644 --- a/docs/30_设计/STEP-081_iOS_Metal_Renderer与真机Smoke入口设计_v1.md +++ b/docs/30_设计/STEP-081_iOS_Metal_Renderer与真机Smoke入口设计_v1.md @@ -1,6 +1,6 @@ # STEP-081 iOS Metal Renderer 与真机 Smoke 入口设计 v1 -状态:进行中 / WAITING_RDC_DEVICE_BUILD。本文只记录 Codex 静态实现;未进行 iPhoneOS 编译或真机运行。 +状态:进行中 / WAITING_DEVICE_SMOKE。RDC 已完成 iPhoneOS arm64 无签名 Test App 编译;尚未签名安装或真机运行。 ## 目标和边界 diff --git a/docs/50_Step记录/STEP-081_iOS_Metal_Renderer与真机Smoke入口_v1.md b/docs/50_Step记录/STEP-081_iOS_Metal_Renderer与真机Smoke入口_v1.md index 014b9b3ab..20549934c 100644 --- a/docs/50_Step记录/STEP-081_iOS_Metal_Renderer与真机Smoke入口_v1.md +++ b/docs/50_Step记录/STEP-081_iOS_Metal_Renderer与真机Smoke入口_v1.md @@ -1,6 +1,6 @@ # STEP-081 iOS Metal Renderer 与真机 Smoke 入口 v1 -状态:进行中 / WAITING_RDC_DEVICE_BUILD +状态:进行中 / WAITING_DEVICE_SMOKE ## 目标 @@ -13,7 +13,8 @@ - [x] 在 Test App Runtime Styling 菜单加入 T0/midpoint/T1/clear private smoke seam。 - [x] CMake 将既有 Wind Golden T0/T1 复制到 app bundle。 - [x] 仅做静态检查;未执行 Jest。 -- [ ] iPhoneOS device build、Metal runtime compilation、真实 iPhone/iPad smoke:待 RDC/GPT。 +- [x] iPhoneOS arm64 Test App 无签名编译通过,`BUILD SUCCEEDED`。 +- [ ] Metal runtime compilation、签名安装、真实 iPhone/iPad smoke:待真机可用后执行。 ## 允许范围与限制 @@ -25,7 +26,7 @@ ## 构建与阻塞 -`NOT_RUN_BY_DESIGN — Codex prohibited from building`。无 iOS PASS、Metal PASS 或真机 PASS 声明。若 device runtime shader compile 失败,先检查 `include/mbgl/shaders/mtl/particle_gpu_validation.hpp`、对应 `.cpp` binding 表、`renderer_backend.cpp` registry 和 `cmake/metal.cmake` source list。 +`Codex` 未执行任何编译;GPT 审查通过后由 RDC 完成 CMake/Xcode iPhoneOS arm64 build。最终无签名 `app` target `BUILD SUCCEEDED`,产物约 61 MB,主程序为 arm64 Mach-O,Wind T0/T1 QBIN 均已进入 `ParticleSmokeFixtures/` 且 SHA-256 与源 fixture 一致。Metal runtime shader compile、签名安装与真机 PASS 尚未执行。 ## GPT / RDC 独立审查(2026-09-17) @@ -36,3 +37,11 @@ Codex 结束后由 RDC 读取完整 diff、设计文档和完成报告,GPT 独 - Smoke 选择器由 iPad 需要 popover anchor 的 ActionSheet 改为 Alert,保证 iPhone/iPad 真机都可直接进入。 `git diff --check` 通过;未发现 QBIN V4/Core contract、Android/RN API 或版本坐标越界修改。下一步允许 RDC 执行 iPhoneOS device build;仍禁止 Simulator。 +## RDC 编译验证(2026-09-17) + +- `cmake --preset ios-metal` 配置成功,Xcode 26.3 / iPhoneOS 26.2 / AppleClang 17。 +- Darwin style codegen 需要 Bazel;按仓库 `.bazelversion` 使用 Bazel 8.6.0 后通过。 +- 首次签名构建被 `org.maplibre.app` provisioning 阻塞,因此改用 `CODE_SIGNING_ALLOWED=NO` 做 device-architecture 编译验证;未使用 Simulator。 +- 编译中只对 Test App 做小范围修正:使用 `${CMAKE_SOURCE_DIR}/src` 暴露 private smoke 所需内部头;`weakSelf` 改为显式 `MBXViewController *`;fixture path 使用 `NSString *`。 +- 最终 `app` target `BUILD SUCCEEDED`;`particle_gpu_validation.cpp` 和 `MBXViewController.mm` 均通过 arm64 编译。 +- 当前登记 iPhone/iPad 均为 `unavailable`,因此状态进入 `WAITING_DEVICE_SMOKE`,不能声明真机/Metal runtime PASS。 diff --git a/docs/报告/STEP-081_iOS_Metal_Renderer与真机Smoke入口_RDC编译验证报告_v1.md b/docs/报告/STEP-081_iOS_Metal_Renderer与真机Smoke入口_RDC编译验证报告_v1.md new file mode 100644 index 000000000..785975d99 --- /dev/null +++ b/docs/报告/STEP-081_iOS_Metal_Renderer与真机Smoke入口_RDC编译验证报告_v1.md @@ -0,0 +1,25 @@ +# STEP-081 iOS Metal Renderer 与真机 Smoke 入口 RDC 编译验证报告 v1 + +日期:2026-09-17 +状态:DEVICE_BUILD_PASS / WAITING_DEVICE_SMOKE + +## 结果 + +- CMake `ios-metal` 配置成功。 +- iPhoneOS 26.2 / arm64 / Debug / `app` target 最终 `BUILD SUCCEEDED`。 +- 未使用 Simulator;因 provisioning 与当前真机 unavailable,最终构建使用 `CODE_SIGNING_ALLOWED=NO`。 +- `particle_gpu_validation.cpp` 已进入 `mbgl-core` arm64 编译并通过。 +- `MBXViewController.mm` private Smoke 入口已通过 Objective-C++ arm64 编译。 +- 产物:`build-ios/platform/ios/app/Debug-iphoneos/app.app`,约 61 MB;主程序为 arm64 Mach-O。 +- Bundle 内 `ParticleSmokeFixtures/T0.qbin` 与 `T1.qbin` SHA-256 与 RN Test Host Golden fixture 完全一致。 + +## RDC 编译期修正 + +1. Test App private include root 改用 `${CMAKE_SOURCE_DIR}/src`,避免子项目 `PROJECT_SOURCE_DIR` 指向 `platform/ios/app`。 +2. `weakSelf` 使用显式 `MBXViewController *` 类型。 +3. fixture path 使用 `NSString *`,移除错误的 `const NSString *`。 +4. 安装/启用仓库锁定的 Bazel 8.6.0 以完成 Darwin generated code。 + +## 尚未完成 + +当前登记 iPhone/iPad 均为 `unavailable`。因此尚未执行签名安装、设备启动、Metal runtime shader compile,以及 T0 / midpoint / T1 / Clear-release Smoke。STEP-081 不能关闭,下一状态为 `WAITING_DEVICE_SMOKE`。 diff --git a/platform/ios/app/CMakeLists.txt b/platform/ios/app/CMakeLists.txt index d1812e2f9..6f9aee974 100644 --- a/platform/ios/app/CMakeLists.txt +++ b/platform/ios/app/CMakeLists.txt @@ -24,6 +24,9 @@ add_executable(app target_include_directories( app PRIVATE "${PROJECT_SOURCE_DIR}" + # STEP-081 private Core smoke seam: RasterArraySource currently references + # one particle adapter header that intentionally remains under src/. + "${CMAKE_SOURCE_DIR}/src" ) set_target_properties(app PROPERTIES diff --git a/platform/ios/app/MBXViewController.mm b/platform/ios/app/MBXViewController.mm index 42e9bd098..6ea2a09d8 100644 --- a/platform/ios/app/MBXViewController.mm +++ b/platform/ios/app/MBXViewController.mm @@ -1184,7 +1184,7 @@ CLLocationCoordinate2D randomWorldCoordinate(void) { UIAlertController *menu = [UIAlertController alertControllerWithTitle:@"Particle / QBIN V4 Smoke" message:@"Wind Golden QBIN T0/T1. This is a private Core test seam." preferredStyle:UIAlertControllerStyleAlert]; - __weak typeof(self) weakSelf = self; + __weak MBXViewController *weakSelf = self; void (^selectTime)(uint64_t, NSString *) = ^(uint64_t timestamp, NSString *label) { [weakSelf installParticleQbinV4SmokeAtTime:timestamp label:label]; }; @@ -1201,8 +1201,8 @@ CLLocationCoordinate2D randomWorldCoordinate(void) { NSString *(^fixturePath)(NSString *) = ^NSString *(NSString *name) { return [[NSBundle mainBundle] pathForResource:name ofType:@"qbin" inDirectory:@"ParticleSmokeFixtures"]; }; - const NSString *t0Path = fixturePath(@"T0"); - const NSString *t1Path = fixturePath(@"T1"); + NSString *t0Path = fixturePath(@"T0"); + NSString *t1Path = fixturePath(@"T1"); NSData *t0Data = t0Path ? [NSData dataWithContentsOfFile:t0Path] : nil; NSData *t1Data = t1Path ? [NSData dataWithContentsOfFile:t1Path] : nil; if (!t0Data || !t1Data) { diff --git a/粒子开发记录.md b/粒子开发记录.md index f9b377c8f..220f83383 100644 --- a/粒子开发记录.md +++ b/粒子开发记录.md @@ -816,4 +816,4 @@ Android V3-08 单次综合验收已完成并关闭。Native `13.4.1-particle.2` - Win11 实际构建发现并修正 JNI particle binding declaration 参数数目与 Kotlin `validUInt16`/`validSafeInteger` 编译表达式;Debug APK 成功生成、安装并启动。Metro 固定监听 8091,App 仍访问 localhost:8081,正确 reverse 为 `8081 -> 8091`。 - Test Host 的 8 个 V4 QBIN Golden Fixture(Wind/Wave/Current/Rain,各 T0/T1)已由用户人工确认功能正常;V4 调用经 `submitEncodedField` 进入 `RasterArraySource::submitEncodedField` / `QbinV2Decoder`,不是 JS 解码。 - 当前入口文档已整理:`docs/00_项目总则/当前基线与开发路线_v2.md`、`docs/50_Step记录/STEP-080_Android_AAR与RNTestHost标准构建流水线_v2.md`、`docs/70_发布/Android_RN_QBINV4_13.4.1-particle.3_发布基线_v1.md`。旧 STEP-060~072 与 STEP-080 v1 保留历史事实,但不再作为当前构建命令来源。 -# STEP-081(2026-09-17):新增 Metal `ParticleGpuValidationShader` 与 iOS Test App Wind QBIN V4 private smoke 入口。Codex 后已完成 GPT/RDC 独立静态审查,并修正 Metal State 输出精度、VELOCITY 零向量 fail-closed 与 iPad Smoke 菜单入口;iPhoneOS device build、Metal runtime compile 与真机验收仍待 RDC,状态 WAITING_RDC_DEVICE_BUILD。 +# STEP-081(2026-09-17):新增 Metal `ParticleGpuValidationShader` 与 iOS Test App Wind QBIN V4 private smoke 入口。Codex 后已完成 GPT/RDC 独立静态审查;RDC 随后完成 iPhoneOS arm64 无签名 Test App 编译并取得 `BUILD SUCCEEDED`,`particle_gpu_validation.cpp` 与 `MBXViewController.mm` 均通过,61 MB app bundle 内 T0/T1 QBIN SHA-256 与源 fixture 一致。当前真机均 unavailable,签名安装、Metal runtime compile 与 T0/MID/T1/Clear 真机 Smoke 待执行,状态 WAITING_DEVICE_SMOKE。