Files
live-caption/docs/packaging.md
T
blumia 8b9a8c420e chore(pack): add CPack configuration to build a deb package
Add install rules and CPack settings so cpack produces an installable
.deb. Dependencies are derived with dpkg-shlibdeps, so they follow the
binaries. The sherpa-onnx runtime the streaming backend needs is bundled
because no distro package provides it. The fetch-models script now also
locates its registry when installed system-wide.

增加 CPack 配置,可直接用 cpack 打出 deb:安装规则含桌面入口、应用图标、
模型注册表与下载脚本、用户文档;依赖由 dpkg-shlibdeps 自动推导;流式后端
需要的 sherpa-onnx 运行时(发行版无对应包)随包携带;fetch-models 脚本
装到系统后也能找到注册表。
2026-10-13 11:53:07 +08:00

145 lines
6.2 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.
# 打包(CPack → .deb)
用 CMake 的 CPack 生成 `.deb`,配置在 [`cmake/Packaging.cmake`](../cmake/Packaging.cmake)。
## 三条命令
```bash
cmake -S . -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build -j
(cd build && cpack) # 默认生成器就是 DEB,等价于 cpack -G DEB
```
产物:`build/live-caption_<版本>-<修订>_<架构>.deb`,例如 `live-caption_0.1.0-1_amd64.deb`(约 11MB)。
```bash
dpkg -c build/live-caption_0.1.0-1_amd64.deb # 看文件清单
dpkg -I build/live-caption_0.1.0-1_amd64.deb # 看控制信息与依赖
sudo apt install ./build/live-caption_0.1.0-1_amd64.deb
sudo apt remove live-caption # 卸载(模型文件与用户设置不会被删)
```
> 用 `apt install ./xxx.deb` 而不是 `dpkg -i`:apt 会把上面自动推导出来的依赖一起装好。
## 包内容
| 路径 | 说明 |
|---|---|
| `/usr/bin/live-caption` | 图形界面(悬浮窗 + 托盘 + 设置) |
| `/usr/bin/live-caption-cli` | 命令行版(单文件/流式文件/无窗口实时) |
| `/usr/bin/live-caption-fetch-models` | 命令行下载模型(`scripts/fetch-models.sh` 装的) |
| `/usr/lib/live-caption/` | 包私有共享库:`libsherpa-onnx-c-api.so`、`libonnxruntime.so` |
| `/usr/share/applications/live-caption.desktop` | 应用菜单入口 |
| `/usr/share/icons/hicolor/scalable/apps/live-caption.svg` | 图标 |
| `/usr/share/live-caption/models.json` | 模型注册表(给上面的下载脚本用;程序自己也内嵌了一份) |
| `/usr/share/doc/live-caption/` | README 与用户文档 |
**模型不随包分发**(注册表里有 4 个、合计约 2.4GB)。首次启动时在设置界面里按需下载,
也可以装完之后跑:
```bash
live-caption-fetch-models # 列出模型与安装状态
live-caption-fetch-models --all # 全部下载
```
## 依赖是怎么确定的
`CPACK_DEBIAN_PACKAGE_SHLIBDEPS ON` —— 用 `dpkg-shlibdeps` 直接扫二进制,推导出:
```
Depends: libc6 (>= 2.34), libgcc-s1 (>= 4.0), libllama0 (>= 9951+dfsg), libpulse0 (>= 0.99.1),
libqt6core6 (>= 6.8.0), libqt6gui6 (>= 6.1.2), libqt6network6 (>= 6.1.2),
libqt6widgets6 (>= 6.3.0), libsamplerate0 (>= 0.1.7), libstdc++6 (>= 11)
```
这比手写列表可靠(跟着二进制走,不会漏)。`libllama0` 同时提供 `libllama`、`libmtmd`
和 `libllama-common`,所以一个依赖就够。
包内自带的 sherpa 库是**私有库**:`dpkg-shlibdeps` 通过二进制的 RPATH 找到它们、
识别为同包文件,因此不会产生外部依赖。
需要手动补依赖时:
```bash
cmake -S . -B build -DLC_DEB_EXTRA_DEPENDS="foo (>= 1.2), bar"
```
## 为什么打包带上 sherpa-onnx
流式 ONNX 后端(zipformer / X-ASR / Nemotron)依赖 `libsherpa-onnx-c-api.so` 与
`libonnxruntime.so`。官方只发预编译 tar 包,**发行版里没有对应包可依赖**,所以默认随包携带
(约 32MB 未压缩,deb 里压到约 10MB)。
关掉它(包变小,但安装后的机器上流式后端起不来):
```bash
cmake -S . -B build -DLC_BUNDLE_SHERPA=OFF # 包约 0.5MB,只剩 llama 后端可用
```
许可:sherpa-onnx 是 Apache-2.0,ONNX Runtime 是 MIT,都可以再分发;官方 tar 包里没带
LICENSE 文件,自己分发时建议一并附上。
## RPATH:两个必须写进二进制的路径
安装后的二进制带这样的 RUNPATH:
```
$ORIGIN/../lib/live-caption:/usr/lib/x86_64-linux-gnu/llama
```
两条都有原因:
1. `$ORIGIN/../lib/live-caption` —— 找包内自带的 sherpa 库。用 `$ORIGIN` 相对路径,
包装到哪个前缀都能用,也不需要 `ldconfig`。
2. `/usr/lib/x86_64-linux-gnu/llama` —— `libllama.so.0` / `libmtmd.so.0` 在发行版里放在
**子目录** `llama/` 里,而该目录不在 ld 的默认搜索路径(`ldconfig -p` 里看不到它们),
也没有 `/etc/ld.so.conf.d` 条目。所以只能靠 RPATH,否则装完直接起不来。
## 可调选项
| 选项 | 默认 | 说明 |
|---|---|---|
| `LC_INSTALL` | `ON` | 生成安装与打包规则 |
| `LC_BUNDLE_SHERPA` | `ON` | 把 sherpa-onnx 运行时打进包 |
| `LC_PACKAGE_STRIP` | `OFF` | 打包时 strip 二进制。发布建议打开;**要用 coredump 调符号就保持关闭** |
| `LC_DEB_MAINTAINER` | 占位值 | Debian `Maintainer` 字段,发布前改成真人 |
| `LC_DEB_HOMEPAGE` | 空 | Debian `Homepage` 字段;留空则不写这一行 |
| `LC_DEB_EXTRA_DEPENDS` | 空 | 覆盖/追加 `Depends` |
| `LC_BUILD_TESTS` | `ON` | 打包时用 `-DLC_BUILD_TESTS=OFF` 可以少编测试 |
例:
```bash
cmake -S . -B build -DCMAKE_BUILD_TYPE=Release \
-DLC_BUILD_TESTS=OFF -DLC_PACKAGE_STRIP=ON \
-DLC_DEB_MAINTAINER="你的名字 <you@example.com>" \
-DLC_DEB_HOMEPAGE="https://example.com/live-caption"
(cd build && cpack)
```
## 版本号与修订号
版本来自顶层 `CMakeLists.txt` 的 `project(live-caption VERSION x.y.z)`,
Debian 修订号是 `LC_...`/`CPACK_DEBIAN_PACKAGE_RELEASE`(当前 `1`),
所以包名形如 `live-caption_0.1.0-1_amd64.deb`。升级时改 `project(... VERSION)`。
## 排错
- **`找不到 libmtmd`**:需要 `libllama0`(提供 `libmtmd.so.0`),与开发时同一个包。
- **装完之后 `live-caption` 报找不到 `libllama.so.0`**:说明 RPATH 丢了。用
`readelf -d /usr/bin/live-caption | grep RUNPATH` 确认里面有
`/usr/lib/x86_64-linux-gnu/llama`。
- **流式模型报加载失败**:确认 `/usr/lib/live-caption/` 下有那两个 `.so`(即打包时
`LC_BUNDLE_SHERPA` 没关掉)。
- **菜单里没有图标/条目**:`sudo update-desktop-database /usr/share/applications`、
`sudo gtk-update-icon-cache -f /usr/share/icons/hicolor`(`postinst` 里已经会自动做,
但某些桌面环境需要重新登录)。
## 与 Debian 原生打包的关系
这是 **CPack 生成的二进制包**,不是用 `debian/` + `dh` 源码构建的 Debian 官方包。
差异:没有源码包(`.dsc`/`.orig.tar.gz`)、没有 `debian/changelog`、没有 split 调试包
(`-dbg`)、也没走 `dh_*` 的一整套规范化。
要往发行版仓库里送包的话,需要另配 `debian/` 目录;本地分发和内部部署用现在这套就够。