fix(fw): M51 r2 — 重编脚本开箱可用、自证门禁不再假绿、归因与 desc 纠正
r2 评审 p2-6items 六条全部处理;**产物字节未变**(5 件 md5 与31d4c22完全一致)。 P2-1/P2-4 归因纠正(31d4c22 提交说明里那两行是错的,以本条为准): - bootmenu 的 +1728 **不是**工具链代差,是 M23 源码(m2.29→m2.30)。证据:旧件 `readelf -p .comment` 已是 clang 22.1.8(与新件同代);旧件版本串 `0.1.0-m2.29-takeover`, 而钉值 commit884d4c4的源码已是 m2.30;用 6364498(m2.29 树)+ 今天的工具链重编得 157108/0507739d,与旧钉值件逐字节相同。 - launcherd 的 −512 也不是编译器:新旧 .comment 集合一致(那道 21.1.8 来自 meow_ui.a 里的 meow_font.o),真实原因是 SDK 静态库从 86800633 换成 cc0ed49b——用58cdb73源码 + 86800633 的 .a 重编得 894940/cea0a735,与旧钉值件逐字节相同。 - 因此**只有 meow_audiod 真有工具链代差**(旧 clang/LLD 21.1.8 → 新 22.1.8)。 P2-2 主 checkout 定位:`git rev-parse --git-common-dir` 给的是主仓库 .git 的**绝对**路径, 父目录才是主 checkout;旧版把绝对路径当相对路径拼到 $ROOT 下,`cd` 失败被 `set -e` 直接终止 → 干净 worktree 里静默 exit 1。现为 `cd "$_gcd/.."` + 全部 `|| true`, 找不到 meow_ui.a 时**先**打印诊断(缺什么、试过哪些路径、怎么覆盖)再退出。 P2-3 .tools 兜底层级:旧版把 $COMPAT_HOME/Project/R3ProII 指向 ROOT,脚本里的 `$HOME/Project/R3ProII/.tools` 就落到 `<checkout>/.tools`(干净 worktree 不存在 → 127)。 现在造一个真目录,只放 `.tools -> ~/.tools` 与 `patch_v2 -> $ROOT/patch_v2`; 零手工准备即可开箱重编。README 措辞同步改准。 P2-5 门禁假绿:test_time32_abi.sh 的退出码现计入 FAIL,脚本缺失也记 FAIL。 失败桩自证:`PASS=33 FAIL=1`、exit 1(原为 PASS=33 FAIL=0 / exit 0)。 P2-6 desc:meow_audio 的 `volume` → 真实子命令 `status / tone / route / vol / output / monitor` (并避开 `|`,否则破坏清单 4 字段格式);bootmenu 的读取键改为 display.brightness (display.brightness_min 只是下限 clamp);netmgrd 去掉「以太网连接」的夸大说法。
This commit is contained in:
1 parent
31d4c22806
commit
0d1b2d4c19
4 files changed
+142
-55
No files matched your search
@@ -13,8 +13,8 @@
|
|||||||
| `build_fw_apps.sh` | **通用打包脚本**(配置驱动)。读清单 → 组树 → repack → 校验 → 出固件。**不要改它的逻辑**,除非打包流程本身要变。 |
|
| `build_fw_apps.sh` | **通用打包脚本**(配置驱动)。读清单 → 组树 → repack → 校验 → 出固件。**不要改它的逻辑**,除非打包流程本身要变。 |
|
||||||
| `fw_content.conf` | **固件内容清单**(默认配置)。每行一条 `<src>|<dst>|<md5>|<desc>`,声明"哪个本地文件装到固件哪里"。**改固件内容只改这里。** |
|
| `fw_content.conf` | **固件内容清单**(默认配置)。每行一条 `<src>|<dst>|<md5>|<desc>`,声明"哪个本地文件装到固件哪里"。**改固件内容只改这里。** |
|
||||||
| `build_devkit.sh` | **TF 卡调试工具集**交叉编译脚本(zig → 静态 MIPS32r2):`vmstat/slabtop/free/ps/pmap/sysctl/lsof` → `fw_apps/devkit/`。与固件打包无关,独立跑。详见 `DEVKIT.md`。 |
|
| `build_devkit.sh` | **TF 卡调试工具集**交叉编译脚本(zig → 静态 MIPS32r2):`vmstat/slabtop/free/ps/pmap/sysctl/lsof` → `fw_apps/devkit/`。与固件打包无关,独立跑。详见 `DEVKIT.md`。 |
|
||||||
| `rebuild_binaries.sh` | **进固件的那批组件重编驱动**:`bash scripts/build/rebuild_binaries.sh [bootmenu netmgrd audiod audio launcherd]`。在干净 checkout / git worktree 里补齐各组件 `build_*.sh` 的本机布局默认路径(兼容 HOME + `.tools`/`meow_ui.a` 兜底),产物就地写回 `patch_v2/<组件>/`。 |
|
| `rebuild_binaries.sh` | **进固件的那批组件重编驱动**:`bash scripts/build/rebuild_binaries.sh [bootmenu netmgrd audiod audio launcherd]`。在干净 checkout / git worktree 里**开箱可跑**:兼容 HOME 里补 `.tools`(zig 工具链)与 `patch_v2`,`meow_ui.a` 自动从主 checkout 取(取不到会报错列出试过的路径),产物就地写回 `patch_v2/<组件>/`。 |
|
||||||
| `verify_fingerprints.sh` | **产物语义指纹自证**:`bash scripts/build/verify_fingerprints.sh`。重编后 md5 必变,能证明「产物含哪些源码改动」的是字符串/动态段/4263 反汇编判据,本脚本逐条断言。 |
|
| `verify_fingerprints.sh` | **产物语义指纹自证**:`bash scripts/build/verify_fingerprints.sh`(`--self-test` 自检判据非空)。重编后 md5 必变,能证明「产物含哪些源码改动」的是字符串/动态段/4263 反汇编判据;time32 门禁的退出码计入 FAIL,不会假绿。 |
|
||||||
| `test_build_devkit.sh` | `build_devkit.sh` 的回归测试(不重编;热缓存约 15s,冷启动需先重建基线 1–2 分钟):stamp 命中时 `--with-sources` 必须产出完整 `src/`;`licenses`/`README` 被删要能恢复、`--verify-only` 必须拒绝;MANIFEST 漂移检测。 |
|
| `test_build_devkit.sh` | `build_devkit.sh` 的回归测试(不重编;热缓存约 15s,冷启动需先重建基线 1–2 分钟):stamp 命中时 `--with-sources` 必须产出完整 `src/`;`licenses`/`README` 被删要能恢复、`--verify-only` 必须拒绝;MANIFEST 漂移检测。 |
|
||||||
| `DEVKIT.md` | devkit 的产物清单、许可证留痕(GPLv2 §3 / LGPL-2.1 §6)、可行性实测、time64 限制、上卡 PATH/busybox 关系。 |
|
| `DEVKIT.md` | devkit 的产物清单、许可证留痕(GPLv2 §3 / LGPL-2.1 §6)、可行性实测、time64 限制、上卡 PATH/busybox 关系。 |
|
||||||
| `README.md` | 本说明。 |
|
| `README.md` | 本说明。 |
|
||||||
|
|||||||
@@ -27,7 +27,7 @@
|
|||||||
# ============================================================================
|
# ============================================================================
|
||||||
|
|
||||||
# ---- 用户态/服务守护二进制(usr/bin,全部 chmod 755 静态 MIPS)----
|
# ---- 用户态/服务守护二进制(usr/bin,全部 chmod 755 静态 MIPS)----
|
||||||
patch_v2/bootmenu/meow_bootmenu|/usr/bin/meow_bootmenu|8bce6558cbc25faa8fbc105078003ef5|开机引导选单(MIPS32 musl 静态二进制):显示前读 settings.conf 的 display.brightness_min 写回面板;菜单超时/按键长按时序
|
patch_v2/bootmenu/meow_bootmenu|/usr/bin/meow_bootmenu|8bce6558cbc25faa8fbc105078003ef5|开机引导选单(MIPS32 musl 静态二进制):显示前按 settings.conf 的 display.brightness 设定面板亮度(下限取 display.brightness_min);菜单超时/按键长按时序
|
||||||
patch_v2/meow_launcherd/meow_launcherd|/usr/bin/meow_launcherd|e21450ff6621a67fd854165413c58be1|桌面/启动器主程序(MIPS32 musl 静态,链 SDK meow_ui.a):桌面与状态栏渲染、设置页(亮度/蓝牙/WiFi)、App 启动;包安装委托 /usr/bin/nyai
|
patch_v2/meow_launcherd/meow_launcherd|/usr/bin/meow_launcherd|e21450ff6621a67fd854165413c58be1|桌面/启动器主程序(MIPS32 musl 静态,链 SDK meow_ui.a):桌面与状态栏渲染、设置页(亮度/蓝牙/WiFi)、App 启动;包安装委托 /usr/bin/nyai
|
||||||
patch_v2/meow_watchdog/meow_watchdog|/usr/bin/meow_watchdog|37c57e0feb9cd220978bfd5deff75a1f|应用看门狗 M40:o32 time32 取时/睡眠(修 held 天文数字→单击误判长按)、电源阈值读 power.longpress_menu_ms/forceoff_ms(缺省 3000/8000,与 launcher 主屏统一);继承 M20 亮屏亮度按 settings 恢复(四支决策不再回退固定 60)
|
patch_v2/meow_watchdog/meow_watchdog|/usr/bin/meow_watchdog|37c57e0feb9cd220978bfd5deff75a1f|应用看门狗 M40:o32 time32 取时/睡眠(修 held 天文数字→单击误判长按)、电源阈值读 power.longpress_menu_ms/forceoff_ms(缺省 3000/8000,与 launcher 主屏统一);继承 M20 亮屏亮度按 settings 恢复(四支决策不再回退固定 60)
|
||||||
patch_v2/meow_svcd/meow_svcd|/usr/bin/meow_svcd|d2111094e458336b52f9e8d524e35a91|服务管理器 M2.77(+崩溃上报 meow_crash agent-187);M43 链 meow_time32(o32 time32 取时/睡眠,修 time64 ABI;重启退避/停止宽限恢复真实毫秒)
|
patch_v2/meow_svcd/meow_svcd|/usr/bin/meow_svcd|d2111094e458336b52f9e8d524e35a91|服务管理器 M2.77(+崩溃上报 meow_crash agent-187);M43 链 meow_time32(o32 time32 取时/睡眠,修 time64 ABI;重启退避/停止宽限恢复真实毫秒)
|
||||||
@@ -39,10 +39,10 @@ patch_v2/meow_verify/meow_verify|/usr/bin/meow_verify|6c2e8ed24aebe5caf41e7aed39
|
|||||||
patch_v2/meow_crash/meow_crash|/usr/bin/meow_crash|ce8aa8bede960844b4d50dfa9171a13b|系统级崩溃捕获 (agent-187) + log升级: 清理前缀扩 perf_/hang_ 承接1GB纪律 (337);M43 链 meow_time32(o32 time32 取时/睡眠,修 time64 ABI)
|
patch_v2/meow_crash/meow_crash|/usr/bin/meow_crash|ce8aa8bede960844b4d50dfa9171a13b|系统级崩溃捕获 (agent-187) + log升级: 清理前缀扩 perf_/hang_ 承接1GB纪律 (337);M43 链 meow_time32(o32 time32 取时/睡眠,修 time64 ABI)
|
||||||
patch_v2/meow_svc_perf/meow_svc_perf|/usr/bin/meow_svc_perf|44e2ff6f5666ef6509e63ab3e606bb33|性能专项服务 M2.75 + log升级(337:卡死快照+perf基线) + OOM治理C(348:Cached/Dirty监控降载, /tmp/meow_cachegov_c.state单点);M43 链 meow_time32(o32 time32 取时/睡眠,修 time64 ABI)
|
patch_v2/meow_svc_perf/meow_svc_perf|/usr/bin/meow_svc_perf|44e2ff6f5666ef6509e63ab3e606bb33|性能专项服务 M2.75 + log升级(337:卡死快照+perf基线) + OOM治理C(348:Cached/Dirty监控降载, /tmp/meow_cachegov_c.state单点);M43 链 meow_time32(o32 time32 取时/睡眠,修 time64 ABI)
|
||||||
patch_v2/meow_audiod/meow_audiod|/usr/bin/meow_audiod|9f58b2197ed91d24951918d41a78cf29|独占音频守护(MIPS32 glibc-2.22 动态链接:interpreter /lib/ld.so.1,NEEDED libasound.so.2 / libc.so.6 / libpthread.so.0):DAC 与蓝牙 A2DP 输出路由、硬件音量、电平监控
|
patch_v2/meow_audiod/meow_audiod|/usr/bin/meow_audiod|9f58b2197ed91d24951918d41a78cf29|独占音频守护(MIPS32 glibc-2.22 动态链接:interpreter /lib/ld.so.1,NEEDED libasound.so.2 / libc.so.6 / libpthread.so.0):DAC 与蓝牙 A2DP 输出路由、硬件音量、电平监控
|
||||||
patch_v2/meow_audiod/meow_audio|/usr/bin/meow_audio|3909c8d226d9da5afba4563056d105a5|audiod 用户侧 CLI(MIPS32 musl 静态):status/volume/monitor 等子命令,monitor 文本电平条
|
patch_v2/meow_audiod/meow_audio|/usr/bin/meow_audio|3909c8d226d9da5afba4563056d105a5|audiod 用户侧 CLI(MIPS32 musl 静态):status / tone / route(端口 0、2、3)/ vol 0-100 / output(dac 或 bt)/ monitor 子命令
|
||||||
patch_v2/meow_powermgr/meow_powermgr|/usr/bin/meow_powermgr|40217b5dc91da5c08d094c403eeb5fb2|功耗管理专项服务期2 M6.1(期1+history/top/events+mp2731 current_now 实测充电功率+WiFi 未关联档/BT rfkill 细化+系数路径 /data/meow/powermgr/;IPC 0xD0-D7);M43 链 meow_time32(o32 time32 取时/睡眠,修 time64 ABI)
|
patch_v2/meow_powermgr/meow_powermgr|/usr/bin/meow_powermgr|40217b5dc91da5c08d094c403eeb5fb2|功耗管理专项服务期2 M6.1(期1+history/top/events+mp2731 current_now 实测充电功率+WiFi 未关联档/BT rfkill 细化+系数路径 /data/meow/powermgr/;IPC 0xD0-D7);M43 链 meow_time32(o32 time32 取时/睡眠,修 time64 ABI)
|
||||||
patch_v2/meow_powermgr/meow_powermgr|/usr/bin/meow_power|40217b5dc91da5c08d094c403eeb5fb2|meow_powermgr 的 CLI 形态(同二进制双形态,argv[0]=meow_power 即 CLI:status/estimate/model/history/top/events,policy 期3桩);M43 链 meow_time32
|
patch_v2/meow_powermgr/meow_powermgr|/usr/bin/meow_power|40217b5dc91da5c08d094c403eeb5fb2|meow_powermgr 的 CLI 形态(同二进制双形态,argv[0]=meow_power 即 CLI:status/estimate/model/history/top/events,policy 期3桩);M43 链 meow_time32
|
||||||
patch_v2/meow_netmgrd/meow_netmgrd|/usr/bin/meow_netmgrd|e62e7512d8a71a83bbba6d7c0d5e4fee|网络管理守护(MIPS32 musl 静态):WiFi/以太网连接与扫描、DNS/路由/策略、蓝牙控制面(配对/连接/扫描/已配对列表);/usr/bin/meow_net 为同一二进制的 CLI 形态
|
patch_v2/meow_netmgrd/meow_netmgrd|/usr/bin/meow_netmgrd|e62e7512d8a71a83bbba6d7c0d5e4fee|网络管理守护(MIPS32 musl 静态):WiFi 扫描/连接(含隐藏网)、接口流量观测、DNS/路由/策略、蓝牙控制面(开关/扫描/配对/连接/已配对/A2DP);/usr/bin/meow_net 为同一二进制的 CLI 形态
|
||||||
patch_v2/meow_netmgrd/meow_netmgrd|/usr/bin/meow_net|e62e7512d8a71a83bbba6d7c0d5e4fee|meow_netmgrd 同一二进制的 CLI 形态(argv[0]=meow_net):status/iface/wifi/bt/rfkill/apps/conns/top/dns/policy 等子命令
|
patch_v2/meow_netmgrd/meow_netmgrd|/usr/bin/meow_net|e62e7512d8a71a83bbba6d7c0d5e4fee|meow_netmgrd 同一二进制的 CLI 形态(argv[0]=meow_net):status/iface/wifi/bt/rfkill/apps/conns/top/dns/policy 等子命令
|
||||||
patch_v2/ntpsync/meow_ntpsync|/usr/bin/meow_ntpsync|f3c3abe4a960560f59f4101e6c444722|网络校时 M22(复用固件自带 ntp-4.2.8p14 一次性 -q 校时 + hwclock -w -u 回写 RTC;自带看门狗/总超时/默认路由轮询/进程锁,不自常驻、不阻塞调用方;r1 修:trap 收尸 ntpd 子进程+孤儿收尸、日志不可写不再吞掉 hwclock、锁用 <pid> 子目录自证且只删自己的锁)
|
patch_v2/ntpsync/meow_ntpsync|/usr/bin/meow_ntpsync|f3c3abe4a960560f59f4101e6c444722|网络校时 M22(复用固件自带 ntp-4.2.8p14 一次性 -q 校时 + hwclock -w -u 回写 RTC;自带看门狗/总超时/默认路由轮询/进程锁,不自常驻、不阻塞调用方;r1 修:trap 收尸 ntpd 子进程+孤儿收尸、日志不可写不再吞掉 hwclock、锁用 <pid> 子目录自证且只删自己的锁)
|
||||||
|
|
||||||
|
|||||||
@@ -3,69 +3,118 @@
|
|||||||
#
|
#
|
||||||
# 为什么需要它:各组件自己的 build_*.sh 里仍散落着本机布局的默认路径
|
# 为什么需要它:各组件自己的 build_*.sh 里仍散落着本机布局的默认路径
|
||||||
# (`$HOME/Project/R3ProII/.tools/...`、`$HOME/.tools/mipsel-linux-muslsf-cross/...`),
|
# (`$HOME/Project/R3ProII/.tools/...`、`$HOME/.tools/mipsel-linux-muslsf-cross/...`),
|
||||||
# 在干净 checkout / git worktree 里直接跑会「找不到编译器」。本脚本不去改那些脚本,
|
# 在干净 checkout / git worktree 里直接跑会「找不到编译器」。本脚本**不改那些脚本**,
|
||||||
# 而是**在调用侧**把这些路径用环境变量与一个兼容 HOME 补齐:
|
# 而是在调用侧把这些路径补齐:造一个兼容 HOME,其中
|
||||||
|
# $COMPAT_HOME/Project/R3ProII/.tools -> 真 .tools(zig-mipsel-cc / muslsf sysroot)
|
||||||
|
# $COMPAT_HOME/Project/R3ProII/patch_v2 -> 本 checkout 的 patch_v2
|
||||||
|
# 于是历史硬编码路径落到当前 checkout 与真工具链,干净 worktree 也能直接编。
|
||||||
#
|
#
|
||||||
# $COMPAT_HOME/Project/R3ProII -> 本仓库根(脚本里的历史硬编码路径落到当前 checkout)
|
# 需要但不在 git 里的两件东西(都会被自动找/校验):
|
||||||
# $COMPAT_HOME/.tools -> 真 .tools(zig-mipsel-cc / muslsf 交叉 sysroot)
|
# patch_v2/sdk/meow_ui.a 被 .gitignore 忽略(launcherd 链它)。默认从**主 checkout** 取
|
||||||
|
# (git rev-parse --git-common-dir 的父目录,M50 在 build_audiod.sh 用同法);
|
||||||
|
# 在普通 checkout 里 == 本 checkout。取不到会报错并列出试过的路径。
|
||||||
|
# devdocs/fw-baseline/… audiod 链接用的设备 libasound.so.2 副本;build_audiod.sh 自己会回退主 checkout。
|
||||||
#
|
#
|
||||||
# 所有路径都可被环境变量覆盖:
|
# 环境变量覆盖:
|
||||||
# ZIGCC mipsel-musl 交叉编译器包装(默认 $HOME/.tools/zig-mipsel-cc)
|
# ZIGCC mipsel-musl 交叉编译器(单个命令词;默认 $HOME/.tools/zig-mipsel-cc)
|
||||||
# ZIG 裸 zig(audiod 守护目标用它做 glibc-2.22 动态链接;默认 PATH 里的 zig)
|
# ZIG 裸 zig(audiod 守护目标用;默认 PATH 里的 zig)
|
||||||
# MEOW_UI_A_SRC launcherd 需要的 SDK 静态库来源(默认主 checkout 的 patch_v2/sdk/meow_ui.a)
|
# MEOW_UI_A_SRC meow_ui.a 来源(默认主 checkout 的 patch_v2/sdk/meow_ui.a)
|
||||||
|
# MEOW_UI_A_MD5 期望的 meow_ui.a md5(默认 m51 批次的 cc0ed49b…;不符只告警不阻断)
|
||||||
|
# COMPAT_HOME 兼容 HOME 目录(默认 ${TMPDIR:-$HOME/tmp}/meow-build-home)
|
||||||
#
|
#
|
||||||
# 用法:
|
# 用法:
|
||||||
# bash scripts/build/rebuild_binaries.sh # 全部 5 组
|
# bash scripts/build/rebuild_binaries.sh # 全部 5 组
|
||||||
# bash scripts/build/rebuild_binaries.sh bootmenu # 只编一个(可多个)
|
# bash scripts/build/rebuild_binaries.sh bootmenu # 只编指定的(可多个)
|
||||||
# 组件名:bootmenu netmgrd audiod audio launcherd
|
# 组件名:bootmenu netmgrd audiod audio launcherd
|
||||||
#
|
set -u
|
||||||
# 前置:meow_audiod 守护目标需要设备 libasound.so.2 副本(build_audiod.sh 自动从
|
|
||||||
# devdocs/fw-baseline/ 或主 checkout 取);worktree 里没有这些未入库目录时,
|
|
||||||
# 不需要额外指定——build_audiod.sh 用 git-common-dir 回退到主 checkout 取固件树。
|
|
||||||
set -e
|
|
||||||
|
|
||||||
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
|
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
|
||||||
|
MEOW_UI_A_MD5="${MEOW_UI_A_MD5:-cc0ed49bdaa43a9867408b41b6311c28}"
|
||||||
|
|
||||||
|
die() { echo "!! $*" >&2; exit 1; }
|
||||||
|
|
||||||
|
# ---- 工具链:必须是「单个命令词」------------------------------------------------
|
||||||
|
# 组件脚本用 "$CC" 调用,把 "zig cc --target=..." 整串塞进变量会变成
|
||||||
|
# 「找不到名叫 zig cc --target=... 的命令」(exit 127)。M50 在 build_audiod.sh 里
|
||||||
|
# 用 CC + CC_EXTRA 修过同类 bug;这里显式挡住,并给出可执行的建议。
|
||||||
ZIGCC="${ZIGCC:-$HOME/.tools/zig-mipsel-cc}"
|
ZIGCC="${ZIGCC:-$HOME/.tools/zig-mipsel-cc}"
|
||||||
ZIG="${ZIG:-$(command -v zig || true)}"
|
ZIG="${ZIG:-$(command -v zig || true)}"
|
||||||
MEOW_UI_A_SRC="${MEOW_UI_A_SRC:-}"
|
case "$ZIGCC" in
|
||||||
|
*[[:space:]]*) die "ZIGCC 里不能带空格/参数:'$ZIGCC'
|
||||||
|
组件脚本按单个命令词调用它。请用包装脚本,或设 ZIGCC=$HOME/.tools/zig-mipsel-cc" ;;
|
||||||
|
esac
|
||||||
|
[ -x "$ZIGCC" ] || die "找不到可执行的交叉编译器 ZIGCC='$ZIGCC'
|
||||||
|
试过:\$ZIGCC、\$HOME/.tools/zig-mipsel-cc($HOME/.tools/zig-mipsel-cc)
|
||||||
|
覆盖方式:ZIGCC=/path/to/zig-mipsel-cc bash $0"
|
||||||
|
[ -n "$ZIG" ] && [ -x "$ZIG" ] || die "找不到 zig(audiod 守护目标需要它)
|
||||||
|
覆盖方式:ZIG=/path/to/zig bash $0"
|
||||||
|
|
||||||
[ -x "$ZIGCC" ] || { echo "!! ZIGCC 不可执行: $ZIGCC(用 ZIGCC=/path 覆盖)" >&2; exit 1; }
|
# ---- 主 checkout(worktree 里 meow_ui.a / devdocs/ / fw_apps/ 只在主 checkout)----
|
||||||
[ -n "$ZIG" ] && [ -x "$ZIG" ] || { echo "!! 找不到 zig(用 ZIG=/path 覆盖)" >&2; exit 1; }
|
# git rev-parse --git-common-dir 在 linked worktree 里给出**主仓库**的 .git 路径(绝对),
|
||||||
|
# 其父目录就是主 checkout 根;普通 checkout 下它给 ".git",拼到 $ROOT 后同理。
|
||||||
|
# (M50 在 build_audiod.sh 里用的就是这个口径:MAIN="$(cd "$_gcd/.." && pwd)")
|
||||||
|
MAIN="$ROOT"
|
||||||
|
_gcd="$(git -C "$ROOT" rev-parse --git-common-dir 2>/dev/null || true)"
|
||||||
|
if [ -n "$_gcd" ]; then
|
||||||
|
case "$_gcd" in /*) ;; *) _gcd="$ROOT/$_gcd" ;; esac
|
||||||
|
_m="$(cd "$_gcd/.." 2>/dev/null && pwd || true)"
|
||||||
|
[ -n "$_m" ] && [ -d "$_m/patch_v2" ] && MAIN="$_m"
|
||||||
|
fi
|
||||||
|
|
||||||
# launcherd 链的 SDK 静态库被 .gitignore 忽略,worktree 里没有 → 从主 checkout 取。
|
|
||||||
ensure_ui_a() {
|
ensure_ui_a() {
|
||||||
local dst="$ROOT/patch_v2/sdk/meow_ui.a"
|
local dst="$ROOT/patch_v2/sdk/meow_ui.a" got
|
||||||
[ -f "$dst" ] && { echo " meow_ui.a: $dst ($(md5sum "$dst" | cut -d' ' -f1))"; return 0; }
|
if [ -f "$dst" ]; then
|
||||||
local src="$MEOW_UI_A_SRC"
|
got="$(md5sum "$dst" | cut -d' ' -f1)"
|
||||||
if [ -z "$src" ]; then
|
echo " meow_ui.a: 已存在 $dst ($got)"
|
||||||
local main
|
else
|
||||||
main="$(git -C "$ROOT" rev-parse --git-common-dir 2>/dev/null || true)"
|
# 候选:显式 → 主 checkout → 主 checkout 的兄弟 worktree(历史产物,最后手段)
|
||||||
[ -n "$main" ] && main="$(cd "$ROOT/$(dirname "$main")/.." 2>/dev/null && pwd)/patch_v2/sdk/meow_ui.a"
|
local cands=() c
|
||||||
src="$main"
|
[ -n "${MEOW_UI_A_SRC:-}" ] && cands+=("$MEOW_UI_A_SRC")
|
||||||
|
cands+=("$MAIN/patch_v2/sdk/meow_ui.a")
|
||||||
|
for c in $(find "$MAIN/.tower/worktrees" -maxdepth 4 -name meow_ui.a 2>/dev/null); do
|
||||||
|
cands+=("$c")
|
||||||
|
done
|
||||||
|
local src="" tried=""
|
||||||
|
for c in "${cands[@]}"; do
|
||||||
|
if [ -f "$c" ] && [ "$(stat -c%s "$c")" -gt 10240 ]; then src="$c"; break; fi
|
||||||
|
tried="$tried
|
||||||
|
- $c"
|
||||||
|
done
|
||||||
|
[ -n "$src" ] || die "缺 patch_v2/sdk/meow_ui.a(launcherd 链的 SDK 静态库,被 .gitignore 忽略)。
|
||||||
|
试过这些路径:$tried
|
||||||
|
覆盖方式:MEOW_UI_A_SRC=/path/to/meow_ui.a bash $0"
|
||||||
|
cp "$src" "$dst"
|
||||||
|
echo " meow_ui.a: 复制 $src → $dst"
|
||||||
|
got="$(md5sum "$dst" | cut -d' ' -f1)"
|
||||||
|
fi
|
||||||
|
if [ "$got" != "$MEOW_UI_A_MD5" ]; then
|
||||||
|
echo " !! 注意:meow_ui.a md5=$got 与 m51 批次记录的 $MEOW_UI_A_MD5 不同。" >&2
|
||||||
|
echo " 编出的 meow_launcherd md5 会随之改变(launcherd 静态链入它)。" >&2
|
||||||
|
echo " 若这是有意的 SDK 重编,请同时重跑 rebuild 并用 verify_fingerprints.sh 自证。" >&2
|
||||||
|
else
|
||||||
|
echo " meow_ui.a md5 与 m51 批次记录一致($got)"
|
||||||
fi
|
fi
|
||||||
[ -n "$src" ] && [ -f "$src" ] || {
|
|
||||||
echo "!! 缺 patch_v2/sdk/meow_ui.a,且找不到来源;用 MEOW_UI_A_SRC=/path 指定" >&2
|
|
||||||
echo " (它由 patch_v2/sdk/build_sdk.sh 产出,被 .gitignore 忽略,不入库)" >&2
|
|
||||||
exit 1; }
|
|
||||||
cp "$src" "$dst"
|
|
||||||
echo " meow_ui.a: 复制 $src → $dst ($(md5sum "$dst" | cut -d' ' -f1))"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
# 兼容 HOME:历史脚本按 $HOME 拼路径,这里让那些路径解析到当前 checkout 与真工具链。
|
# ---- 兼容 HOME ----
|
||||||
COMPAT_HOME="${COMPAT_HOME:-${TMPDIR:-$HOME/tmp}/meow-build-home}"
|
COMPAT_HOME="${COMPAT_HOME:-${TMPDIR:-$HOME/tmp}/meow-build-home}"
|
||||||
mkdir -p "$COMPAT_HOME/Project"
|
PROJ="$COMPAT_HOME/Project/R3ProII"
|
||||||
ln -sfn "$ROOT" "$COMPAT_HOME/Project/R3ProII"
|
rm -rf "$PROJ"
|
||||||
ln -sfn "$HOME/.tools" "$COMPAT_HOME/.tools"
|
mkdir -p "$PROJ"
|
||||||
|
ln -sfn "$HOME/.tools" "$PROJ/.tools" # 历史脚本按 $HOME 拼 .tools
|
||||||
|
ln -sfn "$ROOT/patch_v2" "$PROJ/patch_v2" # 历史脚本按 $HOME 拼源码路径时也落到当前 checkout
|
||||||
|
|
||||||
run() { # run <组件> <工作目录> <命令...>
|
run() { # run <组件> <工作目录> <命令...>
|
||||||
local name="$1" dir="$2"; shift 2
|
local name="$1" dir="$2"; shift 2
|
||||||
echo "==> [$name] $*"
|
echo "==> [$name] $*"
|
||||||
( cd "$ROOT/$dir" && HOME="$COMPAT_HOME" ZIGCC="$ZIGCC" ZIG="$ZIG" \
|
( cd "$ROOT/$dir" && HOME="$COMPAT_HOME" ZIGCC="$ZIGCC" ZIG="$ZIG" \
|
||||||
ZIG_GLOBAL_CACHE_DIR="$HOME/.cache/zig" "$@" )
|
ZIG_GLOBAL_CACHE_DIR="$HOME/.cache/zig" "$@" ) \
|
||||||
|
|| die "[$name] 构建失败(见上面的编译器输出)"
|
||||||
}
|
}
|
||||||
|
|
||||||
report() { # report <产物路径>
|
report() {
|
||||||
local f="$ROOT/$1"
|
local f="$ROOT/$1"
|
||||||
|
[ -f "$f" ] || die "期望的产物不存在: $1"
|
||||||
printf ' %-44s %8s B %s\n' "$1" "$(stat -c%s "$f")" "$(md5sum "$f" | cut -d' ' -f1)"
|
printf ' %-44s %8s B %s\n' "$1" "$(stat -c%s "$f")" "$(md5sum "$f" | cut -d' ' -f1)"
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -78,11 +127,12 @@ for a in "$@"; do
|
|||||||
audiod) do_audiod=1 ;;
|
audiod) do_audiod=1 ;;
|
||||||
audio) do_audio=1 ;;
|
audio) do_audio=1 ;;
|
||||||
launcherd) do_launcherd=1 ;;
|
launcherd) do_launcherd=1 ;;
|
||||||
*) echo "!! 未知组件: $a(bootmenu netmgrd audiod audio launcherd)" >&2; exit 1 ;;
|
*) die "未知组件: $a(bootmenu netmgrd audiod audio launcherd)" ;;
|
||||||
esac
|
esac
|
||||||
done
|
done
|
||||||
|
|
||||||
echo "==> 重编批次(ROOT=$ROOT)"
|
echo "==> 重编批次(ROOT=$ROOT)"
|
||||||
|
echo " MAIN=$MAIN"
|
||||||
echo " ZIGCC=$ZIGCC"
|
echo " ZIGCC=$ZIGCC"
|
||||||
echo " ZIG=$ZIG ($("$ZIG" version 2>/dev/null || echo '?'))"
|
echo " ZIG=$ZIG ($("$ZIG" version 2>/dev/null || echo '?'))"
|
||||||
|
|
||||||
|
|||||||
@@ -1,16 +1,18 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
# verify_fingerprints.sh — 语义指纹自证(M51 批次产物)。
|
# verify_fingerprints.sh — 语义指纹自证(M51 批次产物)。
|
||||||
#
|
#
|
||||||
# 背景:仓内钉值的 md5 来自旧工具链时代,重编后**必然全变**,md5 不再是「产物含哪些源码改动」
|
# 背景:仓内钉值的 md5 来自不同时期的工具链/源码,重编后**必然全变**,md5 不再是
|
||||||
# 的证据。能证明产物语义的只有两样东西:二进制里的字符串/动态段(功能存在),以及反汇编里的
|
# 「产物含哪些源码改动」的证据。能证明产物语义的只有两样东西:二进制里的字符串/动态段
|
||||||
# time32 系统调用形态(4263 + 16 字节布局写回,见 patch_v2/sdk/test_time32_abi.sh)。
|
# (功能存在),以及反汇编里的 time32 系统调用形态(4263 + 16 字节布局写回,见
|
||||||
# 本脚本把这些判据固化下来,重编后跑一遍即可。
|
# patch_v2/sdk/test_time32_abi.sh)。本脚本把这些判据固化下来,重编后跑一遍即可。
|
||||||
#
|
#
|
||||||
# 用法:bash scripts/build/verify_fingerprints.sh
|
# 用法:
|
||||||
# 退出码:全部命中 0;任一条不命中最 1。
|
# bash scripts/build/verify_fingerprints.sh # 全量判据
|
||||||
|
# bash scripts/build/verify_fingerprints.sh --self-test # 自检:判据必须能 FAIL 也要能 PASS
|
||||||
|
# 退出码:全部命中 0;任一条不命中 1。
|
||||||
#
|
#
|
||||||
# 注意:中文串用 `grep -a -o -F` 直接数二进制里的字节序列,**不能**用 strings ——
|
# 注意:中文串用 `grep -a -o -F` 直接数二进制里的字节序列,**不能**用 strings ——
|
||||||
# strings 只输出可打印 ASCII 串,UTF-8 中文(每字节 ≥0x80)整段被跳过。
|
# strings 只输出可打印 ASCII 串,UTF-8 中文(每字节 ≥0x80)整段被跳过,会假阴。
|
||||||
set -u
|
set -u
|
||||||
|
|
||||||
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
|
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
|
||||||
@@ -21,10 +23,10 @@ AU="$ROOT/patch_v2/meow_audiod/meow_audio"
|
|||||||
LC="$ROOT/patch_v2/meow_launcherd/meow_launcherd"
|
LC="$ROOT/patch_v2/meow_launcherd/meow_launcherd"
|
||||||
|
|
||||||
PASS=0; FAIL=0
|
PASS=0; FAIL=0
|
||||||
ok() { PASS=$((PASS+1)); printf ' PASS %s\n' "$1"; }
|
ok() { PASS=$((PASS+1)); printf ' PASS %s\n' "$1"; return 0; }
|
||||||
bad() { FAIL=$((FAIL+1)); printf ' FAIL %s\n' "$1"; }
|
bad() { FAIL=$((FAIL+1)); printf ' FAIL %s\n' "$1"; return 1; }
|
||||||
|
|
||||||
# cnt <file> <literal>:二进制里该字面量的出现次数
|
# cnt <file> <literal>:二进制里该字面量的出现次数(按字节,含 UTF-8)
|
||||||
cnt() { grep -a -o -F -- "$2" "$1" 2>/dev/null | wc -l; }
|
cnt() { grep -a -o -F -- "$2" "$1" 2>/dev/null | wc -l; }
|
||||||
|
|
||||||
# eq <name> <file> <literal> <期望次数>
|
# eq <name> <file> <literal> <期望次数>
|
||||||
@@ -38,6 +40,35 @@ ge() {
|
|||||||
if [ "$got" -ge "$4" ]; then ok "$1: '$3' = $got (>= $4)"; else bad "$1: '$3' = $got(期望 >= $4)"; fi
|
if [ "$got" -ge "$4" ]; then ok "$1: '$3' = $got (>= $4)"; else bad "$1: '$3' = $got(期望 >= $4)"; fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
# 自检:判据必须是「有内容」的 —— 对不存在的串要 FAIL,对存在的中文串要 PASS,
|
||||||
|
# 对改一个字的中文串要 FAIL。任何一条不成立说明判据本身坏了(例如退回用 strings)。
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
self_test() {
|
||||||
|
local rc=0 n
|
||||||
|
echo "==> 自检:判据可 FAIL(不存在的 ASCII 串)"
|
||||||
|
if ( eq SELFTEST "$LC" '__m51_no_such_string__' 1 >/dev/null 2>&1 ); then
|
||||||
|
echo " FAIL 不存在的串竟判 PASS —— 判据恒真"; rc=1
|
||||||
|
else
|
||||||
|
echo " PASS 不存在的串判 FAIL(判据不是恒真)"
|
||||||
|
fi
|
||||||
|
echo "==> 自检:判据可 PASS(存在的中文串,证明 -a -F 对 UTF-8 有效)"
|
||||||
|
n=$(cnt "$LC" '蓝牙状态未知')
|
||||||
|
if [ "$n" -ge 1 ]; then echo " PASS '蓝牙状态未知' 命中 $n 次"; else echo " FAIL 存在的中文串反而 0 命中"; rc=1; fi
|
||||||
|
echo "==> 自检:中文串改一个字必须 0 命中(不是子串误匹配)"
|
||||||
|
if ( eq SELFTEST "$LC" '蓝牙状态未如' 1 >/dev/null 2>&1 ); then
|
||||||
|
echo " FAIL 改字后竟判 PASS"; rc=1
|
||||||
|
else
|
||||||
|
echo " PASS 改字后判 FAIL"
|
||||||
|
fi
|
||||||
|
return $rc
|
||||||
|
}
|
||||||
|
|
||||||
|
if [ "${1:-}" = "--self-test" ]; then
|
||||||
|
self_test || { echo "!! 自检失败"; exit 1; }
|
||||||
|
echo "==> 自检全部通过"; exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
echo "==> meow_bootmenu(亮度单一权威源 + time32)"
|
echo "==> meow_bootmenu(亮度单一权威源 + time32)"
|
||||||
eq bootmenu "$BM" 'display.brightness_min' 1
|
eq bootmenu "$BM" 'display.brightness_min' 1
|
||||||
eq bootmenu "$BM" '0.1.0-m2.30-bri-src' 1
|
eq bootmenu "$BM" '0.1.0-m2.30-bri-src' 1
|
||||||
@@ -82,7 +113,13 @@ for s in '正在%s…(等待设备确认)' '无法确认当前状态(上
|
|||||||
done
|
done
|
||||||
|
|
||||||
echo "==> time32 二进制判据(4263 + 16B 布局写回;audiod 守护例外见 build_audiod.sh)"
|
echo "==> time32 二进制判据(4263 + 16B 布局写回;audiod 守护例外见 build_audiod.sh)"
|
||||||
bash "$ROOT/patch_v2/sdk/test_time32_abi.sh" --no-builds "$BM" "$NM" "$AU" "$LC"
|
# 门禁的退出码必须进 FAIL —— 否则「门禁失败但脚本宣布 ALL PASS」比没有门禁更危险。
|
||||||
|
GATE="$ROOT/patch_v2/sdk/test_time32_abi.sh"
|
||||||
|
if [ ! -f "$GATE" ]; then
|
||||||
|
bad "time32 门禁脚本缺失:$GATE"
|
||||||
|
elif ! bash "$GATE" --no-builds "$BM" "$NM" "$AU" "$LC"; then
|
||||||
|
bad "time32 二进制门禁 FAIL(4263 / 16B 布局写回)"
|
||||||
|
fi
|
||||||
|
|
||||||
echo "==> 汇总:fingerprints PASS=$PASS FAIL=$FAIL"
|
echo "==> 汇总:fingerprints PASS=$PASS FAIL=$FAIL"
|
||||||
[ "$FAIL" -eq 0 ] || exit 1
|
[ "$FAIL" -eq 0 ] || exit 1
|
||||||
|
|||||||
Reference in new issue
Block a user