myxce/DEPS.md
lei.chen 017f41a010 build(packaging): bundle ttyd prebuilt; record license-compliance notes (DEPS.md)
ttyd is the interactive-job launcher for worker TTY/DISPLAY modes: the
worker resolves it next to its own binary (inter_job_utils.c
readlink(/proc/self/exe) + /ttyd, /opt/xce/bin/ttyd fallback), so a
tarball without bin/ttyd silently loses -I/--tty on the target host.
The packager now picks it up from $BUILD_DIR/worker/ttyd first, then
/opt/xce/bin/ttyd, and warns loudly if neither exists.

NB it is NOT an upstream release: this is rshen's modified ttyd (version
string 1.7.7-eccebc6), and the binary we bundle today is that same
modified build. Source lands in-tree later and moves to a meson target;
the packager already prefers a build-dir copy for that day.

DEPS.md: document the ttyd situation (including the MIT-compatibility
audit needed before commercial distribution) and record the user-flagged
license note on bundling libhwloc/libedit/libtirpc -- fine for the
development/test rollout, needs a per-item license audit (bundled
LICENSE file at minimum) before commercial release.

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-21 03:33:10 +00:00

98 lines
6.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# XCE 第三方依赖清单
> 建立:2026-10-20(build/de-nix 分支)。背景与决策见 gaps.md "六、构建/分发系统"。
>
> **原则**:系统库优先(apt/发行版包),发行版没有的用 meson wrap subproject 从源码构建;
> 运行期需要自带的库由打包脚本 bundle(`$ORIGIN` RPATH),不引入 /nix/store 或任何
> 内容寻址二进制闭包。glibc/libm/libpthread/pthread 永不 bundle。
## 构建工具链
| 工具 | 最低版本 | 获取 | 备注 |
|---|---|---|---|
| gcc | 13 | 系统包 | `apt install gcc`(glibc 2.39+ 基线) |
| meson | 1.5 | `pip install meson` / `apt install meson`(≥1.3 时 pip 补) | src/meson.build 要求 >=1.5 |
| ninja | 1.11 | `apt install ninja-build` | meson 默认 backend |
| pkg-config | 0.29 | `apt install pkg-config` | |
| go | 1.22 | 上游 tarball / `apt install golang-go` | apiserver/xcecli 已 vendor 全部模块,构建离线 |
| capnp (capnproto) | 1.0.1 | `apt install capnproto`(含 libcapnp-dev) | schema 编译器 + C++ 运行时(pycapnp 链接用) |
| packcc | 2.2 | wrap subproject(Ubuntu 24.04 无包) | 3 个 .peg 解析器(lib/section, rusage, xce_resreq, xce_select) |
| python3 | 3.10 | 系统自带 | xceadmin 构建/测试;no-fork rule 检查脚本 |
| swag | latest | `go install github.com/swaggo/swag/cmd/swag@latest` | 仅 apiserver 文档再生成时需要,非构建必需 |
## C 库依赖
### apt 可直接安装(11 个)
| 依赖 (meson 名) | apt 包 | 版本下限 | 用途 |
|---|---|---|---|
| libuv | libuv1-dev | >=1.44 | 所有 daemon 事件循环 |
| openssl | libssl-dev | >=3.0 | TLS(controller 互联、apiserver)、SHA256 |
| libedit | libedit-dev | >=3.1 | xce_test REPL(BSD 许可,替代 GPL readline) |
| sqlite3 | libsqlite3-dev | >=3.37 | worker 本地状态 |
| hwloc | libhwloc-dev | >=2.8 | worker 拓扑/槽位 |
| libcgroup | libcgroup-dev | >=2.0 | worker cgroup v2 限额 |
| libtirpc | libtirpc-dev | >=1.3 | rpc 头文件 |
| libcyaml | libcyaml-dev | >=1.2 | YAML 配置读取 |
| yaml-0.1 | libyaml-dev | >=0.2.5 | 同上(libcyaml 依赖) |
| zlib | zlib1g-dev | >=1.2.11 | 压缩 |
| threads/math/rt | (libc) | — | 无需安装 |
### apt 没有 → meson wrap subproject(源码随 repo 拉取构建,6 个)
| 依赖 (meson 名) | 上游 | 版本 | 用途 / 备注 |
|---|---|---|---|
| c-capnproto | github:shen390s/c-capnproto(pin e45ff68) | — | Cap'n Proto C runtime(libCapnC_Runtime)+ capnpc-c 代码生成器;32 个源文件 include capnp_c.h |
| librtti | git+ssh gitea rshen/librtti(pin 2149f778) | 0.0.2 | C 运行时类型信息库;上游本身是零依赖 meson 项目;93 个源文件消费 |
| struct2json | xbuild channel 源码 vendor | 1.0.0 | cJSON + s2j 封装(纯静态库);6 个 meson 消费点 |
| tinylog | xbuild channel 源码 vendor | 1.0.0 | 轻量异步日志(-ltlog + tlog.h);13 个源文件消费 |
| unity | xbuild channel 源码 vendor(上游 ThrowTheSwitch/Unity) | 2.6.1 | 单元测试框架(libunity.a + unity/unity.h);仅测试目标链接 |
| packcc | 上游 arithy/packcc | >=2.2 | PEG 解析器生成器;构建工具而非链接库 |
### 特殊:ttyd(预编译二进制,源码待入库)
交互作业启动器(worker TTY/DISPLAY 模式经它拉起会话,`inter_job_utils.c` 按
`/proc/self/exe` 同目录解析)。**不是官方 release**:是 rshen 修改过的 ttyd
(版本串 `1.7.7-eccebc6`,与上游 1.7.7 不同),当前环境里已构建好的那一份也是
这个修改版。现阶段打包脚本直接拾取该预编译静态二进制进 tarball
(`bin/ttyd`);源码后续提供后入库并转为 meson 目标构建,届时删除本条。
**合规注意**:ttyd 上游是 MIT,但修改版引入的改动未审计,商业分发前需确认
全部改动兼容 MIT 并保留版权声明。
### 特殊:libelogind → libsystemd
worker 的 systemd transient unit 管理(`sd_bus_*`,263 处调用)目前链 nix 的 elogind 255.5。
Ubuntu 24.04 无 elogind 包,但有 **libsystemd-dev 255.4**——sd-bus API 同源兼容。
构建默认 `dependency('libsystemd')`,保留 `-Duse_elogind=true` 选项供非 systemd 平台。
(Step 2 实施时验证;这是本迁移唯一有 ABI 行为风险的替换点,worker 单测兜底。)
### Python(xceadmin)
`src/xceadmin/pyproject.toml` 已声明全部运行依赖:click>=8.0, pycapnp>=1.3, PyYAML>=6.0,
jsonschema>=4.0。构建用普通 venv(**不要** --system-site-packages——那是 nix 环境的产物):
`python3 -m venv .venv && .venv/bin/pip install .`。pycapnp 的 C 扩展链系统的
capnproto C++ 运行时(apt capnproto/libcapnp-dev 提供版本 1.0.1;pycapnp>=1.3 兼容)。
## 为什么不用 nix store(决策记录)
nix 把依赖闭包做成内容寻址的 /nix/store 路径 + mount namespace,要求闭包出现在**每一台
运行机器**上,且 patchelf 重定位后 ldd/gdb/stack trace 全部变形(t2/t3 master 进程 argv 是
`ld-linux... --library-path /opt/newxce/app/nix/store/...`,人读不懂)。EDA 客户环境没有
/nix/store,这条路在产品定义上不可用。本 repo 依赖只有十来个中小型库,"自包含"的正确形态
是**源码闭包**(wrap subproject)+ 运行期 bundle 清单,不需要二进制 store。此外 nix 的
LD_LIBRARY_PATH 泄漏会导致系统工具崩溃(t2/t3 的 ls/head segfault 实录)。
## 运行期 bundle 规则(打包脚本用)
- **bundle**:libuv、libcapnp/libCapnC_Runtime、librtti、libtlog、libstruct2json、
libcyaml、libyaml、libtirpc、libedit、libcgroup、libhwloc、libssl/libcrypto(若目标基线 <3.0)
- **永不 bundle**:libc/libm/libpthread/libdl/librt(glibc)、libsystemd(按目标发行版)
- 判定方法:对每个产物 `ldd`,凡路径不在 {/lib, /usr/lib, /lib64} 的(即 wrap 构建产物)
一律复制进 `lib/`,二进制设 `$ORIGIN/../lib` RPATH。
> **license 合规备忘(2026-10-21,用户提出)**:bundle 清单里 libhwloc 是 BSD-3,
> 但它静态/动态再分发时需保留版权与许可声明(tarball 目前未附第三方 license
> 文本);libedit 是 BSD(特意选它替代 GPL readline);libtirpc 历史上是
> BSD/Sun RPC 混合许可。**开发测试阶段沿用现分发策略没问题;商业环境发布前
> 须逐项做 license 审计**(至少:附第三方 LICENSE 汇总文件、确认 hwloc 各传递
> 依赖许可)。记录在案,暂不阻塞当前 rollout。