# 打包(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="你的名字 " \ -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/` 目录;本地分发和内部部署用现在这套就够。