From 8be4634a615821993a0e2909317afac00da88837 Mon Sep 17 00:00:00 2001 From: AskaEth Date: Wed, 4 Nov 2026 20:18:15 +0800 Subject: [PATCH] =?UTF-8?q?feat(sdk):=20=E6=9C=AC=E6=9C=BA=20zig=20?= =?UTF-8?q?=E4=BA=A4=E5=8F=89=E9=93=BE=E8=B7=91=E9=80=9A=20build=5Fsdk.sh?= =?UTF-8?q?=20=E2=80=94=20=E6=96=B0=E5=A2=9E=20build=5Fsdk=5Fhost.sh=20?= =?UTF-8?q?=E7=8E=AF=E5=A2=83=E9=80=82=E9=85=8D+=E6=88=90=E5=91=98/?= =?UTF-8?q?=E6=9E=B6=E6=9E=84=E8=87=AA=E6=A3=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 主仓 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 仅本脚本 --- patch_v2/sdk/build_sdk_host.sh | 93 ++++++++++++++++++++++++++++++++++ 1 file changed, 93 insertions(+) create mode 100755 patch_v2/sdk/build_sdk_host.sh diff --git a/patch_v2/sdk/build_sdk_host.sh b/patch_v2/sdk/build_sdk_host.sh new file mode 100755 index 0000000..16a9b55 --- /dev/null +++ b/patch_v2/sdk/build_sdk_host.sh @@ -0,0 +1,93 @@ +#!/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=)" >&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