Files
MeowOS-For-R3P2/patch_v2/ncm_app/build_ncm_cross_host.sh
T
AskaEth 7d4906828d build(ncm): 宿主交叉适配层 + 全量测试补跑(M8)
- 新增 build_ncm_cross_host.sh:同构 HOME 复用容器脚本,串起 sdk/vendor/host-mbedtls/core/tests/ncm
- libs_common.sh 工具链路径改为 MEOW_R3PROII_ROOT/$HOME 可覆盖,容器默认不变
- build_mbedtls.sh 递归清理 library/ 与 3rdparty/ 旧对象,修宿主/mipsel 混架构归档
- test_ncm_core.c 改用 $TMPDIR,Termux /tmp 不可写不再导致 store/cache/tag 用例失败
- REPORT §40:构建/测试/热更结果(ncm md5 1bbd2a55…,Music du 前后恒定)
2026-11-05 11:34:45 +08:00

150 lines
5.8 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_ncm_cross_host.sh — 在 Termux/本机(非容器)跑通 ncm 的容器交叉链路。
#
# 原构建脚本假定容器布局:build_ncm.sh 用 $HOME/Project/R3ProII/.tools 与
# .tools/mipsel-linux-muslsf-cross/mipsel-linux-muslsf(libz.a);libs_common.sh 指向
# /home/Aska/...;build_sdk.sh 从 meow_launcherd 取 meow_font.a。本脚本不改这些脚本,
# 而是临时布局一个同构 $HOME(符号链接到本机真实工具链/仓库),再原样执行:
# 1) .tools/zig-mipsel-cc -> ~/.tools/zig-mipsel-cc
# 2) .tools/mipsel-linux-muslsf-cross/mipsel-linux-muslsf
# -> ~/.tools/mipsel-linux-musleabi-sysroot(含 lib/libz.a)
# 3) .tools/zig-env/bin/zig -> 包装器:`zig ar` 转系统 GNU ar(架构无关)
# 4) launcher 镜像目录:仓库 meow_launcherd 头文件 + 取回的 meow_font.a(*.a 不入库)
#
# 依赖(均不入库):
# ~/.tools/zig-mipsel-cc
# ~/.tools/mipsel-linux-musleabi-sysroot
# patch_v2/sdk/vendor/freetype-src FreeType 2.14.3 源
# patch_v2/ncm_app/vendor/{mbedtls,jsmn,minimp3,qrcodegen,dr_flac}
# meow_font.a:默认找 patch_v2/meow_launcherd/meow_font.a,否则 <WORK>/launcher/meow_font.a
#
# 用法:
# bash patch_v2/ncm_app/build_ncm_cross_host.sh [all|prep|sdk|vendor|host-mbedtls|core|tests|ncm]
# 缺省 all;各步日志写 <WORK>/logs/<step>.log(WORK 默认 ~/.cache/meow-ncm-build)。
set -e
SELF_DIR="$(cd "$(dirname "$0")" && pwd)"
REPO_ROOT="$(cd "$SELF_DIR/../.." && pwd)"
WORK="${NCM_CROSS_WORK:-$HOME/.cache/meow-ncm-build}"
LOGS="$WORK/logs"
HOMELAYOUT="$WORK/home"
PROJ="$HOMELAYOUT/Project/R3ProII"
TOOLS="${MEOW_TOOLS_DIR:-$HOME/.tools}"
SYSROOT="${MEOW_SYSROOT:-$TOOLS/mipsel-linux-musleabi-sysroot}"
FONT_A="${MEOW_FONT_A:-$REPO_ROOT/patch_v2/meow_launcherd/meow_font.a}"
usage() { sed -n '2,26p' "$0" | sed 's/^# \{0,1\}//'; }
prep() {
mkdir -p "$PROJ/.tools/mipsel-linux-muslsf-cross" "$PROJ/.tools/zig-env/bin" "$LOGS" "$WORK/tmp"
ln -sfn "$TOOLS/zig-mipsel-cc" "$PROJ/.tools/zig-mipsel-cc"
ln -sfn "$SYSROOT" "$PROJ/.tools/mipsel-linux-muslsf-cross/mipsel-linux-muslsf"
cat > "$PROJ/.tools/zig-env/bin/zig" <<'EOF'
#!/bin/sh
[ "$1" = ar ] && shift
exec ar "$@"
EOF
chmod +x "$PROJ/.tools/zig-env/bin/zig"
mkdir -p "$WORK/launcher-mirror"
for f in "$REPO_ROOT"/patch_v2/meow_launcherd/*; do
b="$(basename "$f")"
[ "$b" = meow_font.a ] && continue
ln -sfn "$f" "$WORK/launcher-mirror/$b"
done
if [ -f "$FONT_A" ]; then
ln -sfn "$FONT_A" "$WORK/launcher-mirror/meow_font.a"
elif [ -f "$WORK/launcher/meow_font.a" ]; then
ln -sfn "$WORK/launcher/meow_font.a" "$WORK/launcher-mirror/meow_font.a"
else
echo "缺少 meow_font.a(放 patch_v2/meow_launcherd/ 或 $WORK/launcher/,或设 MEOW_FONT_A)" >&2
exit 1
fi
[ -x "$PROJ/.tools/zig-mipsel-cc" ] || { echo "缺少交叉编译器: $TOOLS/zig-mipsel-cc" >&2; exit 1; }
[ -f "$PROJ/.tools/mipsel-linux-muslsf-cross/mipsel-linux-muslsf/lib/libz.a" ] || {
echo "缺少 sysroot libz.a: $SYSROOT/lib/libz.a" >&2; exit 1; }
echo "== prep OK:$HOMELAYOUT =="
}
# 各步共用:同构 HOME + 显式 CC/AR(libs_common.sh 支持覆盖)+ Termux 可写 TMPDIR
export HOME="$HOMELAYOUT"
export CC_MIPS="$PROJ/.tools/zig-mipsel-cc"
export AR_MIPS="$(command -v ar)"
export TMPDIR="$WORK/tmp"
run() {
local name="$1"; shift
echo "== [$name] $*"
set +e
( "$@" ) 2>&1 | tee "$LOGS/$name.log"
local rc=${PIPESTATUS[0]}
set -e
[ "$rc" -eq 0 ] || { echo "[FAIL] $name rc=$rc(日志 $LOGS/$name.log)" >&2; exit "$rc"; }
}
step_sdk() {
run sdk env LAUNCHER_DIR="$WORK/launcher-mirror" bash "$REPO_ROOT/patch_v2/sdk/build_sdk_host.sh" --verify
}
step_vendor() {
cd "$SELF_DIR"
run vendor bash ./build_mbedtls.sh
}
# 宿主 mbedtls:复用 vendor 步骤已裁剪并应用的 config,gcc 重编同一套库给宿主测试。
step_host_mbedtls() {
local MB="$SELF_DIR/vendor/mbedtls" BM="$SELF_DIR/out/mbedtls/host"
[ -f "$MB/include/mbedtls/mbedtls_config.h" ] || { echo "先跑 vendor 步骤(config 未就绪)" >&2; exit 1; }
# everest/ p256-m 的对象在 3rdparty/ 下(library/ 里只有 *.c 引子);只删 library/*.o 会留下
# 上一轮的 mipsel 对象,归档后与宿主对象混架构(ld: incompatible with aarch64linux)。
find "$MB/library" "$MB/3rdparty" -name '*.o' -delete
find "$MB/library" "$MB/3rdparty" -name '*.a' -delete
rm -rf "$BM"; mkdir -p "$BM"
run host-mbedtls make -C "$MB" lib CC=gcc AR=ar \
CFLAGS="-O2 -Wno-unused-parameter -fno-stack-protector"
for a in libmbedcrypto.a libmbedx509.a libmbedtls.a; do
[ -s "$MB/library/$a" ] && cp "$MB/library/$a" "$BM/$a"
done
ls -la "$BM"
}
step_core() {
cd "$SELF_DIR"
run core bash ./build_core.sh
local DATA="$WORK/ncm_test"
rm -rf "$DATA"; mkdir -p "$DATA"
run core-test ./test/test_ncm_core_host "$DATA"
}
step_tests() {
cd "$SELF_DIR"
run tag-build bash ./build_ncm_tag_host.sh
run tag-test ./test/test_ncm_tag_host
run cache-build bash ./build_ncm_cache_host.sh
run cache-test ./test/test_ncm_cache_host
}
step_ncm() {
cd "$SELF_DIR"
run ncm bash ./build_ncm.sh
# 只匹配编译器告警本身;build_ncm.sh 结尾的 "0 warning enforced" 总结不是告警。
if grep -i "warning:" "$LOGS/ncm.log"; then
echo "[FAIL] ncm 构建出现告警(要求 0 warning)" >&2
exit 1
fi
}
case "${1:-all}" in
prep) prep ;;
sdk) prep; step_sdk ;;
vendor) prep; step_vendor ;;
host-mbedtls) prep; step_host_mbedtls ;;
core) prep; step_core ;;
tests) prep; step_tests ;;
ncm) prep; step_ncm ;;
all) prep; step_sdk; step_vendor; step_host_mbedtls; step_core; step_tests; step_ncm ;;
-h|--help) usage ;;
*) echo "未知步骤: $1(all|prep|sdk|vendor|host-mbedtls|core|tests|ncm)" >&2; exit 2 ;;
esac