#!/usr/bin/env bash # # build.sh — 交叉编译 Apple mDNSResponder 的 POSIX 精简变体 SAResponder(mipsel-linux-muslsf,静态) # # 目标架构 : mipsel (MIPS32r2 little-endian), musl, 静态链接, 无 glibc 依赖 # 交叉编译器: zig (目标 mips-linux-musl / mipsel-linux-musleabi),由 ~/Project/R3ProII/.tools/zig-mipsel-cc 包装 # 产物 : bin/mdnsd = SAResponder (mDNSResponderPosix) —— 本脚本构建,无 UDS/IPC 的精简响应器 # bin/mdnsd.bin = 完整 mdnsd 守护进程(上一轮产物,作为对照保留,需重编译见文件尾注释) # 用途 : MeowOS (R3 Pro II) 板载 mDNS 响应器,回应 .local 查询 # # 用法 : ./build.sh # 默认构建 SAResponder → bin/mdnsd # # 可复现性 : 源码按固定 commit SHA 下载(codeload sha 方式),产物大小/校验值稳定。 set -euo pipefail REPO_DIR="$(cd "$(dirname "$0")" && pwd)" BIN_DIR="$REPO_DIR/bin" WORK="$REPO_DIR/.build" # ---- 工具链(本机实际路径;zig-mipsel-cc 内部也用 $HOME/Project/R3ProII/.tools)---- ZIGCC="${ZIGCC:-$HOME/Project/R3ProII/.tools/zig-mipsel-cc}" # ---- 固定源码版本:apple-oss-distributions/mDNSResponder 2881.0.25 ---- MDNS_SHA="${MDNS_SHA:-d4658af3f5f291311c6aee4210aa6d39bda82bbe}" MDNS_VER="${MDNS_VER:-2881.0.25}" TARBALL_URL="https://codeload.github.com/apple-oss-distributions/mDNSResponder/tar.gz/${MDNS_SHA}" TARBALL="$WORK/mDNSResponder-${MDNS_VER}.tar.gz" SRCDIR="$WORK/src" mkdir -p "$BIN_DIR" "$WORK" echo "==> [1/4] 获取源码 mDNSResponder-$MDNS_VER (commit ${MDNS_SHA:0:12})" if [ ! -f "$TARBALL" ]; then curl -fsSL --retry 4 --retry-all-errors -o "$TARBALL" "$TARBALL_URL" fi gzip -t "$TARBALL" >/dev/null 2>&1 || { echo "错误: 源码包校验失败"; exit 1; } rm -rf "$SRCDIR" mkdir -p "$SRCDIR" tar xzf "$TARBALL" -C "$SRCDIR" --strip-components=1 echo "==> [2/4] 交叉编译 SAResponder (zig: mipsel-linux-musleabi, -Os -static, tls=no)" cd "$SRCDIR/mDNSPosix" # 说明: # - os=linux : 选定 Linux 平台分支 (CFLAGS_OS) # - tls=no : 关闭 TLS 支持,避免链接 mbedtls (嵌入式设备不需要) # - CC/LD=$ZIGCC : 强制 zig 交叉编译器,不用宿主 gcc # - CFLAGS="-Os -static" : -Os 体积优化 + 静态链接;-Wno-date-time 关掉 zig/clang # 默认的 -Werror -Wdate-time (源码用了 __DATE__/__TIME__ 宏) # - LINKOPTS="-s" : 链接时直接 strip 符号表 + 调试信息,产出部署版。 # 注意 SAResponder 的链接规则里没有 $(STRIP) $@ 这一行, # 唯一的 strip 来源就是这个 -s(勿依赖 STRIP=true) # - SAResponder 目标 : 无 UDS/IPC 的独立响应器,产物 build/prod/mDNSResponderPosix make os=linux tls=no \ CC="$ZIGCC" CFLAGS="-Os -static -Wno-date-time" \ LD="$ZIGCC" LINKOPTS="-s" STRIP=true SAResponder echo "==> [3/4] 放置产物 $BIN_DIR/mdnsd (SAResponder)" install -m 755 build/prod/mDNSResponderPosix "$BIN_DIR/mdnsd" echo "==> [4/4] 校验" file "$BIN_DIR/mdnsd" echo "--- 体积 (静态部署版, strip 后) ---" ls -l "$BIN_DIR/mdnsd" echo "字节数: $(stat -c %s "$BIN_DIR/mdnsd")" echo "MD5 : $(md5sum "$BIN_DIR/mdnsd" | cut -d' ' -f1)" echo "构建完成: $BIN_DIR/mdnsd" echo echo "提示: bin/mdnsd.bin 为上一轮的完整 mdnsd 守护进程(1,018,144 B, md5 fcb0a8ae5ad5696253a6ec56b3e585e6)," echo " 仅作对照保留。如需重编译完整 mdnsd 放到 mdnsd.bin,改目标为 Daemon 即可:" echo " make os=linux tls=no CC=\"\$ZIGCC\" CFLAGS=\"-Os -static -Wno-date-time\" LD=\"\$ZIGCC\" LINKOPTS=\"-s\" Daemon" echo " install -m 755 build/prod/mdnsd \"$BIN_DIR/mdnsd.bin\""