我正在为一个软件包编写 Ubuntu 软件包,该软件包本质上提供了许多库和头文件,然后可用于构建其他软件。该软件包还分解为相互依赖的较小子软件包;从这个意义上讲,该软件包与 boost 非常相似。
我注意到 boost 等软件包提供了
[...]
libboost-dbg
libboost-dev
libboost-doc
[...]
libboost-all-dev
[...]
但没有任何与名称boost
或相符的东西libboost
。
- 这背后的想法是什么?
-dbg
、-dev
和包的用途是什么-doc
?- 是否提供了关于如何为这些包编写构建文件的说明?
答案1
理念与目的
将这些不同的软件包分开的主要原因与磁盘空间和下载速度有关。特别是,镜像空间是一个很大的问题,因为这意味着分发数据的多个副本。通过制作foo-common
、foo-data
或 foo-doc
软件包Architecture: all
,我们只在档案中保留一份数据副本,而不是将其与每个架构一起复制(例如 i386、amd64 等)。大多数用户不需要调试符号,这只会使软件包下载时间更长。
对于 Ubuntu 官方档案中的软件包,实际上没有必要手动创建-dbg
软件包。构建机器会自动删除调试符号并将其放入-dbgsym
托管在 ddebs.ubuntu.com 上的软件包中。(参见:调试符号包)-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
答案2
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.1
和libboost-*1.46-dev
。确切地说,Boost 只有一个版本,1.46,但 Oneiric 兼具1.42和1.46. 还有一个元包升压默认值将版本化包作为依赖项引入。
看着利汉古尔,除了动态库包libhangul1
和开发包外libhangul-dev
,还有一个包libhangul-data
。此包包含库所需的附加数据。即使您有多个版本的库,它们也可以共享此-data
包。此外,此包与体系结构无关。包含大量与体系结构无关的数据的软件被拆分为与体系结构相关的包和与体系结构无关的包,以节省分发站点的空间。另一个具有类似含义的后缀是-common
。
Ubuntu 和 Debian 的打包规则非常相似,因此有关制作 Debian 软件包的内容也适用于 Ubuntu。事实上,您可以为 Debian 和 Ubuntu 使用相同的源包;Debian 和 Ubuntu 软件包的唯一区别在于它们针对不同的库版本进行编译,而这只不过是 Ubuntu 不同版本之间的区别。Debian 开发者文档尤其是Debian 政策手册和开发人员参考;参见新维护者指南了解简介。忽略有关使用 Debian 项目等的部分,只需阅读有关制作软件包的部分。dh_make
是开始使用 deb 包的一个好方法(您需要选择“库”)。