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

Nic*_*mer 16 packaging

我正在为一个包编写一个 Ubuntu 包,该包本质上提供了许多库和头文件,然后用于构建其他软件。包也分解成相互依赖的较小的子包;从这个意义上说,该包与 boost 非常相似。

我注意到像 boost 这样的包提供

[...]
libboost-dbg
libboost-dev
libboost-doc
[...]
libboost-all-dev
[...]
Run Code Online (Sandbox Code Playgroud)

但没有任何名称boostlibboost.

  • 这背后的想法是什么?
  • 什么是的目的-dbg-dev-doc包?
  • 是否提供了有关如何为这些包编写构建文件的任何说明?

and*_*ing 15

理念与目的

分离这些不同包的主要原因与磁盘空间和下载速度有关。特别是,它是镜像空间的一个大问题,因为它意味着分发数据的多个副本。通过使foo-commonfoo-datafoo-docArchitecture: all,我们只保留在档案中的数据的一个副本,而不是让它与每个架构复制(如I386,AMD64,等...)。大多数用户不需要调试符号,最终只会使包下载花费更长的时间。

对于官方 Ubuntu 档案中的包,实际上没有理由-dbg手动创建包。构建机器会自动-dbgsym去除调试符号并将它们放入托管在 ddebs.ubuntu.com 上的包中。(请参阅:调试符号包-dbg确实存在的包通常只是从 Debian 继承而来。

指示

至于实现,看看这个问题:

简而言之,需要debian/control为每个包创建新的节。然后还debian/foo-*.install需要创建文件。这将允许dh_install将正确的内容放入正确的包中。

foo.install主二进制包看起来像:

usr/bin/
usr/lib/
Run Code Online (Sandbox Code Playgroud)

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

/usr/share/doc/
/usr/share/icons/
/usr/share/foo/
/usr/share/locale/
Run Code Online (Sandbox Code Playgroud)

而对于foo-dev

/usr/include/
/usr/lib/pkgconfig
/usr/lib/*.so
Run Code Online (Sandbox Code Playgroud)

创建foo-dbg包需要编辑,debian/rules因为通常dh_strip会删除调试符号。所以我们需要覆盖该行为:

.PHONY: override_dh_strip
override_dh_strip:
        dh_strip --dbg-package=foo-dbg
Run Code Online (Sandbox Code Playgroud)


Gil*_*il' 13

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 的回答提供了有关这些-dbg软件包的更多信息。

此外,精确包含库的旧版本libssl0.9.8,因为有些程序仍然链接到旧版本。

您可能会看到的其他软件包是针对 C 以外语言的绑定。 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 Policy ManualDeveloper's Reference;有关介绍,请参阅新维护者指南。忽略有关使用 Debian 项目等的部分,只需阅读有关制作软件包的部分。dh_make 是开始使用 deb 包的好方法(您需要选择“库”)。