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 脚本
装到系统后也能找到注册表。
This commit is contained in:
blumia committed 2026-10-13 11:53:07 +08:00
1 parent 898763eb74
commit 8b9a8c420e
9 files changed
+401 -5

No files matched your search

+144
View File
@@ -0,0 +1,144 @@
# 打包(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/` 目录;本地分发和内部部署用现在这套就够。