#!/bin/bash # build_reader.sh — os.meow.reader R1 可复现构建:vendor FreeType(mipsel musl 静态) → 链 reader 二进制 # + 宿主 core 单测 + qemu-mipsel FreeType 冒烟。 # # 产物: # reader mipsel 静态 ELF(链 meow_ui.a + FreeType + core + engine) # test/test_reader_core_host 宿主 core 单测(enc/layout/kinsoku/page/reflow/txt) # test/rdft_smoke_mipsel qemu-mipsel FreeType 封装冒烟 # # 约束:只写本目录(patch_v2/reader_app/);不改 sdk/;-Wall -Wextra 0 warning。 # vendor/(FreeType 源码+构建产物)gitignore,不入仓;build 脚本可复现。 set -e cd "$(dirname "$0")" ROOT="$HOME/Project/R3ProII" CC="$ROOT/.tools/zig-mipsel-cc" SYSROOT="$ROOT/.tools/mipsel-linux-muslsf-cross/mipsel-linux-muslsf" HOST_CC="${HOST_CC:-gcc}" FT_VER="2.14.3" VENDOR="$PWD/vendor" FT_SRC="$VENDOR/freetype-src" FT_BUILD="$VENDOR/freetype-build" FT_INC_SRC="$FT_SRC/include" FT_INC_BUILD="$FT_BUILD/include" # ---------- 1) FreeType vendor 拉取 ---------- mkdir -p "$VENDOR" fetch_freetype() { # 优先级:env FREETYPE_SRC → 本目录 vendor 已存在 → /tmp/freetype → 下载 if [ -n "$FREETYPE_SRC" ] && [ -f "$FREETYPE_SRC/CMakeLists.txt" ]; then cp -r "$FREETYPE_SRC" "$FT_SRC" elif [ ! -d "$FT_SRC" ] && [ -f /tmp/freetype/CMakeLists.txt ]; then cp -r /tmp/freetype "$FT_SRC" elif [ ! -d "$FT_SRC" ]; then echo "==> downloading freetype $FT_VER" rm -rf "$FT_SRC" ( cd "$VENDOR" && curl -fsSL -o ft.tar.xz \ "https://download.savannah.gnu.org/releases/freetype/freetype-$FT_VER.tar.xz" \ && mkdir -p "$FT_SRC" && tar xf ft.tar.xz -C "$FT_SRC" --strip-components=1 && rm ft.tar.xz ) fi [ -f "$FT_SRC/CMakeLists.txt" ] || { echo "FREETYPE_SRC 不可用/下载失败"; exit 1; } } fetch_freetype # ---------- 2) FreeType mipsel 交叉静态构建(禁用可选项,只要最简) ---------- if [ ! -f "$FT_BUILD/libfreetype.a" ] || [ -n "$FORCE_FT" ]; then rm -rf "$FT_BUILD" cmake -S "$FT_SRC" -B "$FT_BUILD" \ -DCMAKE_SYSTEM_NAME=Linux \ -DCMAKE_C_COMPILER="$CC" \ -DCMAKE_TRY_COMPILE_TARGET_TYPE=STATIC_LIBRARY \ -DCMAKE_BUILD_TYPE=Release \ -DBUILD_SHARED_LIBS=OFF \ -DFT_DISABLE_ZLIB=TRUE -DFT_DISABLE_BZIP2=TRUE -DFT_DISABLE_PNG=TRUE \ -DFT_DISABLE_HARFBUZZ=TRUE -DFT_DISABLE_BROTLI=TRUE \ >/dev/null cmake --build "$FT_BUILD" -j"$(nproc)" >/dev/null 2>&1 fi [ -f "$FT_BUILD/libfreetype.a" ] || { echo "FreeType build FAILED"; exit 1; } FT_INCS="-I$FT_BUILD -I$FT_INC_BUILD -I$FT_INC_SRC" echo "==> freetype.a: $(du -h "$FT_BUILD/libfreetype.a" | cut -f1)" # ---------- 3) 宿主 core 单测 ---------- echo "==> host core test" $HOST_CC -O2 -Wall -Wextra -Icore -I. test/test_reader_core.c \ core/rdenc.c core/rdlayout.c core/rdtxt.c -o test/test_reader_core_host -lm ./test/test_reader_core_host # ---------- 4) qemu-mipsel FreeType 冒烟 ---------- echo "==> mipsel ft smoke" $CC -Os -static -Wall -Wextra -Iengine $FT_INCS test/rdft_smoke.c engine/rdft.c \ "$FT_BUILD/libfreetype.a" -o test/rdft_smoke_mipsel timeout 120 qemu-mipsel ./test/rdft_smoke_mipsel "${FONT:-$ROOT/font/src/MiSans-Regular.otf}" # ---------- 4b) qemu-mipsel 书桥全链路冒烟 ---------- echo "==> mipsel book smoke" $CC -Os -static -Wall -Wextra -Iapp -Icore -Iengine $FT_INCS test/book_smoke.c \ app/book.c core/rdenc.c core/rdlayout.c core/rdtxt.c engine/rdft.c \ "$FT_BUILD/libfreetype.a" -o test/book_smoke_mipsel timeout 120 qemu-mipsel ./test/book_smoke_mipsel "${FONT:-$ROOT/font/src/MiSans-Regular.otf}" # ---------- 5) reader 二进制(mipsel 静态) ---------- echo "==> reader binary" CORE="core/rdenc.c core/rdlayout.c core/rdtxt.c" ENGINE="engine/rdft.c" APP="app.c app/shelf.c app/reader.c app/book.c app/progress.c" $CC -Os -static -Wall -Wextra -I../sdk -I. -Icore -Iapp -Iengine $FT_INCS \ $CORE $APP $ENGINE \ ../sdk/meow_ui.a "$SYSROOT/lib/libz.a" "$FT_BUILD/libfreetype.a" -lpthread -o reader ls -la reader file reader echo " 运行(qemu): qemu-mipsel ./reader" echo "build_reader OK"