#!/bin/bash # rebuild_binaries.sh — 重编「进固件的那批组件」,产物就地写回 patch_v2/<组件>/(M51 批次)。 # # 为什么需要它:各组件自己的 build_*.sh 里仍散落着本机布局的默认路径 # (`$HOME/Project/R3ProII/.tools/...`、`$HOME/.tools/mipsel-linux-muslsf-cross/...`), # 在干净 checkout / git worktree 里直接跑会「找不到编译器」。本脚本不去改那些脚本, # 而是**在调用侧**把这些路径用环境变量与一个兼容 HOME 补齐: # # $COMPAT_HOME/Project/R3ProII -> 本仓库根(脚本里的历史硬编码路径落到当前 checkout) # $COMPAT_HOME/.tools -> 真 .tools(zig-mipsel-cc / muslsf 交叉 sysroot) # # 所有路径都可被环境变量覆盖: # ZIGCC mipsel-musl 交叉编译器包装(默认 $HOME/.tools/zig-mipsel-cc) # ZIG 裸 zig(audiod 守护目标用它做 glibc-2.22 动态链接;默认 PATH 里的 zig) # MEOW_UI_A_SRC launcherd 需要的 SDK 静态库来源(默认主 checkout 的 patch_v2/sdk/meow_ui.a) # # 用法: # bash scripts/build/rebuild_binaries.sh # 全部 5 组 # bash scripts/build/rebuild_binaries.sh bootmenu # 只编一个(可多个) # 组件名:bootmenu netmgrd audiod audio launcherd # # 前置:meow_audiod 守护目标需要设备 libasound.so.2 副本(build_audiod.sh 自动从 # devdocs/fw-baseline/ 或主 checkout 取);worktree 里没有这些未入库目录时, # 不需要额外指定——build_audiod.sh 用 git-common-dir 回退到主 checkout 取固件树。 set -e ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)" ZIGCC="${ZIGCC:-$HOME/.tools/zig-mipsel-cc}" ZIG="${ZIG:-$(command -v zig || true)}" MEOW_UI_A_SRC="${MEOW_UI_A_SRC:-}" [ -x "$ZIGCC" ] || { echo "!! ZIGCC 不可执行: $ZIGCC(用 ZIGCC=/path 覆盖)" >&2; exit 1; } [ -n "$ZIG" ] && [ -x "$ZIG" ] || { echo "!! 找不到 zig(用 ZIG=/path 覆盖)" >&2; exit 1; } # launcherd 链的 SDK 静态库被 .gitignore 忽略,worktree 里没有 → 从主 checkout 取。 ensure_ui_a() { local dst="$ROOT/patch_v2/sdk/meow_ui.a" [ -f "$dst" ] && { echo " meow_ui.a: $dst ($(md5sum "$dst" | cut -d' ' -f1))"; return 0; } local src="$MEOW_UI_A_SRC" if [ -z "$src" ]; then local main main="$(git -C "$ROOT" rev-parse --git-common-dir 2>/dev/null || true)" [ -n "$main" ] && main="$(cd "$ROOT/$(dirname "$main")/.." 2>/dev/null && pwd)/patch_v2/sdk/meow_ui.a" src="$main" fi [ -n "$src" ] && [ -f "$src" ] || { echo "!! 缺 patch_v2/sdk/meow_ui.a,且找不到来源;用 MEOW_UI_A_SRC=/path 指定" >&2 echo " (它由 patch_v2/sdk/build_sdk.sh 产出,被 .gitignore 忽略,不入库)" >&2 exit 1; } cp "$src" "$dst" echo " meow_ui.a: 复制 $src → $dst ($(md5sum "$dst" | cut -d' ' -f1))" } # 兼容 HOME:历史脚本按 $HOME 拼路径,这里让那些路径解析到当前 checkout 与真工具链。 COMPAT_HOME="${COMPAT_HOME:-${TMPDIR:-$HOME/tmp}/meow-build-home}" mkdir -p "$COMPAT_HOME/Project" ln -sfn "$ROOT" "$COMPAT_HOME/Project/R3ProII" ln -sfn "$HOME/.tools" "$COMPAT_HOME/.tools" run() { # run <组件> <工作目录> <命令...> local name="$1" dir="$2"; shift 2 echo "==> [$name] $*" ( cd "$ROOT/$dir" && HOME="$COMPAT_HOME" ZIGCC="$ZIGCC" ZIG="$ZIG" \ ZIG_GLOBAL_CACHE_DIR="$HOME/.cache/zig" "$@" ) } report() { # report <产物路径> local f="$ROOT/$1" printf ' %-44s %8s B %s\n' "$1" "$(stat -c%s "$f")" "$(md5sum "$f" | cut -d' ' -f1)" } do_bootmenu=0; do_netmgrd=0; do_audiod=0; do_audio=0; do_launcherd=0 if [ $# -eq 0 ]; then do_bootmenu=1; do_netmgrd=1; do_audiod=1; do_audio=1; do_launcherd=1; fi for a in "$@"; do case "$a" in bootmenu) do_bootmenu=1 ;; netmgrd) do_netmgrd=1 ;; audiod) do_audiod=1 ;; audio) do_audio=1 ;; launcherd) do_launcherd=1 ;; *) echo "!! 未知组件: $a(bootmenu netmgrd audiod audio launcherd)" >&2; exit 1 ;; esac done echo "==> 重编批次(ROOT=$ROOT)" echo " ZIGCC=$ZIGCC" echo " ZIG=$ZIG ($("$ZIG" version 2>/dev/null || echo '?'))" [ "$do_bootmenu" = 1 ] && { run bootmenu patch_v2/bootmenu bash build_bootmenu.sh; report patch_v2/bootmenu/meow_bootmenu; } [ "$do_netmgrd" = 1 ] && { run netmgrd patch_v2/meow_netmgrd bash build_netmgrd.sh; report patch_v2/meow_netmgrd/meow_netmgrd; } # audiod 守护:glibc-2.22 动态链接(链设备 libasound.so.2);**不链 meow_time32.c**(见 build_audiod.sh 头注)。 # meow_audio CLI:musl 静态 + meow_time32.c。 [ "$do_audiod" = 1 ] && { run audiod patch_v2/meow_audiod bash build_audiod.sh; report patch_v2/meow_audiod/meow_audiod; } [ "$do_audio" = 1 ] && { run audio patch_v2/meow_audiod bash build_audiod.sh cli; report patch_v2/meow_audiod/meow_audio; } [ "$do_launcherd" = 1 ] && { ensure_ui_a; run launcherd patch_v2/meow_launcherd bash build_launcher.sh; report patch_v2/meow_launcherd/meow_launcherd; } echo "==> 完成。产物自证:bash scripts/build/verify_fingerprints.sh"