如何以及为什么创建-dbg、-dev和-doc软件包?

我正在为一个Ubuntu软件包编写代码,这个软件包主要提供一些库和头文件,可以用来构建其他软件。该软件包还分解成几个互相依赖的子软件包;从这个意义上说,该软件包与boost非常相似。
我注意到像boost这样的软件包提供了一些功能。
[...]
libboost-dbg
libboost-dev
libboost-doc
[...]
libboost-all-dev
[...]

但是没有任何名为boostlibboost的东西。
  • 这背后的理念是什么?
  • -dbg-dev-doc软件包的目的是什么?
  • 是否提供了有关如何编写这些软件包的构建文件的说明?
2个回答

理念与目的

将这些不同的软件包分开的主要原因与磁盘空间和下载速度有关。特别是对于镜像空间来说,这是一个很大的问题,因为它意味着分发多个数据副本。通过将foo-commonfoo-datafoo-doc软件包设置为Architecture: all,我们只在存档中保留一个数据副本,而不是每个架构(例如i386、amd64等)都复制一份。大多数用户不需要调试符号,只会导致软件包下载时间变长。

对于官方Ubuntu存档中的软件包,实际上没有必要手动创建-dbg软件包。构建机器会自动剥离调试符号并将其放入托管在ddebs.ubuntu.com上的-dbgsym软件包中。(参见:调试符号软件包)现有的-dbg软件包通常只是从Debian中继承过来的。

说明

关于实施,请参考以下问题:

简而言之,需要在每个软件包的debian/control中创建新的段落。然后还需要创建debian/foo-*.install文件。这样可以让dh_install将正确的内容放入正确的软件包中。

主二进制软件包的foo.install可能如下所示:

usr/bin/
usr/lib/

foo-common.install, foo-data.install, foo-doc.install, 或者其他任何:

/usr/share/doc/
/usr/share/icons/
/usr/share/foo/
/usr/share/locale/

对于foo-dev
/usr/include/
/usr/lib/pkgconfig
/usr/lib/*.so

创建foo-dbg软件包需要编辑debian/rules,因为通常dh_strip会剥离调试符号。所以我们需要覆盖这个行为:
.PHONY: override_dh_strip
override_dh_strip:
        dh_strip --dbg-package=foo-dbg

进一步阅读:http://wiki.debian.org/DebugPackage

Boost是一个复杂的例子,让我们先看一个更简单的例子。
准确地说,openssl源代码包提供了5个二进制包:
  • libssl1.0.0 包含 OpenSSL 动态库,版本为 1.0.0。这是链接到该库的程序运行所需的内容。包名中包含版本号是因为您可能同时安装了其他版本的库,如果您有其他链接到与 1.0.0 不兼容的另一个版本的程序。
  • openssl 包含使用 OpenSSL 库的命令行工具。即使您有多个版本的库,您也不需要多个版本的这些工具:只有一个 /usr/bin/openssl 及其相关工具、数据和文档。
  • libssl-dev 包含编译链接到 OpenSSL 的程序所需的文件。其中包括 C 头文件(*.h)、用于链接的库文件(*.a*.so)以及一些杂项文件。
  • libssl-doc 包含 OpenSSL 库的文档。只有在您要编写使用该库的程序时才需要此包。
  • libssl1.0.0-dbg 包含调试符号。它只对调试 OpenSSL 库或使用该库的程序的人有用。andrewsomething's answer 中有关于这些 -dbg 包的更多信息。
此外,precise包含了一个较旧版本的库libssl0.9.8,因为仍有一些程序与该较旧版本链接在一起。
你可能会看到其他语言的绑定包,这是因为OpenSSL并不附带任何绑定(虽然有其他语言的OpenSSL绑定,但它们并非来自同一源代码)。一个例子是sqlite3,它附带了TCL绑定
将包拆分成这样的主要原因是不同的包面向不同的用户群体。一个从不编译任何东西的系统只需要核心lib包,也许还需要命令行工具;如果需要,它们将自动从依赖项中安装。如果有人想编译使用该库的程序,他们需要-dev包。如果有人想编写使用该库的程序,他们需要-doc包。
那么Boost呢?它遵循相同的结构,但由于Boost是一个庞大的库,它被分成许多较小的包:libboost-*1.46.1libboost-*1.46-dev。确切地说,Boost只有一个版本1.46,但Oneiric同时拥有1.421.46两个版本。还有一个元包boost-defaults,它作为依赖项引入了带有版本号的包。
看着libhangul,除了动态库包libhangul1和开发包libhangul-dev之外,还有一个包libhangul-data。这个包含了库所需的额外数据。即使你有多个版本的库,它们可以共享-data包。此外,该包是与架构无关的。包含大量与架构无关的数据的软件会被分成与架构相关和与架构无关的包,以节省发布站点上的空间。另一个具有类似意义的后缀是-common
Ubuntu和Debian的打包规则非常相似,因此有关制作Debian软件包的材料也适用于Ubuntu。实际上,你可以为Debian和Ubuntu使用相同的源码软件包;唯一让Debian和Ubuntu软件包不同的是编译它们时所依赖的库版本不同,这与不同版本的Ubuntu之间的差异无异。请准备好Debian开发者文档,特别是Debian政策手册开发者参考资料;可以参考新维护人员指南进行入门。忽略与Debian项目合作等方面的内容,只需阅读有关制作软件包的部分。使用dh_make是开始创建deb软件包的好方法(你需要选择“Library”选项)。