# Rapfi 对应源码与构建

本版提供四种真实 WebAssembly 构建。准确摘要与权重分块见 manifest.json。完整对应源码：../source.zip；版权声明、GPL 和 AUTHORS 均保留。

## 固定版本

- Rapfi 稳定版 250615，提交 1be1551ced57e38d53ed58f6d74bf6f8b4bdc230：https://github.com/dhbloo/rapfi/tree/1be1551ced57e38d53ed58f6d74bf6f8b4bdc230
- 官方 CC0 权重提交 918b757a129258e9e765f77fe17d507c2bb1a60b：https://github.com/dhbloo/rapfi-networks/tree/918b757a129258e9e765f77fe17d507c2bb1a60b
- Emscripten 6.0.10；独立官方 Binaryen 133；CMake 3.30.5；Ninja 1.12.1。SDK 默认 Binaryen 132，本版显式使用 133，构建器会提示版本差异；重建应保留本版配置。

## 修改记录（2026-10-02）

1. Networks/config-example/gomocalc-mix9svq.toml：coord_conversion_mode=X_flipY 改为 none，适配应用坐标。
2. Rapfi/CMakeLists.txt：--closure=0，避免 Java 依赖；无 SIMD 的 WASM 排除未使用、要求 SIMD 的 Mix10 evaluator；四版均使用原始 Mix9 NNUE。
3. Rapfi/config.cpp：用 NO_MIX10_EVALUATOR 保护无 SIMD 构建的 Mix10 include 和工厂。
4. Rapfi/search/searchthread.cpp：单线程 waitForIdle 不访问不存在的 thread 成员。
5. Rapfi/CMakeLists.txt：多线程 TEXTDECODER=1，适配 Emscripten 6 移除的 TEXTDECODER=0。
6. Rapfi/CMakeLists.txt：显式声明 INCOMING_MODULE_JS_API（含 mainScriptUrlOrBlob），使 importScripts 加载的引擎用正确脚本启动计算线程；将 preload 文件纳入 LINK_DEPENDS，修改权重时重新链接。

## 重建

Linux 安装 Node.js 22 和 Git后运行 `npm run build`。脚本在缺少 Python / CMake / Ninja 时安装到项目 work/，下载固定 SDK 和 Binaryen，校验权重并构建四版。也可运行附带 GitHub Actions。

Windows 使用 scripts/build-engine.ps1，传入 SdkDirectory、BinaryenDirectory、CmakePath、NinjaPath；再运行 `node scripts/package-engine.mjs` 与 `python scripts/package-source.py`。

四版 CMake 参数：Release、NO_COMMAND_MODULES=ON、NO_MULTI_THREADING=ON/OFF、USE_WASM_SIMD=ON/OFF、USE_WASM_SIMD_RELAXED=OFF。通过 emcmake 配置，Ninja 构建。

完整附加参数保留在源码 CMakeLists.txt：-O3、-fexceptions、-flto、--pre-js、MODULARIZE=1、EXPORT_NAME=Rapfi、EXPORTED_FUNCTIONS、cwrap、EXIT_RUNTIME=1、ALLOW_MEMORY_GROWTH=1、IMPORTED_MEMORY=1、STACK_SIZE=2MB、权重 preload；多线程增加 -pthread、USE_PTHREADS=1、PROXY_TO_PTHREAD=1、TEXTDECODER=1。

DATA 按 8 MiB 分块并去重；Worker 组合后用 getPreloadedPackage 传入。源码归档不含 CC0 权重二进制，weight-checksums.json 记录固定摘要，build-engine.mjs 从官方固定提交下载；完整本地项目含权重。分发 WASM 时同时提供 source.zip 和本说明。

静态托管 dist；WASM MIME application/wasm。多线程需要 COOP same-origin 与 COEP require-corp，dist/_headers 与本地服务器均提供；缺少共享内存能力时自动使用单线程。
