我正在构建一个由主二进制文件和许多 .so 插件组成的项目。每个 .so 插件都链接到一个特定的库,它们都将“通用”API 导出到主二进制文件,然后 dlopen() 将它们打开。
例如,如果基本 Linux 发行版有 10 多个不同的声音输出库,我将有 10 个声音输出 .so 插件,为主二进制文件提供相同的 API,因此如果其中 9 个插件由于未安装库而无法 dlopen(),这也没关系:成功 dlopen() 只需 1 个就足够了。这就是为什么我将 ${shlibs:Depends} 放入“Recommends:”而不是“Depends:”的原因。
不幸的是,这还会将主二进制文件的依赖项置于“推荐:”中,而这并不是我真正想要的。有没有办法将 ${shlibs:Depends} 拆分成几部分?如果我可以按二进制名称拆分它,例如 ${shlibs:Depends(main_binary)}、${shlibs:Depends(solib1.so)} 等,那会很有帮助。但按模式拆分也可以。
那么有没有什么办法可以分割这些变量呢?
答案1
您可以通过指定适当的参数来实现这一点dpkg-shlibdeps
;在您的例子中,例如
dpkg-shlibdeps -dDepends -emain_binary \
-dRecommends -esolib1.so -esolib2.so ...
然后在适当的位置使用${shlibs:Depends}
和。${shlibs:Recommends}
如果您使用dh
覆盖,请使用
override_dh_shlibdeps:
dpkg-shlibdeps ...
您可以在以下位置找到一个(稍微复杂一些的)示例葡萄酒包装。它将dh_shlibdeps
再次运行,因为它的dpkg-shlibdeps
覆盖仅处理一个包。
答案2
根据 Stephen Kitt 的回答,我做了以下覆盖:
override_dh_shlibdeps:
dh_shlibdeps -X.so
dh_shlibdeps -- -dRecommends -pshlibs-
第一个为不包括.so插件文件的主要二进制文件创建${shlibs:Depends},第二个创建${shlibs-:Recommends}。
请注意,我必须将 var 前缀修改为“shlibs-”,以便第二次调用 dpkg-shlibdeps 不会覆盖第一次调用的结果。看来,仅使用 -d 指定新后缀不足以防止覆盖:在生成 ${shlibs:Recommends} 之前,它会出于某种原因删除所有 ${shlibs:*}。但使用 -p 修改前缀可以解决问题。