#!/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,否则 /launcher/meow_font.a # # 用法: # bash patch_v2/ncm_app/build_ncm_cross_host.sh [all|prep|sdk|vendor|host-mbedtls|core|tests|ncm] # 缺省 all;各步日志写 /logs/.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