Skip to content

构建与部署 — 概念

部署管线总览

从源代码到用户可访问的网站,pokeemerald-wasm 经历以下阶段:

Makefile 构建目标

make wasm — 完整 WASM 构建

这是核心构建目标,执行以下步骤:

关键编译标志:

标志含义
--target=wasm32-unknown-unknown编译目标为 WebAssembly 32 位
-DMODERN=1启用 modern 模式(使用现代 C 编译器)
-DWASM=1启用 WASM 条件编译守卫
-I include/wasm优先搜索 WASM 兼容垫片头文件
-O2二级优化
--no-entryWASM 模块无标准 main() 入口
--allow-undefined允许未定义符号(GBA BIOS 调用等)
--initial-memory=268435456初始化 256MB 线性内存
--export=AgbMain导出游戏入口函数
--export=WasmRunFrame导出帧执行函数
--export-all导出所有全局符号(用于调试和自动化)

make serve-wasm — 本地开发服务器

编译 WASM 后启动 Node.js 开发服务器:

make wrangler-site — 部署打包

构建 WASM 并打包 Cloudflare Workers 所需的静态资源:

make clean-wasm — 清理构建产物

删除 build/wasm/ 目录中的所有编译中间文件和最终产物。

原生构建目标(wasm2c 管线)

上游新增(2026-07 同步)

除浏览器前端外,上游新增三条原生构建目标。它们都先把 WASM 用 WABT 的 wasm2c 转回 C,再链接各自的宿主程序,复用同一份游戏与渲染核心src/wasm_display.c 的 RGBA 输出)。

目标产物说明
make native-raylibbuild/native/pokeemerald-native桌面 Raylib 前端,native-raylib 用同一 WASM ABI,存档写入 *.sav
make native-benchbuild/native/pokeemerald-bench无头 FPS + 正确性基准测试,不开窗口;tools/native/run_bench.sh 跑两遍并对照 bench_golden.json 的 FNV 哈希,任一不匹配则分数为 0
make native-kindlebuild/native/pokeemerald-kindleKindle Scribe Linux 帧缓冲前端:灰度帧写 /dev/fb0,读 /dev/input/event*,经 HWTCON/MXCFB 或 eips 刷新电子墨水屏。可用 KINDLE_CC/KINDLE_CFLAGS 交叉编译(如 zig cc
make clean-native清理 build/native/

关键点:

  • wasm2c 把同一份 WASM 翻译成可由普通 C 编译器链接的代码,于是「在浏览器里跑」和「在桌面 / Kindle 上跑」共享同一个游戏核心,无需维护第二份移植。
  • native_engine.h 定义了与浏览器相同的 240×160 RGBA 显示约定(NATIVE_DISPLAY_WIDTH/HEIGHTNATIVE_DISPLAY_BYTES)和按键位掩码,宿主只负责把 RGBA 搬到屏幕——这与 app.jsWasmRenderFrame() + putImageData() 模式完全一致。

本地开发服务器

web/server.mjs 是一个极简的静态文件服务器:

特点:

  • 基于 Node.js 原生 http 模块,无第三方依赖
  • 自动路径安全检查(防止目录遍历攻击)
  • 所有响应设置 Cache-Control: no-store(开发时不缓存)

Cloudflare Workers 部署

wrangler.toml 配置

toml
name = "pokeemerald-wasm"
account_id = "..."
compatibility_date = "2026-05-29"
workers_dev = false          # 不使用 *.workers.dev 子域
preview_urls = false         # 禁用预览 URL

[build]
command = "make wrangler-site"           # 构建命令
watch_dir = ["web", "src", "include", ...] # 监听变更的目录

[assets]
directory = "./dist/cloudflare"          # 静态资源目录
html_handling = "auto-trailing-slash"
not_found_handling = "none"

[[routes]]
pattern = "pokeemerald.com"              # 自定义域名
custom_domain = true

关键配置项:

配置说明
workers_devfalse禁用 workers.dev 子域,仅通过自定义域名访问
build.commandmake wrangler-site部署前自动执行构建
assets.directory./dist/cloudflare静态资源来源目录
routespokeemerald.com绑定自定义域名

打包脚本:build_wrangler_site.mjs

打包的 4 个文件:

源文件目标路径说明
web/index.htmldist/cloudflare/index.html主页面(Canvas + 控件)
web/app.jsdist/cloudflare/web/app.js运行时(输入/存档/帧调度;渲染在 WASM 内完成)
web/style.cssdist/cloudflare/web/style.cssUI 样式
build/wasm/pokeemerald.wasmdist/cloudflare/build/wasm/pokeemerald.wasmWASM 模块

相关概念