chore(release): 1.0.1

明确 BSP 的 RES 开发范围和 SDK 构建写入边界;调整 CV184X 强制补丁预检并补齐构建交接测试。
This commit is contained in:
tangfahong committed 2026-10-09 18:05:07 +08:00
1 parent 1641fac631
commit ea4ff92835
11 files changed
+90 -17

No files matched your search

+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "firmware-lowlevel-development",
"version": "1.0.0+codex.20260924015901",
"version": "1.0.1",
"description": "\u9762\u5411\u56fa\u4ef6\u5e95\u5c42 BSP\u3001PSP\u3001AI \u6a21\u578b\u90e8\u7f72\u3001\u8054\u8c03\u4e0e\u6027\u80fd\u4f18\u5316\u7684\u786e\u8ba4\u95e8\u7981\u5f0f\u5f00\u53d1\u6280\u80fd\u5957\u4ef6\u3002",
"author": {
"name": "EAPIL"
@@ -19,6 +19,12 @@ description: "基于 EmxRes 参考项目创建和适配板级 BSP,处理 CV18
8. `EP_CHIP` 为 CV181X、且参考项目使用 `configs/kernel/` 与 `configs/uboot/` 时,读取 [CV181X 分目录与 SDK 只读核对](references/cv181x-sdk-readonly-review.md)。需要访问 SDK 时还必须有用户明确给出的精确 SDK 路径;默认不访问。
9. `EP_CHIP` 为 CV184X、且项目使用单板卡配置目录时,读取 [CV184X 板级配置与构建链](references/cv184x-sdk-readonly-review.md)。需要核对 SDK 当前状态时,必须由用户给出精确 SDK 根目录;默认不访问。
## 开发范围与准确表述
BSP 开发改动只写入当前 `EmxRes/<项目名>` 及其 staging 项目;SDK 在调查阶段只读。已确认的原生全量编译会将 RES 配置同步到 SDK,并写入生成文件,这属于构建实际写入,不能承诺 SDK 目录完全不变。不得把 SDK 同步目标列为人工开发修改清单。
形成方案、说明 SDK 差异或报告构建结果前,读取并遵守 [RES、SDK 与表述边界](references/res-sdk-boundary.md)。SDK 编辑、软链接改造、已有改动恢复及共享构建脚本修改均不属于默认 BSP 工作范围。
## 默认工作模式
- 参考项目和新项目必须是 `EmxRes` 的直接子目录。参考项目只读,新项目先在同一根目录的临时目录中完成。
@@ -32,7 +38,7 @@ description: "基于 EmxRes 参考项目创建和适配板级 BSP,处理 CV18
## 允许的 BSP 差量
正常范围包括项目命名及必要引用、CV18 `cvi_board_init.c` 与有效 DTS/DTSI 的 GPIO 释放或重分配、项目级媒体 ION 内存、现有分区源定义、`imgs` 软链接,以及 `doc/bsp_adaptation/` 证据。
正常范围限于当前 RES 项目中的项目命名及必要引用、CV18 `cvi_board_init.c` 与有效 DTS/DTSI 的 GPIO 释放或重分配、项目级媒体 ION 内存、现有分区源定义、`imgs` 软链接,以及 `doc/bsp_adaptation/` 证据。SDK 中的对应路径只作为调查映射和原生构建同步目标。
项目级媒体保留内存和已有分区配置属于本 Skill;DDR 初始化、MMU、通用分配器、存储驱动、Boot 逻辑、跨芯片适配和公共平台能力属于 PSP 或新的已确认工作包。不得修改应用业务。
@@ -45,7 +51,7 @@ description: "基于 EmxRes 参考项目创建和适配板级 BSP,处理 CV18
- 原理图派生 GPIO 必须先写入并通过 `scripts/bsp/validate_gpio_plan.py`,再由用户确认整个实施表;`provisional` 或 `blocked` 行不能进入代码。
- 其他厂商芯片的媒体内存不自动修改;报告人工修改警告,但可继续独立的已确认工作。
- 任务需要构建产物时,`bsp_preflight.py build` 通过后自动执行标准全量编译:在固定 `EmxRes` 根目录加载 `tools/script_completion.sh`,再运行 `EMX2_BuildSDKTool <项目名> <构建版本> all`,不再单独请求确认。标准脚本内部的配置同步和 `git fetch origin` 视为该构建的一部分。直接运行 `ep_kernel.sh`、`ep_uboot.sh`、`EPSYNCSDKConfig.sh`,改用组件构建、覆盖已有输出或修改统一构建脚本不属于自动范围,出现这些需求时停止并请用户确认。
- CV184X 的标准构建有额外例外:`bsp_preflight.py build` 报告 `requires_patch_precheck=true` 时,`passed=true` 仍不足以自动构建。补丁环境检查失败会走 `--applypatch --force`,可能对多个 SDK 子仓库执行 `git reset --hard`。一次性构建确认不包括丢弃这些仓库的已有改动。构建前先按 CV184X 专页核对补丁门禁及相关仓库状态;无法证明不会进入强制重置分支时停止,明确列出风险和受影响路径,另请用户决定。不得用只读文件比对代替补丁环境检查通过的证据。
- CV184X 的补丁检查由项目统一编译脚本负责;Skill 不额外运行 `--check-env`、检查补丁完整性或访问 SDK 子仓库。不得主动或通过统一脚本自动执行 `--applypatch --force`。构建预检只读取精确的项目构建入口,发现该脚本可能调用强制打补丁时停止,不运行编译;先由构建脚本所有者改成失败即返回错误,不代改共享脚本、不通过检查通过与否绕开风险。安全入口就绪后运行原生全量编译,记录真实退出码、失败原因和产物结果。
- 编译成功后先对本次精确 imgs 版本路径自动执行并复核 `a+rX`:路径上的目录和输出内目录对所有用户可读、可进入,普通文件对所有用户可读,原本可执行的文件才补齐所有用户执行权限;不得跟随软链接、扩大到其他构建版本或使用 `chmod -R 777`。权限处理失败时不能记录 `build_passed`。随后核对唯一 `kernel.bin`、`rootfs.bin` 与实际生效分区表;每个镜像相对其所有对应分区中的最小容量必须至少保留 512 KiB(524288 字节),否则不能记录 `build_passed`。全部通过后持久化权限与余量证据、精确 imgs 版本目录、产物 hash 和 PSP 交接 manifest,并用 `project_guard.py audit-final` 复核正式项目。
- 本地配置检查通过只能声明项目已创建或 `local validation passed`;未执行同步、编译和板上验证时必须如实标注。
- 完成时按 [记录规范](../firmware-lowlevel-development/references/records.md) 和 [交付契约](../firmware-lowlevel-development/references/deliverable-contract.md) 报告;不执行 `git add`、提交或远端推送。
@@ -20,6 +20,10 @@ doc/bsp_adaptation/
CSV 只有从原理图提取或重新映射 Pinmux 时才作为派生审核证据写入 `inputs/`;它不是唯一事实源。
## 开发改动与构建写入
按 [RES、SDK 与表述边界](res-sdk-boundary.md) 将当前 RES 项目的开发改动、SDK 只读核对映射和原生构建实际写入分开记录。构建授权覆盖标准工具已说明的配置同步及生成物写入,不授权额外编辑 SDK、替换 SDK 软链接或备份后恢复 SDK 配置。SDK 中出现差异时,先确定是否影响本次同步;不要把调查结果直接变成 SDK 修复方案。
## 本地 Git
`EmxRes` 已有 Git worktree 只用于只读状态、参考项目脏文件发现和差异证据。不得执行 `git init`、`add`、`commit`、`stash`、清理、分支切换、历史改写或 `push`。
@@ -57,9 +61,9 @@ python3 <BSP Skill>/scripts/bsp/bsp_preflight.py build \
--version <YYYYMMDD_N>
```
`passed=true` 只是构建的必要条件。执行前把工具返回的精确工作目录、完整命令、项目与 SDK 路径、构建范围、最终 imgs 版本路径、工作区状态、配置同步副作用,以及统一脚本中的远端 `git fetch origin` 写入记录。CV184X 还须按下文检查 `requires_patch_precheck`;不能把这一字段当成普通提示后继续自动构建。不得从 `EmxRes` 的父目录启动,也不得依赖登录 Shell 的偶然当前目录。
`passed=true` 是构建的必要条件。执行前把工具返回的精确工作目录、完整命令、项目与 SDK 路径、构建范围、最终 imgs 版本路径、工作区状态、配置同步副作用,以及统一脚本中的远端 `git fetch origin` 写入记录。不得从 `EmxRes` 的父目录启动,也不得依赖登录 Shell 的偶然当前目录。
CV184X 还要执行 [CV184X 板级配置与构建链](cv184x-sdk-readonly-review.md)中的补丁门禁。其统一脚本在补丁检查失败后会尝试 `--applypatch --force`,可能重置多个 SDK 子仓库;这不属于上述自动构建授权。相关仓库存在未确认改动、补丁检查未通过或无法证明不会进入强制重置分支时,停止自动构建并向用户展示精确风险,不能静默运行或代替用户批准丢弃改动。CV181X 不套用这个补丁流程。
CV184X 的补丁检查和失败诊断交给原生构建脚本;Skill 不单独检查补丁完整性,也不进入 SDK 仓库。预检仅查看本轮精确构建脚本是否仍可能自动调用 `--applypatch --force`;若有则停止,交构建脚本所有者改为失败即退出,禁止用静默替换脚本、跳过补丁检查或注入拦截命令来继续。安全脚本就绪后直接执行统一编译,按实际退出码和日志报告结果;CV181X 不套用 CV184X 的补丁逻辑。
下列情况不自动处理:预检失败、统一脚本或路径与固定规则不符、输出版本已存在、参考或目标出现新的重叠改动、需要直接运行同步脚本、需要组件构建、需要改变构建参数、需要修改统一脚本,或者构建失败后需要清理和重试。此时停止并向用户说明异常、影响和可选处理方式。
@@ -5,7 +5,7 @@
## 先确定改哪里
- `configs/uboot/<board_build_type>_defconfig` 确定板型;同目录的 `cvitek_<board_build_type>_defconfig` 和 `configs/kernel/` 中的对应 defconfig 必须成组存在。
- U-Boot 板级初始化、分区表在 `configs/uboot/`;Kernel defconfig、DTS/DTSI、`memmap.py` 在 `configs/kernel/`。先从需求和生效引用找真正的源文件,再改项目配置;不要直接改 SDK 公共默认文件。
- U-Boot 板级初始化、分区表在当前 RES 项目的 `configs/uboot/`;Kernel defconfig、DTS/DTSI、`memmap.py` 在 `configs/kernel/`。开发只修改这些 RES 源文件;SDK 对应文件用于只读核对和原生构建同步,不直接编辑。范围说明按 [RES、SDK 与表述边界](res-sdk-boundary.md) 执行。
- `CONFIG_ENABLE_FREERTOS=y` 只说明启用了 FreeRTOS 相关配置,不能单凭这一项认定交付形态是双系统。
- 参考项目 `CV1815JA_F36` 只能作为已知实现的例子,不代表所有 CV181X 产品的分区、内存、GPIO 或传感器配置。
@@ -19,7 +19,7 @@ python3 <BSP Skill>/scripts/bsp/inspect_cv181x_sdk.py \
--sdk-root <用户明确指定的 SDK 根目录绝对路径>
```
脚本先核对 `EP_CHIP`、SDK 版本、分目录布局和已知同步脚本,再比较项目文件与 SDK 对应文件。报告中的 `sdk_copy_differs` 表示当前内容不一致,不说明哪一份正确;`shared_sdk_target` 表示 SDK 板型文件实际是指向公共默认文件的软链接,后续复制可能影响别的板型;`generated_config_differs` 表示 SDK `build/.config` 与项目板级配置不一致,也可能只是 SDK 上次用于别的项目。对这些提示先确认使用的是哪个 SDK 和哪个构建版本,不擅自同步。
脚本先核对 `EP_CHIP`、SDK 版本、分目录布局和已知同步脚本,再比较项目文件与 SDK 对应文件。报告中的 `sdk_copy_differs` 表示当前内容不一致,不说明哪一份正确;`shared_sdk_target` 表示 SDK 板型文件实际是指向公共默认文件的软链接,后续复制可能影响别的板型;`generated_config_differs` 表示 SDK `build/.config` 与项目板级配置不一致,也可能只是 SDK 上次用于别的项目。对这些提示先核对使用的是哪个 SDK 和哪个构建版本,不擅自同步。软链接提示不能转化为默认替换链接、改写公共目标或备份恢复 SDK 的方案;先报告原生同步的实际目标和影响。
尤其要核对统一构建脚本里 `defconfig` 与 `Ep_Uboot_Config_Func`、`Ep_Kernel_Config_Func` 的先后。若先生成 `.config` 再同步项目配置,本次顶层配置可能仍是旧值;脚本会提示顺序风险,但不会代替真实构建。`ep_kernel.sh`、`ep_uboot.sh` 末尾若固定 `exit 0`,也不能只凭返回码宣称所有文件复制成功,应逐项核对源与 SDK 目标。
@@ -4,6 +4,8 @@
## 配置如何生效
开发源文件与配置只修改当前 RES 项目。SDK 只读调查和原生构建同步按 [RES、SDK 与表述边界](res-sdk-boundary.md) 分开说明;本节中的 SDK 路径均为同步或生成目标,不授予人工编辑权限。
专用工具按 `EP_CHIP` 和 `EP_FLASH_TYPE` 选定 `CV_BUILD_TYPE`。`EPSYNCSDKConfig.sh` 将项目单板卡目录用 `rsync -av` 写到 SDK `build/boards/cv184x/<CV_BUILD_TYPE>/`,然后工具执行 SDK `defconfig`、`clean_all` 和分项构建。先核对工具选出的 build type 与项目目录一致;若不一致,停止,不让同步脚本猜目标。同步脚本末尾固定 `exit 0`,单看脚本退出码不够,需比较每个映射文件及实际构建日志。
项目板卡目录至少应结合真实需求检查顶层 `<board>_defconfig`、Kernel/U-Boot defconfig、`dts_arm/<board>.dts`、`u-boot/cvi_board_init.c` 与分区 XML。顶层 defconfig 经 `build/common_functions.sh:defconfig` 生成 SDK `build/.config`;`build/envsetup_soc.sh` 根据该配置选实际生效的分区 XML。`CONFIG_DUAL_OS` 还影响 `build/Makefile` 选用哪组模块加载顺序。DTS 的 GPIO 使用要追到 `cv184x_base_arm.dtsi`、封装 DTSI、存储 DTSI、`cv184x_default_memmap.dtsi` 以及最终 DTB;只检查项目顶层 DTS 不足以证明引脚已释放。媒体内存还要看 `cvi_board_memmap.h` 的生成值、Kernel reserved-memory 和 RTOS 占用。
@@ -22,8 +24,8 @@ python3 <BSP Skill>/scripts/bsp/inspect_cv184x_sdk.py \
例如 `CV1841CP-LY-SM-YT70_dualos` 使用 `cv1841cp_wevb_0015a_spinand`。截至本次分析,项目与 SDK 当前的顶层 defconfig、DTS、分区 XML、U-Boot 初始化文件内容不同;项目分区的 APP/APP2 为 32768 KiB,SDK 当前表为 19456 KiB 并另有 DATA 分区。这是“当前 SDK 快照不可当作该项目已同步基线”的证据,不是要把 SDK 改成项目值的授权。其他 CV184X 项目不能套用这组容量。
## 编译前的补丁门禁
## 补丁检查的职责与构建安全
`BuildCvitek184XSDKTool.sh` 在同步配置之前先运行 `cvitek_cv184x_patch/scripts/repos --check-env`;若失败,会自动调用 `--applypatch --force`。该补丁工具在部分仓库有未提交的已跟踪改动或提交不匹配时,可能运行 `git reset --hard`。SDK 顶层本身不是一个 Git 仓库,而是多个子仓库;需要逐个确认补丁作用范围、相关仓库状态和 `--check-env` 的真实结果。只读文件比对不能代替补丁检查。若检查不通过或会进入强制重置分支,停止自动构建,说明哪些改动可能丢失,再请用户决定;不要自行运行 `--applypatch --force`。
`BuildCvitek184XSDKTool.sh` 应自行处理补丁检查,失败时返回错误。Skill 不额外运行 `--check-env`、扫描 SDK 子仓库或判断补丁完整性,只记录原生脚本的退出码和必要错误日志。编译前仅核对精确的项目构建入口不会在检查失败时自动执行 `--applypatch --force`;这不是补丁完整性检查。旧脚本仍包含自动强制打补丁时,不能以“失败后报告”代替禁止执行:先停止,让构建脚本所有者将失败分支改为返回非零;Skill 不自行改共享构建脚本或覆盖其行为。
`EmxRes/tools/BuildGitCheck.sh` 会执行远端 `git fetch origin`,但对非 Git 顶层目录的错误不一定可靠传播,因此它显示“检查通过”不能单独证明所有 SDK 子仓库干净或版本一致。构建成功之后仍要核对实际生效分区表、`kernel.bin`/`rootfs.bin` 余量,以及 `fip.bin`、`boot.bin`、`yoc.bin`、驱动和 rootfs 是否按需求出现。单凭配置同步、命令零退出码或某个文件存在,不能声称 BSP 已通过板上验证。
@@ -0,0 +1,33 @@
# RES、SDK 与表述边界
## 开发源文件
BSP 工作包的人工开发改动只写入当前 `EmxRes/<项目名>` 及其 staging 项目。Pinmux、GPIO、DTS/DTSI、defconfig、媒体内存、分区和项目同步脚本均在 RES 中维护;参考项目只读。SDK 文件、SDK 软链接和 `EmxRes/tools` 共享构建脚本不属于该修改范围。
确需修改 SDK 驱动、公共配置或共享构建工具时,先说明已确认的原因、所有权、精确文件和验证方式,作为独立工作包处理。读取 SDK 的授权和当前 BSP 工作包的批准均不自动授予这些编辑权限。
## SDK 只读调查
用户明确给出 SDK 根目录后,只读取与当前板型和问题相关的映射文件、必要 include 链及实现。调查所得的 SDK 路径用于证明映射或解释行为,不放入人工开发修改清单。
项目与 SDK 内容不同可能来自上次构建、已有工作或基线差异。先说明证据及对当前任务的影响,不能仅凭内容不同认定 SDK 需要修复。发现软链接指向公共文件时,报告原生同步会写到哪里;不默认提出替换 SDK 软链接、重建目录、清理、恢复或备份后覆盖的方案。若未确认的已有改动将被本次同步覆盖,停止该构建并请用户决定,继续不依赖该问题的 RES 工作。
## 原生编译的实际写入
已确认工作包中的标准全量编译会执行项目原生配置同步,并写入 SDK 板级目标、生成配置、头文件、DTB、缓存和编译产物。配置同步可能穿过软链接写入公共目标;这些也是 SDK 的真实文件写入,必须按已核对的构建链如实说明。源文件的维护位置仍为 RES。
这项构建授权只覆盖原生工具已说明的动作。不得为了编译顺利或让 SDK 看起来没有变化,额外编辑 SDK、改造软链接、注入同步逻辑、做完后恢复 SDK 配置,或修改共享构建脚本。项目同步脚本的修改也须列入 RES 实施方案,并说明其 SDK 写入效果;不能利用 RES 脚本扩大 SDK 修改范围。
按用户已确认的语义处理“只改 RES”:若指开发改动只在 RES,保留已授权的原生编译,不为标准同步重复请求确认;若用户明确要求 SDK 在整个过程严格只读,而现有原生工具必须写入 SDK,则停止该构建,说明具体冲突并让用户选择继续 RES 静态工作或另行处理构建环境。不能自行改造 SDK 来消除冲突。
## 方案与结果的说法
方案和报告分别列出三项:当前 RES 项目的开发改动、SDK 的只读核对映射、原生构建将执行或已经执行的文件写入。SDK 存在多份同名文件时,使用精确路径,并标明软链接及其真实目标。
- 开发阶段可以说“开发改动只写入 RES;SDK 仅用于只读核对”。
- 构建阶段应说“原生编译会将 RES 配置同步到 SDK,并生成编译文件”。不能笼统承诺“SDK 不会发生任何修改”。
- 不能将“构建同步到 SDK 的六个目标文件”说成“需要人工修改 SDK 的六个文件”。
- 区分计划、已经执行和检查通过;只有读取证据时不能说已经同步,命令或复制成功不能代替生效配置、镜像和设备验证。
- 用户纠正范围时,立即更新受影响的方案及记录;已知的路径、决定和授权继续使用。不要把一次范围澄清变成重复索要整套信息或重新审批已授权的标准构建。
报告原生构建写入时,说明实际命令、配置来源、同步目标和生成物;没有执行的同步、编译及设备验证明确标为未执行。只有确认整个过程没有 SDK 写入时,才可以声称 SDK 目录未变化。
@@ -1,5 +1,7 @@
# BSP 调查范围与验证模式
调查、开发修改与原生构建写入按 [RES、SDK 与表述边界](res-sdk-boundary.md) 分开说明。下列读取范围不授予 SDK 编辑权限。
## 默认范围
默认只读取:
@@ -37,7 +39,7 @@ CV184X 有独立的 [单目录 SDK 只读核对](cv184x-sdk-readonly-review.md)
1. 从实际板级 DTS 开始递归解析有效 DTS/DTSI include 链和条件编译上下文。
2. 读取范围限于为该 build type 解析出的精确文件和必要的 Pinmux 定义;仍禁止扫描整个 SDK。
3. include 无法解析或上下文不唯一时,目标 GPIO 占用检查不得判为通过。
4. 本模式只授予只读分析;只有任务明确进入构建产物交付级别时,才按 BSP 构建规则自动执行标准全量编译。其他 SDK 写入仍需用户确认。
4. 本模式只授予只读分析;只有任务明确进入构建产物交付级别时,才按 BSP 构建规则自动执行标准全量编译。原生构建以外的 SDK 编辑不属于本工作包;确有需要时,先明确所有权及精确范围,另行确认。
## 模式记录
@@ -59,7 +59,7 @@
- 芯片、SDK、Flash、系统形态、布局和板卡版本;
- 最终项目名;
- GPIO、内存、分区差量和继承项;
- 候选修改文件;
- 当前 RES/staging 项目内的候选修改文件;SDK 同步映射和构建写入另列,按 [RES、SDK 与表述边界](res-sdk-boundary.md) 说明;
- `imgs` 链接变化;
- 输入证据和 `doc/` 计划;
- 交付级别、调查范围、验证模式及结论上限;
@@ -211,9 +211,22 @@ def build_preflight(project_name: str, version: str, root: Path, output_root: Pa
f"EMX2_BuildSDKTool {project_name} {version} all"
)
warnings.append("统一构建可能同步配置到项目外 SDK,并按工具实现执行 git fetch origin")
requires_patch_precheck = assignments.get("EP_CHIP", "").upper().startswith("CV184")
if requires_patch_precheck:
warnings.append("CV184X 构建补丁检查失败可能触发 --applypatch --force;本预检未验证补丁环境,不能单凭 passed=true 自动构建")
is_cv184 = assignments.get("EP_CHIP", "").upper().startswith("CV184")
if is_cv184:
build_tool = root / "tools" / "BuildCvitek184XSDKTool.sh"
if not build_tool.is_file() or build_tool.is_symlink():
errors.append(f"CV184X 统一构建脚本缺失或不是普通文件: {build_tool}")
else:
script_lines = (
line.split("#", 1)[0]
for line in build_tool.read_text(encoding="utf-8").splitlines()
)
if any("--applypatch" in line and "--force" in line for line in script_lines):
errors.append(
f"统一构建脚本可能自动执行 --applypatch --force,禁止启动本次构建: {build_tool};"
"请由脚本所有者将该分支改为失败即退出"
)
warnings.append("CV184X 补丁完整性由统一构建脚本处理;Skill 不单独检查补丁环境")
return {
"schema_version": 1,
"kind": "build-preflight",
@@ -224,7 +237,8 @@ def build_preflight(project_name: str, version: str, root: Path, output_root: Pa
"project_path": str(project),
"config_layout": layout["layout"],
"board_build_type": layout["board_build_type"],
"requires_patch_precheck": requires_patch_precheck,
"requires_patch_precheck": False,
"patch_check_owner": "native-build-script" if is_cv184 else None,
"build_version": version,
"working_directory": str(root),
"completion_script": str(completion_script),
@@ -50,6 +50,10 @@ def main() -> int:
tools = root / "tools"
tools.mkdir()
(tools / "script_completion.sh").write_text("# test\n", encoding="utf-8")
(tools / "BuildCvitek184XSDKTool.sh").write_text(
"#!/bin/sh\n./cvitek_cv184x_patch/scripts/repos --check-env || exit 1\n",
encoding="utf-8",
)
reference = make_project(root, "CV1841CP-REF_dualos")
project_report = bsp_preflight.project_preflight(
@@ -94,9 +94,17 @@ def main() -> int:
assert bsp_preflight.resolve_board_layout(cv184, "CV1815JA")["error"]
write(cv184 / "buildEnvConfig.sh", "EP_CHIP=CV1841CP\n")
cv184.joinpath("imgs").symlink_to(f"/epbuild/EMX2.0/EmxRes/{cv184.name}/imgs")
build_tool = root / "tools/BuildCvitek184XSDKTool.sh"
write(build_tool, "./cvitek_cv184x_patch/scripts/repos --check-env\n"
"./cvitek_cv184x_patch/scripts/repos --applypatch --force\n")
cv184_build = bsp_preflight.build_preflight(cv184.name, "20260923_1", root, Path(temporary) / "output")
assert cv184_build["requires_patch_precheck"] is True, cv184_build
assert any("--applypatch --force" in item for item in cv184_build["warnings"]), cv184_build
assert cv184_build["passed"] is False, cv184_build
assert any("--applypatch --force" in item for item in cv184_build["errors"]), cv184_build
write(build_tool, "./cvitek_cv184x_patch/scripts/repos --check-env || exit 1\n")
cv184_build = bsp_preflight.build_preflight(cv184.name, "20260923_1", root, Path(temporary) / "output")
assert cv184_build["passed"] is True, cv184_build
assert cv184_build["requires_patch_precheck"] is False, cv184_build
assert cv184_build["patch_check_owner"] == "native-build-script", cv184_build
print("CV181X layout and SDK read-only inspection tests passed")
return 0