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


15

我正在为一个软件包编写一个Ubuntu软件包,该软件包实际上提供了许多库和头文件,然后可用于构建其他软件。程序包也分成相互依存的较小子程序包。从这个意义上说,该软件包与boost十分相似。

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

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

但是没有任何名字boost或名称libboost

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

Answers:


13

理念与宗旨

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

对于官方Ubuntu档案中的软件包,实际上没有理由-dbg手动创建软件包。构建机器会自动清除调试符号,并将其放入-dbgsymddebs.ubuntu.com上托管的软件包中。(请参阅:Debug Symbol Packages-dbg确实存在的软件包通常是从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

12

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软件包的更多信息。

此外,precise包含该库的旧版本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软件包的好方法(您需要选择“ Library”)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.