fix(devkit): M24 r1 评审 — P1 --with-sources 静默漏源码 + time64 归因更正
P1(阻断):stamp 命中时 main 提前 return,--with-sources 在 return 之后,
于是「先构建再 --with-sources」会打印成功、退出码 0、却不产出 src/。
- 把源码整理抽成 stage_sources(),stamp 命中路径先兑现 WITH_SOURCES 再返回;
整理后按钉住的 sha256 复核(sha 漂移/缺文件都重铺),任何失败即非零退出
- 新增 test_build_devkit.sh(12 项,秒级):stamp 命中下的 --with-sources、
src 缺文件/被改坏的自愈、--verify-only 的 MANIFEST 篡改检测
- skip 条件额外要求 MANIFEST 与 bin 逐条 sha 一致;--clean 同时清 out/src;
全新构建未带 --with-sources 时删除上次残留 src/(避免源码与二进制错配)
P2-a:top 排除理由改写。根因是 zig 0.17 musl 的 time64 ABI 错配(mips o32 是
ILP32 + 内核 4.4 无 time64 syscall,16B timespec 直传 32 位 syscall),不是
procps 的 bug;top 的 Mem 一栏是「百分比/总容量」不是 used GiB。新增 DEVKIT.md
§9 记录证据(vmstat -t 空列、usleep(0.5s)×10 实测 0s、sleep(1) 正常、ps lstart
正常),并说明 M16 的 patch_v2/sdk/meow_ui_time.c 可复用(本轮实测该 .o 独立
编译、仅 5 个 libc 未定义符号)但本轮不接入的取舍——需要单独 mission 做链接期
接管 + 全量回归,不是 -D 能修的。
P2-b:--with-sources 现在同时放 build_devkit.sh + DEVKIT.md(GPLv2 §3 的
"scripts used to control compilation");补 LGPL-2.1 §6 静态链接 libproc2 的
义务说明;MANIFEST/README.txt 写明 src/ 与 licenses/。
P2-c:lsof 内嵌 Termux musl 的 resolv.conf 路径记为工具链副作用(实测
lsof -i 约 3s 超时、-nP 瞬时;端口名/本机名不受影响),不换工具链。
P3:软链路径写实(/bin/ps、/usr/bin/{free,lsof,top});MANIFEST 用 zig version
而非 clang 版本;chmod 措辞改成检查挂载参数;--verify-only 增加 MANIFEST 逐条
sha256/体积比对且不再依赖 date;stamp 纳入 zig 完整版本;许可证复制失败即报错。
验证:test_build_devkit.sh 12/12 通过;--verify-only 通过(含 MANIFEST 对账);
独立工作区离线重建 85s/0 下载,六个二进制 sha256 与上一版逐字节一致;设备侧
二进制未变(sha 与 r1 真机验证过的一致)。
This commit is contained in:
1 parent
b52e6a08bc
commit
0531603779
4 files changed
+431
-143
No files matched your search
Executable
+93
@@ -0,0 +1,93 @@
|
||||
#!/bin/bash
|
||||
# ============================================================================
|
||||
# test_build_devkit.sh — build_devkit.sh 的回归测试(不重编,秒级)
|
||||
#
|
||||
# 针对 r1 评审 P1 的回归点:**stamp 命中(跳过编译)时,--with-sources 必须
|
||||
# 真正产出 src/,不能静默成功**。另覆盖 --verify-only 的 MANIFEST 漂移检测。
|
||||
#
|
||||
# 前置:MEOW_DEVKIT_WORK 里已有一次构建(脚本会先跑一次增量构建,命中则秒回;
|
||||
# 缓存缺失时会联网下载/编译,第一次运行约 1 分钟)。
|
||||
#
|
||||
# 用法:bash scripts/build/test_build_devkit.sh [-v]
|
||||
# 退出码 0 = 全过;非 0 = 用例失败数。
|
||||
# ============================================================================
|
||||
set -u
|
||||
|
||||
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
|
||||
SCRIPT="$ROOT/scripts/build/build_devkit.sh"
|
||||
export MEOW_DEVKIT_WORK="${MEOW_DEVKIT_WORK:-$HOME/.cache/meow-devkit}"
|
||||
OUT="$ROOT/fw_apps/devkit"
|
||||
TMP="$MEOW_DEVKIT_WORK/test-tmp"
|
||||
|
||||
VERBOSE=0
|
||||
[ "${1:-}" = "-v" ] && VERBOSE=1
|
||||
|
||||
PASS=0
|
||||
FAILN=0
|
||||
pass() { PASS=$((PASS + 1)); printf 'PASS %s\n' "$*"; }
|
||||
fail() { FAILN=$((FAILN + 1)); printf 'FAIL %s\n' "$*"; }
|
||||
run() { # run <说明> <命令...>
|
||||
local desc="$1"; shift
|
||||
local log="$TMP/last.log"
|
||||
if "$@" >"$log" 2>&1; then
|
||||
[ "$VERBOSE" = 1 ] && sed 's/^/ | /' "$log"
|
||||
return 0
|
||||
fi
|
||||
printf ' 命令失败: %s\n' "$*"
|
||||
sed 's/^/ | /' "$log" | tail -20
|
||||
return 1
|
||||
}
|
||||
|
||||
mkdir -p "$TMP"
|
||||
# 无论成败都恢复现场,别把测试的破坏留在产物目录里
|
||||
restore() {
|
||||
[ -f "$TMP/MANIFEST.txt.bak" ] && cp "$TMP/MANIFEST.txt.bak" "$OUT/MANIFEST.txt"
|
||||
rm -rf "$TMP"
|
||||
}
|
||||
trap restore EXIT
|
||||
|
||||
echo "== 0) 确保基线构建(幂等;已构建则秒回)"
|
||||
run "基线构建" bash "$SCRIPT" || { echo "!!! 基线构建失败,后续用例无意义"; exit 1; }
|
||||
pass "基线构建"
|
||||
|
||||
echo "== 1) P1 回归:stamp 命中 + --with-sources 必须产出 src/"
|
||||
rm -rf "$OUT/src"
|
||||
run "普通重跑(应命中 stamp 且不建 src/)" bash "$SCRIPT" || fail "T1a 普通重跑"
|
||||
[ ! -d "$OUT/src" ] && pass "T1a 普通重跑不创建 src/(符合预期)" || fail "T1a 普通重跑意外创建了 src/"
|
||||
run "--with-sources(stamp 命中路径)" bash "$SCRIPT" --with-sources || fail "T1b --with-sources 退出码非 0"
|
||||
for f in ncurses-6.5.tar.gz procps-ng-4.0.4.tar.xz lsof-4.99.4.tar.xz build_devkit.sh DEVKIT.md; do
|
||||
[ -s "$OUT/src/$f" ] && pass "T1b src/$f 存在且非空" || fail "T1b 缺 src/$f(P1 未修好)"
|
||||
done
|
||||
|
||||
echo "== 2) 缺文件自愈:删掉构建脚本后再 --with-sources"
|
||||
rm -f "$OUT/src/build_devkit.sh"
|
||||
run "--with-sources 补齐" bash "$SCRIPT" --with-sources || fail "T2 --with-sources 退出码非 0"
|
||||
[ -s "$OUT/src/build_devkit.sh" ] && pass "T2 src/build_devkit.sh 被补回" || fail "T2 未补回 src/build_devkit.sh"
|
||||
|
||||
echo "== 3) 内容漂移自愈:把 src 里的源码包改坏"
|
||||
printf 'tamper\n' >> "$OUT/src/ncurses-6.5.tar.gz"
|
||||
run "--with-sources 重铺" bash "$SCRIPT" --with-sources || fail "T3 --with-sources 退出码非 0"
|
||||
if cmp -s "$OUT/src/ncurses-6.5.tar.gz" "$MEOW_DEVKIT_WORK/src/ncurses-6.5.tar.gz"; then
|
||||
pass "T3 被改坏的源码包已恢复成钉住版本"
|
||||
else
|
||||
fail "T3 源码包未恢复"
|
||||
fi
|
||||
|
||||
echo "== 4) --verify-only:正常通过"
|
||||
run "--verify-only" bash "$SCRIPT" --verify-only && pass "T4a --verify-only 通过" || fail "T4a --verify-only 失败"
|
||||
|
||||
echo "== 5) --verify-only:能查出 MANIFEST 内容漂移"
|
||||
cp "$OUT/MANIFEST.txt" "$TMP/MANIFEST.txt.bak"
|
||||
awk 'BEGIN{done=0} { if (!done && $1=="vmstat") { $NF="0000000000000000000000000000000000000000000000000000000000000000"; done=1 } print }' \
|
||||
"$TMP/MANIFEST.txt.bak" > "$OUT/MANIFEST.txt"
|
||||
if run "--verify-only(MANIFEST 被篡改)" bash "$SCRIPT" --verify-only; then
|
||||
fail "T5 --verify-only 未发现 MANIFEST sha 被篡改"
|
||||
else
|
||||
pass "T5 --verify-only 正确拒绝被篡改的 MANIFEST"
|
||||
fi
|
||||
cp "$TMP/MANIFEST.txt.bak" "$OUT/MANIFEST.txt"
|
||||
run "--verify-only(恢复后)" bash "$SCRIPT" --verify-only && pass "T5b 恢复后重新通过" || fail "T5b 恢复后仍失败"
|
||||
|
||||
echo
|
||||
printf '== 结果: %d 通过, %d 失败\n' "$PASS" "$FAILN"
|
||||
[ "$FAILN" = 0 ]
|
||||
Reference in new issue
Block a user