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

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

我注意到像boost这样的软件包

[...] libboost-dbg libboost-dev libboost-doc [...] libboost-all-dev [...] 

但没有任何名称boostlibboost

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

理念与目的

分离出这些不同包的主要原因与磁盘空间和下载速度有关。 特别是,它是镜像空间的一个大问题,因为它意味着分发多个数据副本。 通过制作foo-commonfoo-datafoo-docArchitecture: all ,我们只保留存档中的一个数据副本,而不是将其与每个架构一起复制(例如i386,amd64,等等… )。 大多数用户不需要调试符号,最终导致程序包下载时间更长。

对于官方Ubuntu存档中的软件包,实际上没有理由手动创建-dbg软件包。 构建机器会自动删除调试符号并将它们放入-dbgsym托管的-dbgsym软件包中。 (请参阅: 调试符号包 ) – 存在的-dbg包通常只是从Debianinheritance。

说明

至于实现,请看一下这个问题:

  • 如何让Debian打包生成两个包给定上游源存档?

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

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

 usr/bin/ usr/lib/ 

foo-common.installfoo-data.installfoo-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以及相关的工具,数据和文档。
  • 如果要编译链接OpenSSL的程序, libssl-dev包含所需的文件。 有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.42和1.46 。 还有一个metapackage boost-defaults将版本化的包作为依赖项。

看看libhangul ,除了动态库包libhangul1和开发包libhangul-dev ,还有一个包libhangul-data 。 此程序包包含库所需的其他数据。 即使您有多个版本的库,他们也可以共享-data包。 此外,该包与架构无关。 包含大量与体系结构无关的数据的软件分为依赖于体系结构和体系结构的软件包,以节省分发站点上的空间。 具有相似含义的另一个后缀是-common

Ubuntu和Debian的打包规则非常相似,因此制作Debian软件包的材料也适用于Ubuntu。 实际上,你可以为Debian和Ubuntu提供相同的源包; 使Debian和Ubuntu软件包不同的唯一方法是针对不同的库版本编译它们,这只不过是不同版本的Ubuntu之间的区别。 掌握Debian开发人员文档 ,尤其是Debian Policy Manual和Developer’s Reference ; 有关介绍,请参阅新维护者指南 。 忽略有关使用Debian项目的部分等等,只需阅读有关制作包的部分。 dh_make是开始使用deb包的好方法(你需要选择“Library”)。