Files
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

6.2 KiB
Raw Permalink Blame History

打包(CPack → .deb)

用 CMake 的 CPack 生成 .deb,配置在 cmake/Packaging.cmake。

三条命令

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)。

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)。首次启动时在设置界面里按需下载, 也可以装完之后跑:

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 找到它们、 识别为同包文件,因此不会产生外部依赖。

需要手动补依赖时:

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)。

关掉它(包变小,但安装后的机器上流式后端起不来):

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 可以少编测试

例:

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/ 目录;本地分发和内部部署用现在这套就够。