#!/bin/bash # build_sdk.sh — 构建 meow_ui.a(mipsel 静态库,含 meow_font.o 内联打包, # 应用只需链 meow_ui.a + libz.a + -lpthread)。 # # §10.1 矢量字:FreeType vendor 进 sdk/vendor/(gitignore),本脚本可复现「拉取 + 裁剪构建」: # 禁 zlib/png/brotli/bzip2/harfbuzz(-DFT_DISABLE_*),静态 musl(zig-mipsel-cc); # 产物 sdk/vendor/freetype-build/libfreetype.a,其 .o 编入 meow_ui.a —— 应用只链 meow_ui.a # 即获得矢量字能力;不调 meow_ft_* 的 App 链接器不会拉取 freetype 成员(零增量)。 set -e ROOT="$HOME/Project/R3ProII" cd "$(dirname "$0")" CC="$ROOT/.tools/zig-mipsel-cc" AR="${AR:-/usr/bin/ar}" # 系统 GNU ar 即可归档 mipsel ELF 对象(架构无关) # ---------- 0) FreeType vendor 拉取 + 裁剪构建(可复现) ---------- FT_VER="2.14.3" FT_SRC="vendor/freetype-src" FT_BUILD="vendor/freetype-build" fetch_freetype() { if [ -n "$SDK_FREETYPE_SRC" ] && [ -f "$SDK_FREETYPE_SRC/CMakeLists.txt" ]; then rm -rf "$FT_SRC"; cp -r "$SDK_FREETYPE_SRC" "$FT_SRC" elif [ ! -d "$FT_SRC" ]; then mkdir -p vendor ( 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 源码不可用"; exit 1; } } fetch_freetype 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 FT_INCS="-I$FT_BUILD -I$FT_BUILD/include -I$FT_SRC/include" rm -f meow_ui.a *.o # -I../meow_launcherd:meow_notify_ipc.c 复用共享协议头 meow_ipc.h(同一份、杜绝两端漂移) OBJS="meow_ui_gfx meow_ui_log meow_ui_notify meow_notify_ipc meow_ui_img meow_ui_widget meow_ui_input meow_ui_theme meow_ui_ime meow_pinyin meow_ui_sys meow_ui_vol meow_ui_activity meow_ui_global meow_ui_dialog meow_ui_config meow_ui_draw meow_ui_view meow_ui_nav meow_ui_media meow_ui_audio stb_image meow_ui_box meow_ui_anim meow_ui_scroll meow_lazygrid meow_select meow_ui_str meow_ui_ft meow_net_ipc meow_cachegov" CFLAGS="-Os -static -I$ROOT/patch_v2/meow_launcherd" for f in $OBJS; do echo "== cc $f ==" "$CC" $CFLAGS $FT_INCS -c "$f.c" -o "$f.o" done # meow_font.o(复用 launcher 字库,打进 meow_ui.a → 应用只链一个库) TMP="$(mktemp -d)" ( cd "$TMP" && "$AR" x "$ROOT/patch_v2/meow_launcherd/meow_font.a" && ls *.o ) cp "$TMP"/*.o meow_font.o 2>/dev/null || { echo "meow_font extract failed"; rm -rf "$TMP"; exit 1; } rm -rf "$TMP" rm -f meow_ui.a for f in $OBJS; do "$AR" rcs meow_ui.a "$f.o"; done "$AR" rcs meow_ui.a meow_font.o # FreeType .o 编入 meow_ui.a(App 不调 meow_ft_* → 链接器不拉取,零增量)。 FT_LIB="$PWD/$FT_BUILD/libfreetype.a" # 绝对路径(待会 cd 进临时目录,相对路径会失效) FT_O="$(mktemp -d)" ( cd "$FT_O" && "$AR" x "$FT_LIB" && ls *.o >/dev/null ) for o in "$FT_O"/*.o; do "$AR" rcs meow_ui.a "$o"; done rm -rf "$FT_O" echo "== meow_ui.a ==" ls -la meow_ui.a "$AR" t meow_ui.a