Files
MeowOS-For-R3P2/patch_v2/sdk/build_sdk_host.sh
T
AskaEth 8be4634a61 feat(sdk): 本机 zig 交叉链跑通 build_sdk.sh — 新增 build_sdk_host.sh 环境适配+成员/架构自检
主仓 patch_v2/sdk/build_sdk.sh 此前只在 SDK 仓验证过:硬编码 ROOT="$HOME/Project/R3ProII"
取 .tools/zig-mipsel-cc 与 patch_v2/meow_launcherd/meow_font.a,默认 AR=/usr/bin/ar、
mktemp 落 /tmp。Termux 上三者都不成立(工具链在 ~/.tools、meow_font.a 在仓库内且 *.a 被
gitignore、ar 在 $PREFIX/bin、/tmp 不可写),脚本无法直接跑通。

- build_sdk_host.sh: 不改 build_sdk.sh,临时布局同构 $HOME(.tools 与 patch_v2/
  meow_launcherd 符号链接到真实位置),导出 AR/TMPDIR 后原样执行脚本;--verify 追加
  「成员清单 = 本次 *.o(OBJS + meow_font.o)+ libfreetype.a 对象」比对与全量架构校验
  (不复制 OBJS 列表,避免与 build_sdk.sh 漂移)
- FreeType 2.14.3 源: SDK_FREETYPE_SRC 指向本地源优先;未设且无 vendor 时仍走 savannah 下载
- 验证: 冷构建(zig cache 空) 55s,重编 11-14s;meow_ui.a 5,701,866B / 75 成员
  (OBJS 31 + meow_font.o + freetype 43),全 ELF32 MIPS32 rel2 o32;hello_app 按文档链路
  meow_ui.a + libz.a + -lpthread 链接成功(474,612B 静态 MIPS32r2),不调 meow_ft_* 时
  freetype 成员未被拉入(零增量成立)
- 产物不入库: vendor/、*.a、*.o 均被 .gitignore 覆盖,git status 仅本脚本
2026-11-04 20:25:54 +08:00

94 lines
4.1 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/bin/bash
# build_sdk_host.sh — 在 Termux / 本机(非容器)跑通 build_sdk.sh 的环境适配层。
#
# build_sdk.sh 硬编码 ROOT="$HOME/Project/R3ProII"(从该路径取 .tools/zig-mipsel-cc 与
# patch_v2/meow_launcherd/meow_font.a),并默认 AR=/usr/bin/ar、mktemp 落 /tmp。
# Termux 上三者都不成立:工具链在 ~/.tools,meow_font.a 在仓库内,ar 在 $PREFIX/bin,
# /tmp 不可写。本脚本不改 build_sdk.sh,而是临时布局一个同构 $HOME(.tools 与
# patch_v2/meow_launcherd 用符号链接指向真实位置),再导出 AR/TMPDIR 后原样执行。
#
# 依赖(均不入库):
# ~/.tools/zig-mipsel-cc zig 包装(--target=mipsel-linux-musleabi)
# patch_v2/meow_launcherd/meow_font.a 字库静态库(*.a 被 gitignore,由 launcher 构建产出)
# FreeType 2.14.3 源码:设 SDK_FREETYPE_SRC=<本地源目录> 直接用本地源;
# 不设且 vendor/freetype-src 不存在时由 build_sdk.sh 走 savannah 下载。
#
# 用法:
# bash patch_v2/sdk/build_sdk_host.sh # 构建 meow_ui.a
# bash patch_v2/sdk/build_sdk_host.sh --verify # 构建后校验成员清单与 MIPS32r2
#
# 本机(OnePlus 15 / Termux, zig 0.17.0)2026-11-04 实测:31 个 OBJS + meow_font.o +
# 43 个 freetype 对象 = 75 成员,全 MIPS32 rel2 / o32;meow_ui.a 5.4MB,冷构建约 55s;
# hello_app 按文档链路(meow_ui.a + libz.a + -lpthread)链接成功且未拉入 freetype 成员。
set -e
SDK_DIR="$(cd "$(dirname "$0")" && pwd)"
REPO_ROOT="$(cd "$SDK_DIR/../.." && pwd)"
ZIGCC="${ZIGCC:-$HOME/.tools/zig-mipsel-cc}"
LAUNCHER_DIR="${LAUNCHER_DIR:-$REPO_ROOT/patch_v2/meow_launcherd}"
WORK="${SDK_HOST_WORK:-$HOME/.cache/meow-sdk-build}"
usage() {
sed -n '2,22p' "$0" | sed 's/^# \{0,1\}//'
}
MODE=build
case "${1:-}" in
"") ;;
--verify) MODE=verify ;;
-h|--help) usage; exit 0 ;;
*) echo "未知参数: $1(只支持 --verify)" >&2; exit 2 ;;
esac
[ -x "$ZIGCC" ] || { echo "缺少交叉编译器: $ZIGCC(可用 ZIGCC=... 覆盖)" >&2; exit 1; }
[ -f "$LAUNCHER_DIR/meow_font.a" ] || {
echo "缺少 $LAUNCHER_DIR/meow_font.a(*.a 被 gitignore,需先构建 launcher 或从备份取回)" >&2
exit 1
}
AR_BIN="${AR:-$(command -v ar || true)}"
[ -n "$AR_BIN" ] || { echo "找不到 ar(可 export AR=<path>)" >&2; exit 1; }
# 同构 $HOME:$ROOT/.tools/zig-mipsel-cc、$ROOT/patch_v2/meow_launcherd(含 meow_font.a)
HOMELAYOUT="$WORK/home"
mkdir -p "$HOMELAYOUT/Project/R3ProII/.tools" "$HOMELAYOUT/Project/R3ProII/patch_v2" "$WORK/tmp"
ln -sfn "$ZIGCC" "$HOMELAYOUT/Project/R3ProII/.tools/zig-mipsel-cc"
ln -sfn "$LAUNCHER_DIR" "$HOMELAYOUT/Project/R3ProII/patch_v2/meow_launcherd"
# Termux 的 /tmp 不可写;ar 是 $PREFIX/bin/ar 而非 /usr/bin/ar
export TMPDIR="$WORK/tmp"
export AR="$AR_BIN"
export HOME="$HOMELAYOUT"
echo "== build_sdk.sh(ROOT=$HOMELAYOUT/Project/R3ProII, AR=$AR, TMPDIR=$TMPDIR)=="
( cd "$SDK_DIR" && bash build_sdk.sh )
[ "$MODE" = verify ] || exit 0
# ---- 校验:成员清单 = 本次编译的 *.o(OBJS + meow_font.o)+ freetype 对象,且全 MIPS32r2 ----
cd "$SDK_DIR"
FT_LIB="vendor/freetype-build/libfreetype.a"
[ -f "$FT_LIB" ] || { echo "缺少 $FT_LIB(FreeType 构建未完成)" >&2; exit 1; }
ACTUAL="$TMPDIR/verify-actual.txt"
EXPECTED="$TMPDIR/verify-expected.txt"
"$AR" t meow_ui.a | sort > "$ACTUAL"
{ for f in *.o; do echo "$f"; done; "$AR" t "$FT_LIB"; } | sort > "$EXPECTED"
if ! diff -u "$EXPECTED" "$ACTUAL"; then
echo "成员清单不匹配(左=期望,右=meow_ui.a)" >&2
exit 1
fi
echo "== 成员清单一致:$(wc -l < "$ACTUAL") 个(OBJS $(ls *.o | grep -vc meow_font) + meow_font.o + freetype $(ar t "$FT_LIB" | wc -l))=="
OBJ_DIR="$TMPDIR/verify-obj"
rm -rf "$OBJ_DIR"; mkdir -p "$OBJ_DIR"
( cd "$OBJ_DIR" && "$AR" x "$SDK_DIR/meow_ui.a" )
BAD="$(file "$OBJ_DIR"/*.o | grep -v 'MIPS, MIPS32 rel2' || true)"
if [ -n "$BAD" ]; then
echo "以下对象不是 MIPS32r2:" >&2
echo "$BAD" >&2
exit 1
fi
echo "== 架构校验通过:$(ls "$OBJ_DIR"/*.o | wc -l) 个对象全为 ELF32 MIPS32 rel2(o32)=="
ls -la meow_ui.a