为 Debian/Ubuntu 使用基于 cmake 的构建系统打包 Mapnik 插件时清空 ${shlibs:Depends}
Empty ${shlibs:Depends} while packaging a Mapnik plugin with cmake-based build system for Debian/Ubuntu
我正在创建一个 Mapnik 插件 (https://github.com/rbuch703/coords-mapnik-plugin),目前正在为 Debian/Ubuntu 打包它。二进制包仅包含一个从 C++ 代码构建的共享库。但作为一个 Mapnik 插件,这个库遵循与通常的 POSIX 库约定完全不同的约定:
- 文件名必须是
<name>.input
而不是 lib<name>.so
- 文件安装在Mapnik插件目录中(通常
/usr/lib/mapnik/input
)
- 文件不应该被
ldconfig
找到,而是 Mapnik 试图在运行时自己找到插件
现在插件的构建系统是 cmake
,这使得 Debian 打包的大部分内容都很简单:debian/rules
文件只包含基本行:
#!/usr/bin/make -f
%:
dh $@
但是,我 运行 遇到替换变量 {shlibs:Depends} 的问题:它根本没有设置(特别是 debian/<package name>.substvars
文件中没有相应的行), Lintian 正确地抱怨了这个事实(Lintian 的实际抱怨是 missing-dependency-on-libc
。但是当我手动添加 libc 依赖项时,Lintian 解释说 package-depends-on-hardcoded-libc
,这意味着 "The given package declares a dependency on libc directly instead of using ${shlibs:Depends} in its debian/control stanza.")。很想满足林天的敬意,却做不到。
现在我发现我可以添加行
dpkg-shlibdeps debian/<packagename>/usr/lib/mapnik/input/coords.input
到我的 rules
文件。这将创建正确的 ${shlibs:Depends}
行,但它会在错误的文件中创建它(debian/substvars
而不是 debian/<package name>.substvars
),构建系统只是忽略它并且 Lintian 一直抱怨缺少依赖项.
我猜我的问题的根源是我的 Mapnik 插件不符合 POSIX 库命名约定(作为 Mapnik 插件不能这样做),因此打包系统不正确处理。但是我不知道如何解决这个问题。
补充说明:
- 包是使用
debuild
构建的。除了 Lintian 错误消息外,构建过程工作正常并正确创建 .deb
包。
- 我的实际目标是在 Launchpad 上干净地构建包,这样我就可以将它添加到我的 Ubuntu PPA 中。
您可以使用 -T
标志为 dpkg-shlibdeps
提供输出文件。
类似于:
override_dh_shlibdeps:
dh_shlibdeps
dpkg-shlibdeps \
-Tdebian/<packagename>.substvars \
debian/<packagename>/usr/lib/mapnik/input/coords.input
如果有多个 *.input 文件,你也可以这样做:
override_dh_shlibdeps:
dh_shlibdeps
find debian/<packagename>/ -name "*.input" -exec \
dpkg-shlibdeps -Tdebian/<packagename>.substvars {} +
我正在创建一个 Mapnik 插件 (https://github.com/rbuch703/coords-mapnik-plugin),目前正在为 Debian/Ubuntu 打包它。二进制包仅包含一个从 C++ 代码构建的共享库。但作为一个 Mapnik 插件,这个库遵循与通常的 POSIX 库约定完全不同的约定:
- 文件名必须是
<name>.input
而不是lib<name>.so
- 文件安装在Mapnik插件目录中(通常
/usr/lib/mapnik/input
) - 文件不应该被
ldconfig
找到,而是 Mapnik 试图在运行时自己找到插件
现在插件的构建系统是 cmake
,这使得 Debian 打包的大部分内容都很简单:debian/rules
文件只包含基本行:
#!/usr/bin/make -f
%:
dh $@
但是,我 运行 遇到替换变量 {shlibs:Depends} 的问题:它根本没有设置(特别是 debian/<package name>.substvars
文件中没有相应的行), Lintian 正确地抱怨了这个事实(Lintian 的实际抱怨是 missing-dependency-on-libc
。但是当我手动添加 libc 依赖项时,Lintian 解释说 package-depends-on-hardcoded-libc
,这意味着 "The given package declares a dependency on libc directly instead of using ${shlibs:Depends} in its debian/control stanza.")。很想满足林天的敬意,却做不到。
现在我发现我可以添加行
dpkg-shlibdeps debian/<packagename>/usr/lib/mapnik/input/coords.input
到我的 rules
文件。这将创建正确的 ${shlibs:Depends}
行,但它会在错误的文件中创建它(debian/substvars
而不是 debian/<package name>.substvars
),构建系统只是忽略它并且 Lintian 一直抱怨缺少依赖项.
我猜我的问题的根源是我的 Mapnik 插件不符合 POSIX 库命名约定(作为 Mapnik 插件不能这样做),因此打包系统不正确处理。但是我不知道如何解决这个问题。
补充说明:
- 包是使用
debuild
构建的。除了 Lintian 错误消息外,构建过程工作正常并正确创建.deb
包。 - 我的实际目标是在 Launchpad 上干净地构建包,这样我就可以将它添加到我的 Ubuntu PPA 中。
您可以使用 -T
标志为 dpkg-shlibdeps
提供输出文件。
类似于:
override_dh_shlibdeps:
dh_shlibdeps
dpkg-shlibdeps \
-Tdebian/<packagename>.substvars \
debian/<packagename>/usr/lib/mapnik/input/coords.input
如果有多个 *.input 文件,你也可以这样做:
override_dh_shlibdeps:
dh_shlibdeps
find debian/<packagename>/ -name "*.input" -exec \
dpkg-shlibdeps -Tdebian/<packagename>.substvars {} +