# sdk/ — meow_ui 应用框架(源码 + 构建) 本目录是 `meow_ui.a` 的**自包含**源码树:公共头在 `include/`(伞头 `meow_ui.h`), 构建脚本 `build_sdk.sh`,宿主逻辑测试 `test_*.c`。上手指南见仓库根 [README.md](../README.md) 与 [docs/APP_DEV_GUIDE.md](../docs/APP_DEV_GUIDE.md)。 ## 构建 ```sh cd sdk ./build_sdk.sh # 产出 sdk/meow_ui.a(mipsel 静态库) ``` 交叉编译器默认 `$HOME/Project/R3ProII/.tools/zig-mipsel-cc`,可用 `MEOW_CC` 覆盖。 ## 时钟:mipsel o32 时钟/睡眠 ABI 修复(已内置) **公开 SDK 现已内置 mipsel o32 时钟/睡眠 ABI 修复(见 [CLOCK_ABI.md](CLOCK_ABI.md))**, 源码在 `meow_ui_time.c`。 - 背景:zig 内置 musl 在 mipsel 上「头文件声明 64 位 `time_t`、实现却走 time32 系统调用」, 导致 `meow_ui_time_ms()` 毫秒位恒 0、高 32 位随机;`usleep()` 亚秒等待立即返回(忙等空转)。 - 修复:`meow_ui_time_ms()` 直接按**内核 o32 ABI**(8 字节 `{int32 sec; int32 nsec;}`)取时, 再自行升成 64 位毫秒;同一 TU 强定义 `__clock_gettime` / `__clock_gettime64` / `__clock_nanosleep` / `__clock_nanosleep_time64` / `__nanosleep_time64`,在**链接期接管** libc 里那份 ABI 不一致的实现。 - **链接顺序要求**:应用必须把 `meow_ui.a` 放在 `-lc` **之前**(`cc ... meow_ui.a ... -lc`), 强定义才能生效。仓库内 `examples/hello/build_hello.sh` 与 `tuku/build_tuku.sh` 均如此; 自定义构建脚本请照抄这个顺序,否则取时/睡眠会静默回到坏实现。 - 非 mipsel 目标(宿主单测、aarch64 等)走普通 `clock_gettime`,行为不变。 ### 已知限制 - **2038 前有效**:内核侧仍是 time32(`tv_sec` 为 int32),秒数超出 `INT32_MAX` 即溢出; 本修复只保证「头/实现的宽度一致」,不把内核升到 time64。 - 同源缺陷**未修**:futex 相对超时(`pthread_cond_timedwait` 的亚秒等待)、`timerfd_settime`、 `clock_settime`/`clock_adjtime`、`pselect`/`ppoll` 等仍受同一句 `!__ILP32__` 影响; 清单与影响见 [CLOCK_ABI.md](CLOCK_ABI.md) §6。SDK 自身不直接使用这些路径。 - 真机验收:本修复的证据是反汇编 + 宿主单测(本机无 qemu-mipsel),设备侧仍需实测确认。 ## 宿主测试 无硬件即可跑(`gcc` 直接编译,不链 `meow_ui.a`): ```sh cd sdk # 时钟换算与单调性 gcc -Os -Wall -Wextra -I. -Iinclude -c meow_ui_time.c -o meow_ui_time_host.o gcc -Os -Wall -Wextra -I. -Iinclude test_meow_time.c meow_ui_time_host.o -o test_meow_time ./test_meow_time # == PASS == / checks=N # 伞头与其余模块测试(示例) gcc -I. -Iinclude test_umbrella.c <各 sdk 源 .c> test_host_stub.c -lpthread -o test_umbrella ./test_umbrella ``` 注意:宿主编译时 `meow_ui_time.c` 走 `MEOW_TIME32_KERNEL_ABI 0` 分支(普通 `clock_gettime`), 因此**宿主测试不能证明 mipsel o32 路径正确** —— 那条路径的正确性靠 `CLOCK_ABI.md §4` 的 反汇编证据(`nm` 符号来源 + `syscall 4263/4265` 的 8 字节转换)。