|
| 1 | +# [1129] 引入 goldfish package,移除 s7 package |
| 2 | + |
| 3 | +## 1 背景 |
| 4 | + |
| 5 | +- 历史上 s7 作为独立 xmake package 定义在 `xmake/packages/s/s7/`, |
| 6 | + 其源码与 `xmake/goldfish.lua` 的 goldfish binary target 内联编译的 |
| 7 | + s7 源码完全相同(均来自 `TeXmacs/plugins/goldfish/src/`)。两份构建 |
| 8 | + 脚本(s7 package 的 `port/xmake.lua` 与 goldfish target 的 |
| 9 | + `add_files`)手工维护同一份源文件清单,容易漂移。 |
| 10 | +- `libmogan` / `stem` / tests 通过 `add_packages("s7")` 拿到 s7 的头文件 |
| 11 | + 和静态库,而 goldfish binary 又把同一批 s7 源码重新内联编译了一遍, |
| 12 | + 存在概念上的重复。 |
| 13 | +- s7 本身只是 goldfish 项目的内置 Scheme 引擎,真正的对外单元应当是 |
| 14 | + goldfish,而非裸 s7。 |
| 15 | + |
| 16 | +## 2 What |
| 17 | + |
| 18 | +1. 在 `xmake/goldfish.lua` 中新增 `package("goldfish")` 定义: |
| 19 | + - 源码来自 `TeXmacs/plugins/goldfish/src/`(与 goldfish binary 同源) |
| 20 | + - `on_install` 把 `*.c`/`*.h` 拷贝到包缓存目录,并在缓存目录内联 |
| 21 | + 生成 `xmake.lua`(定义 `libgoldfish` 静态库 target),再用 |
| 22 | + `package.tools.xmake.install` 构建,保持工作树干净 |
| 23 | + - `libgoldfish` 编译全部 `s7*.c`(C11),`add_headerfiles("s7.h")` |
| 24 | + 并通过 `add_includedirs(".", {public = true})` 公开头文件 |
| 25 | + - 依赖 `liii-tbox`(s7 部分宏需要 tbox) |
| 26 | +2. `xmake.lua`: `add_requires("s7")` → `add_requires("goldfish")`; |
| 27 | + `libmogan` 与 `stem` 的 `add_packages("s7")` → `add_packages("goldfish")`。 |
| 28 | +3. `xmake/tests.lua`: 两处 `add_packages("s7")` → `add_packages("goldfish")`。 |
| 29 | +4. 删除 `xmake/packages/s/s7/`(含 `xmake.lua` 与 `port/xmake.lua`)。 |
| 30 | +5. `xmake/goldfish.lua` 中原有的 `target("goldfish")` binary 定义保持 |
| 31 | + 不变 —— 它仍负责产出 goldfish REPL 可执行文件(包含 `goldfish.cpp` |
| 32 | + 的 `main` 与 `liii_*.cpp` / json-schema-validator 等完整功能)。 |
| 33 | + |
| 34 | +## 3 Why |
| 35 | + |
| 36 | +- **消除重复**:s7 package 与 goldfish binary target 此前各自维护一份 |
| 37 | + 完全相同的 s7 源文件清单(`s7.c` / `s7_continuation.c` / ... |
| 38 | + 共 19 个文件),任何一边漏改都会导致 libmogan/stem 链接的 s7 与 |
| 39 | + goldfish REPL 内嵌的 s7 行为不一致。改为以 goldfish 为唯一对外 |
| 40 | + package 后,源码出处唯一(goldfish 源码树),概念上也更准确 —— |
| 41 | + s7 只是 goldfish 内部实现细节。 |
| 42 | +- **命名对齐**:外部依赖方现在 `add_packages("goldfish")`,与分支名 |
| 43 | + `da/1129/libgoldfish` 及 goldfish 项目的实际身份一致,不再让后续 |
| 44 | + 开发者误以为项目「直接依赖上游 s7」。 |
| 45 | +- **为后续 libgoldfish 拆分铺路**:当前 libgoldfish 只编译 s7 子集, |
| 46 | + 后续可逐步把 `liii_*.cpp` 也迁入 libgoldfish,让 goldfish binary |
| 47 | + 反过来依赖 libgoldfish,彻底消除 goldfish.lua 中那份 19 行的 |
| 48 | + s7 源文件清单。本 PR 先完成 package 化这一步。 |
| 49 | + |
| 50 | +## 4 How |
| 51 | + |
| 52 | +- `package("goldfish")` 的 `on_install` 借鉴原 s7 package 的做法: |
| 53 | + 不使用 `set_sourcedir()`(会让 `package.tools.xmake` 把生成的 |
| 54 | + xmake.lua 写进工作树,污染 `TeXmacs/plugins/goldfish/src/`), |
| 55 | + 而是手工 `os.cp` 源码到 `package:cachedir()`,再用 `io.writefile` |
| 56 | + 在该缓存目录内联生成 port 构建脚本,最后以 `{curdir = curdir}` |
| 57 | + 交给 `package.tools.xmake.install`。 |
| 58 | +- 所有 package 定义代码集中在 `xmake/goldfish.lua`(与 `3rdparty/tbox.lua` |
| 59 | + 把 `package("liii-tbox")` 与 target 放同一文件的风格一致),不另建 |
| 60 | + `xmake/packages/g/goldfish/` 目录,减少散落。 |
| 61 | +- `libgoldfish` target 的源文件清单、`add_defines`、`set_basename` |
| 62 | + 等与原 s7 `port/xmake.lua` 的 `libs7` target 完全对齐,仅改名 |
| 63 | + `libs7` → `libgoldfish`、`set_basename("s7")` → `set_basename("goldfish")`, |
| 64 | + 保证行为不变。 |
| 65 | +- goldfish binary target 的 `add_files` / `add_includedirs` / |
| 66 | + `add_packages` 维持原状,REPL 可执行文件行为不受影响。 |
| 67 | + |
| 68 | +## 5 涉及文件 |
| 69 | + |
| 70 | +- `xmake/goldfish.lua`(新增 `package("goldfish")` 定义,保留原 |
| 71 | + `target("goldfish")`) |
| 72 | +- `xmake.lua`(`add_requires` 与两处 `add_packages` 由 s7 改为 goldfish) |
| 73 | +- `xmake/tests.lua`(两处 `add_packages` 由 s7 改为 goldfish) |
| 74 | +- `xmake/packages/s/s7/xmake.lua`(删除) |
| 75 | +- `xmake/packages/s/s7/port/xmake.lua`(删除) |
| 76 | +- `devel/1129.md`(新增,本文档) |
| 77 | + |
| 78 | +## 6 验证 |
| 79 | + |
| 80 | +- `grep -rn 'add_requires.*"s7"\|add_packages.*"s7"' xmake.lua xmake/*.lua` |
| 81 | + 无匹配。 |
| 82 | +- `xmake f -c --yes` 配置通过,goldfish package 成功安装到缓存。 |
| 83 | +- `xmake b stem` 构建通过(`libmogan.a` / `moganstem` 均链接成功, |
| 84 | + 证明 goldfish package 正确暴露了 s7 头文件与符号)。 |
0 commit comments