From d36a3a02a677d6fe26db4469a78fa6c3a1e64f2e Mon Sep 17 00:00:00 2001 From: AskaEth Date: Wed, 11 Nov 2026 20:05:49 +0800 Subject: [PATCH] =?UTF-8?q?fix(audiod):=20build=5Faudiod.sh=20=E8=AF=84?= =?UTF-8?q?=E5=AE=A1=20P2=20=E4=B8=A4=E6=9D=A1=20=E2=80=94=20CC=20?= =?UTF-8?q?=E5=8D=95=E4=B8=80=E5=91=BD=E4=BB=A4=E8=AF=8D=20+=20ZIG=20guard?= =?UTF-8?q?=20=E4=B8=8B=E6=B2=89=EF=BC=9B=E9=A1=BA=E6=89=8B=E4=B8=A4?= =?UTF-8?q?=E5=A4=84=E5=8F=AF=E8=A7=81=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 评审 r2(p2-2items/merge,reviewed 234b4d1)两条: ① P2-1 `CC="zig cc --target=mipsel-linux-musleabi"` 是死代码:多词整串存进变量,`"$CC"` 按一个命令名展开 → `command not found`(评审实测 exit 127)。**M51 在 git worktree 里跑 必踩**(`$ROOT/.tools/zig-mipsel-cc` 基本不存在 → 走 PATH 回退 → meow_audio 编不出来, 而 meow_audio 正是 M43 带 time32 的那个 CLI)。 - `CC` 只存**单个命令词**,多词 target flags 另放 `CC_EXTRA`(未加引号展开,故意分词); - PATH 回退改为 `CC="$(command -v zig)"` + `CC_EXTRA="cc --target=mipsel-linux-musleabi"`; - cli 分支加 `[ -n "$CC" ] || { 明确提示 CC=/ZIG= 或把 zig 放进 PATH; exit 1; }`—— 缺编译器时是**清晰错误**,不再是 command not found。 ② P2-2 `[ -n "$ZIG" ] || exit 1` 放得太早:`$ZIG` 只有 audiod 目标用,却在 host/cli 分支之前, 没有 zig 的机器上 `build_audiod.sh host`(只需宿主 cc)会被无谓打断。guard 下沉到 audiod 段(MAIN 之后、LIBBT 之前),提示语也改成「audiod 目标需要它」。 顺带(评审附带观察): ③ host 目标不再用「先编一次 2>/dev/null、失败再编一次」兜底——那会把成功路径的 warning 吞掉。 改成先跑一个 trivial 链接探针决定 `AS_LINK`(`-l:libasound.so.2` 或 `-lasound`),真正的编译 全程保留 stderr。 ④ `libasound.so.2.0.0 not found` 现在**列出试过的全部路径** + 覆盖语法(M51 在陌生环境里的 唯一路标)。同时把 MAIN 的推导改成「git 不可用就留空」,避免产生 `/`、`$HOME` 这类伪候选。 自证(本 worktree 真跑): - `ROOT=/nonexistent ./build_audiod.sh cli` → 正常出件 88888B/md5 3909c8d2…(评审的复现命令) - PATH 里没有 zig → cli:`!! mipsel CC 未找到:设置 CC=…`(不再 command not found); audiod:`!! zig not found(audiod 目标需要它)…` - PATH 里没有 zig → **host 目标照常 4 个产物 + test_bt_dev 71/71 + test_audiod_host 109/0** - 正常环境两目标产物**一字未变**:meow_audiod 68604B/md5 9f58b219…、meow_audio 88888B/md5 3909c8d2… - `test_time32_abi.sh --builds` ALL PASS,`build meow_audio src=yes macro=yes` --- patch_v2/meow_audiod/build_audiod.sh | 44 +++++++++++++++++++++------- 1 file changed, 33 insertions(+), 11 deletions(-) diff --git a/patch_v2/meow_audiod/build_audiod.sh b/patch_v2/meow_audiod/build_audiod.sh index 04dc58c..a7b92c2 100755 --- a/patch_v2/meow_audiod/build_audiod.sh +++ b/patch_v2/meow_audiod/build_audiod.sh @@ -29,28 +29,38 @@ cd "$(dirname "$0")" # ROOT 只用于可选的历史路径(旧 .tools/zig-env、hiby_os_crack 解包树);缺省布局下不依赖它。 ROOT="${ROOT:-$HOME/Project/R3ProII}" REPO="$(cd "$(dirname "$0")/../.." && pwd)" # 仓库根(worktree 亦可) -# mipsel 静态 CC:优先显式环境变量 → 历史 zig 包装脚本 → PATH 里的 zig。 +# mipsel 静态 CC:显式 CC → 历史 zig 包装脚本 → PATH 里的 zig(裸 zig 要另带 target flags)。 +# ⚠️ CC **只存单个命令词**:`"$CC"` 是按一个命令名展开的,把 "zig cc --target=..." 整串存进去 +# 会变成「找不到名叫 zig cc --target=... 的命令」(评审 P2-1,M51 在 worktree 里必踩)。 +# 多词 flags 走 CC_EXTRA(未加引号展开,故意按空白分词),与下面 ZIG 的写法保持一致。 CC="${CC:-}" +CC_EXTRA="" if [ -z "$CC" ]; then - if [ -x "$ROOT/.tools/zig-mipsel-cc" ]; then CC="$ROOT/.tools/zig-mipsel-cc"; else CC="zig cc --target=mipsel-linux-musleabi"; fi + if [ -x "$ROOT/.tools/zig-mipsel-cc" ]; then + CC="$ROOT/.tools/zig-mipsel-cc" # 历史包装脚本(内部已带 --target) + elif command -v zig >/dev/null 2>&1; then + CC="$(command -v zig)" + CC_EXTRA="cc --target=mipsel-linux-musleabi" + fi fi # 交叉编译用的 zig:显式 ZIG → 历史 zig-env → PATH。 ZIG="${ZIG:-}" if [ -z "$ZIG" ]; then if [ -x "$ROOT/.tools/zig-env/bin/zig" ]; then ZIG="$ROOT/.tools/zig-env/bin/zig"; else ZIG="$(command -v zig || true)"; fi fi -[ -n "$ZIG" ] || { echo "!! zig not found (set ZIG=/path/to/zig)"; exit 1; } INC="-I$REPO/patch_v2/meow_launcherd" # 共享协议头(相对仓库根,不再绑 ROOT) +# 注:$ZIG 只有 audiod 目标用;guard 放在 audiod 段之前(见下),host/cli 不因缺 zig 而中断。 if [ "$1" = "host" ]; then HOST_CC="${CC_HOST:-cc}" # BT 目标直链宿主 libasound(无 asoundlib.h,原型内联于 meow_audiod.c)。删 -ldl:BT 不再用 dlopen。 - # 优先 -l:libasound.so.2(精确到版本,不依赖 unversioned dev 链接);宿主只装了无版本号 - # libasound.so(如 Termux)时退回 -lasound——两者符号集对我们用的 9 个原型等价。 - if ! "$HOST_CC" $INC -Os -Wall -Wextra meow_audiod.c bt_dev.c -o meow_audiod_host \ - -lpthread -l:libasound.so.2 2>/dev/null; then - "$HOST_CC" $INC -Os -Wall -Wextra meow_audiod.c bt_dev.c -o meow_audiod_host -lpthread -lasound + # 链接名先用「trivial 探针」决定:有 -l:libasound.so.2(精确版本)就用它,否则退 -lasound。 + # 用探针而**不是**「先编一次、失败再编一次 2>/dev/null」——后者会把成功路径的 warning 一起吞掉。 + AS_LINK="-l:libasound.so.2" + if ! printf 'int main(void){return 0;}\n' | "$HOST_CC" -x c - -o /dev/null "$AS_LINK" 2>/dev/null; then + AS_LINK="-lasound" fi + "$HOST_CC" $INC -Os -Wall -Wextra meow_audiod.c bt_dev.c -o meow_audiod_host -lpthread $AS_LINK "$HOST_CC" $INC -Os -Wall -Wextra meow_audio.c -o meow_audio_host -lm "$HOST_CC" $INC -Os -Wall -Wextra test_audiod_host.c -o test_audiod_host -lm "$HOST_CC" -Os -Wall -Wextra test_bt_dev.c bt_dev.c -o test_bt_dev -lm @@ -65,9 +75,12 @@ if [ "$1" = "host" ]; then fi if [ "$1" = "cli" ]; then + [ -n "$CC" ] || { + echo "!! mipsel CC 未找到:设置 CC=/path/to/zig 或 CC=/path/to/zig-mipsel-cc(或把 zig 放进 PATH)" >&2 + exit 1; } # M43: meow_audio 是 musl-static(当前 zig 链),与其它系统组件同源受损 → 链 time32 修 # clock_gettime/usleep(monitor 的 100ms 窗口/轮询)。 - "$CC" $INC -Os -Wall -Wextra -static -DMEOW_TIME32_LIBC_OVERRIDES \ + "$CC" $CC_EXTRA $INC -Os -Wall -Wextra -static -DMEOW_TIME32_LIBC_OVERRIDES \ meow_audio.c ../sdk/meow_time32.c -o meow_audio -lm echo "== meow_audio (mipsel static CLI) ==" ls -la meow_audio @@ -86,19 +99,28 @@ fi # 顺序取第一个存在的(旧值 $ROOT/hiby_os_crack/... 在多数 checkout 里不存在,set -e 下会直接卡住构建)。 # MAIN = 主 checkout 根(在 git worktree 里运行时,devdocs/ 与 fw_apps/ 这类未入库的固件树 # 只在主 checkout 里;git-common-dir 指向
/.git,其父目录即主 checkout)。普通 checkout 下 == REPO。 -MAIN="$(cd "$(git rev-parse --git-common-dir 2>/dev/null || echo .)/.." 2>/dev/null && pwd || true)" +MAIN="" +_gcd="$(git rev-parse --git-common-dir 2>/dev/null)" && MAIN="$(cd "$_gcd/.." 2>/dev/null && pwd)" || MAIN="" +[ -n "$ZIG" ] || { + echo "!! zig not found(audiod 目标需要它):设置 ZIG=/path/to/zig 或把 zig 放进 PATH" >&2 + exit 1; } LIBBT="${LIBBT:-libbt}" if [ -z "$ASOUND_SRC" ]; then + tried="" for c in "$ROOT/hiby_os_crack/r3proii/squashfs-root-example/usr/lib/libasound.so.2.0.0" \ "$REPO/devdocs/fw-baseline/squashfs-root/usr/lib/libasound.so.2.0.0" \ "$REPO/fw_apps/build/squashfs-root/usr/lib/libasound.so.2.0.0" \ ${MAIN:+"$MAIN/devdocs/fw-baseline/squashfs-root/usr/lib/libasound.so.2.0.0"} \ ${MAIN:+"$MAIN/fw_apps/build/squashfs-root/usr/lib/libasound.so.2.0.0"}; do [ -f "$c" ] && { ASOUND_SRC="$c"; break; } + tried="$tried + - $c" done fi [ -n "$ASOUND_SRC" ] && [ -f "$ASOUND_SRC" ] || { - echo "!! libasound.so.2.0.0 not found (set ASOUND_SRC=/path/to/libasound.so.2.0.0)"; exit 1; } + echo "!! libasound.so.2.0.0 not found. 试过这些路径:$tried" >&2 + echo " 覆盖方式:ASOUND_SRC=/path/to/libasound.so.2.0.0 $0" >&2 + exit 1; } mkdir -p "$LIBBT" if [ ! -f "$LIBBT/libasound.so.2.0.0" ]; then cp "$ASOUND_SRC" "$LIBBT/libasound.so.2.0.0"; fi ln -sf libasound.so.2.0.0 "$LIBBT/libasound.so"