Skip to content

Commit 1feee1a

Browse files
da-liiiclaude
andauthored
[1129] 引入 goldfish package,移除 s7 package (#3849)
Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
1 parent 1459710 commit 1feee1a

6 files changed

Lines changed: 191 additions & 142 deletions

File tree

devel/1129.md

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
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 头文件与符号)。

xmake.lua

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ set_policy("run.autobuild", false)
2525
set_languages("c++17")
2626
set_encodings("utf-8")
2727

28-
add_requires("s7", {system=false})
28+
add_requires("goldfish", {system=false})
2929
add_requires("liii-tbox", {system=false})
3030
add_requires("cpr", {system=false})
3131
includes("xmake/goldfish.lua")
@@ -540,7 +540,7 @@ target("libmogan") do
540540

541541
add_packages("liii-pdfhummus")
542542
add_packages("freetype")
543-
add_packages("s7")
543+
add_packages("goldfish")
544544
add_packages("liii-tbox")
545545
add_packages("cpr")
546546
add_packages("argh")
@@ -884,7 +884,7 @@ target("stem") do
884884

885885
add_frameworks("QtGui", "QtWidgets", "QtCore", "QtPrintSupport", "QtSvg", "QtNetwork", "QtNetworkAuth")
886886
add_frameworks("QtQml", "QtQuick", "QtBodymovin")
887-
add_packages("s7")
887+
add_packages("goldfish")
888888
add_deps("liblolly")
889889
add_deps("libmogan")
890890
add_deps("libmoebius")

xmake/goldfish.lua

Lines changed: 102 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,113 @@
11
-------------------------------------------------------------------------------
22
--
33
-- MODULE : goldfish.lua
4-
-- DESCRIPTION : goldfish scheme
4+
-- DESCRIPTION : goldfish scheme (package + binary target)
55
-- COPYRIGHT : (C) 2025 Darcy Shen
66
--
77
-- This software falls under the GNU general public license version 3 or later.
88
-- It comes WITHOUT ANY WARRANTY WHATSOEVER. For details, see the file LICENSE
99
-- in the root directory or <http://www.gnu.org/licenses/gpl-3.0.html>.
10+
--
11+
12+
-- goldfish 的 s7 源码内置在 TeXmacs/plugins/goldfish/src/,与下面 goldfish
13+
-- binary target 内联编译的那一份完全相同。不使用 set_sourcedir() 直接指向
14+
-- 工作树(否则 package.tools.xmake 会把 port 出来的 xmake.lua 写进工作树,
15+
-- 污染源码目录),而是在 on_install 里把源码拷贝到包缓存目录后构建。
16+
local goldfish_src = "$(projectdir)/TeXmacs/plugins/goldfish/src"
17+
18+
package("goldfish")
19+
set_homepage("https://github.com/goldfishscheme/goldfish")
20+
set_description("Goldfish Scheme: a Scheme interpreter intended as an extension language for other applications.")
21+
22+
add_deps("liii-tbox")
23+
24+
on_load(function (package)
25+
package:addenv("PATH", "bin")
26+
package:add("deps", "argh")
27+
end)
28+
29+
on_install("bsd", "cross", "cygwin", "linux", "macosx", "mingw", "msys", "wasm", "windows", function (package)
30+
-- 在包缓存目录中构建,保持工作树干净。先把内置的 s7 源码和我们的
31+
-- port/xmake.lua(定义了 libgoldfish 静态库 target)拷进缓存目录,
32+
-- 再交给 package.tools.xmake 构建。这里必须由我们自己放置 xmake.lua,
33+
-- 否则 xmake 会自动生成默认工程(把 s7.c 误当成二进制 target 链接,
34+
-- 报缺少 _main)。
35+
-- {curdir = curdir} 告诉 package.tools.xmake 在该缓存目录下执行
36+
-- xmake f/build/install。
37+
local curdir = package:cachedir()
38+
os.cp(path.join(goldfish_src, "*.c"), curdir)
39+
os.cp(path.join(goldfish_src, "*.h"), curdir)
40+
io.writefile(path.join(curdir, "xmake.lua"), [[
41+
add_rules("mode.release", "mode.debug")
42+
43+
target("libgoldfish") do
44+
set_kind("$(kind)")
45+
set_languages("c11")
46+
add_defines("WITH_SYSTEM_EXTRAS=0")
47+
if not is_plat("wasm") then
48+
add_defines("HAVE_OVERFLOW_CHECKS=0")
49+
end
50+
add_defines("WITH_WARNINGS")
51+
add_defines("WITH_R7RS=1")
52+
set_basename("goldfish")
53+
add_files(
54+
"s7.c",
55+
"s7_continuation.c",
56+
"s7_ctables.c",
57+
"s7_dtoa.c",
58+
"s7_module.c",
59+
"s7_op_names.c",
60+
"s7_scheme_base.c",
61+
"s7_scheme_char.c",
62+
"s7_scheme_complex.c",
63+
"s7_scheme_format.c",
64+
"s7_scheme_inexact.c",
65+
"s7_scheme_predicate.c",
66+
"s7_scheme_symbol.c",
67+
"s7_scheme_write.c",
68+
"s7_liii_bitwise.c",
69+
"s7_liii_hash_table.c",
70+
"s7_liii_list.c",
71+
"s7_liii_string.c",
72+
"s7_liii_vector.c"
73+
)
74+
add_headerfiles("$(curdir)/s7.h")
75+
add_includedirs(".", {public = true})
76+
if is_plat("windows") then
77+
set_optimize("faster")
78+
add_cxxflags("/fp:precise")
79+
end
80+
if is_mode("debug") then
81+
add_defines("S7_DEBUGGING")
82+
end
83+
add_packages("liii-tbox")
84+
end
85+
]])
86+
local configs = {}
87+
if package:config("shared") then
88+
configs.kind = "shared"
89+
end
90+
import("package.tools.xmake").install(package, configs, {curdir = curdir})
91+
end)
92+
93+
on_test(function (package)
94+
assert(package:check_csnippets([[
95+
static s7_pointer old_add; /* the original "+" function for non-string cases */
96+
static s7_pointer old_string_append; /* same, for "string-append" */
97+
98+
static s7_pointer our_add(s7_scheme *sc, s7_pointer args)
99+
{
100+
/* this will replace the built-in "+" operator, extending it to include strings:
101+
* (+ "hi" "ho") -> "hiho" and (+ 3 4) -> 7
102+
*/
103+
if ((s7_is_pair(args)) &&
104+
(s7_is_string(s7_car(args))))
105+
return(s7_apply_function(sc, old_string_append, args));
106+
return(s7_apply_function(sc, old_add, args));
107+
}
108+
]], {includes = "s7.h"}))
109+
end)
110+
package_end()
10111

11112
target ("goldfish") do
12113
set_languages("c++17")

xmake/packages/s/s7/port/xmake.lua

Lines changed: 0 additions & 78 deletions
This file was deleted.

xmake/packages/s/s7/xmake.lua

Lines changed: 0 additions & 58 deletions
This file was deleted.

xmake/tests.lua

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ function add_target_cpp_test(filepath, dep1, dep2)
2929
if not is_plat("windows") then
3030
add_syslinks("pthread")
3131
end
32-
add_packages("s7")
32+
add_packages("goldfish")
3333
add_packages("liii-pdfhummus")
3434

3535
add_includedirs({"$(builddir)", "tests/Base"})
@@ -78,7 +78,7 @@ function add_target_cpp_bench(filepath, dep)
7878
if not is_plat("windows") then
7979
add_syslinks("pthread")
8080
end
81-
add_packages("s7")
81+
add_packages("goldfish")
8282
add_packages("liii-pdfhummus")
8383

8484
add_includedirs({"$(builddir)", "tests/Base"})

0 commit comments

Comments
 (0)