目录
这里展示了 Debian 打包工作中针对非本土软件包使用“3.0 (quilt)”格式进行打包所遵循基本规则的一个全局性概览。
![]() |
注意 |
---|---|
为简明起见,某些细节被有意跳过。请按需查阅对应命令的手册页,例如dpkg-source(1)、dpkg-buildpackage(1)、dpkg(1)、dpkg-deb(1)、deb(5),等等。 |
Debian 源码包是一组用于构建 Debian 二进制软件包的输入文件,而非单个文件。
Debian 二进制软件包是一个特殊的档案文件,其中包含了一系列可安装的二进制数据及与它们相关的信息。
单个 Debian 源码包可能根据 debian/control 文件定义的内容产生多个 Debian 二进制软件包。
使用 “3.0 (quilt)”格式的非本土 Debian 软件包是最普通的 Debian 源码包格式。
![]() |
注意 |
---|---|
有许多封装脚本可用。合理使用它们可以帮助您理顺工作流程,但是请确保您能理解它们内部的基本工作原理。 |
创建 Debian 二进制软件包的 Debian 打包工作流涉及创建数个特定名称的文件(参见 第 5.2 节 “软件包名称和版本”),与《Debian 政策手册》的定义保持一致。
一个极其简化的 Debian 打包工作流可以概括为以下五步。
上游的源码压缩包被复制(或符号链接)至一个特定的文件名 packagename_version.orig.tar.gz。
Debian 软件包规范文件将被添加至上游源代码中,存放在 package-version/debian/ 目录下。
debian/* 目录下的必需技术说明文件:
在 package-version/ 目录中调用 debmake 命令将会提供这些配置文件的一套模板。
dpkg-buildpackage 命令(通常由它的封装命令 debuild 或 pdebuild 所使用)会在 package-version/ 目录中被调用,进而以调用 debian/rules 脚本的方式制作 Debian 源码包和二进制软件包。
使用 dpkg-source(1) 以“3.0 (quilt)”格式创建 Debian 源码包
使用“debian/rules build”构建源代码并安装到 $(DESTDIR) 中
使用 dpkg-deb(1)、dpkg-genbuildinfo(1) 和 dpkg-genchanges(1) 创建 Debian 二进制软件包。
使用 lintian 命令检查 Debian 软件包的质量。(推荐)
遵守 ftp-master 的拒绝(rejection)指导方针。
这里,请将文件名中对应的部分使用下面的方式进行替换:
![]() |
提示 |
---|---|
有很多种通过实践摸索而得到的补丁管理方法和版本控制系统的使用策略与技巧。您没有必要将它们全部用上。 |
![]() |
提示 |
---|---|
在“Debian 开发者参考”一文的 第 6 章 最佳打包实践 部分有十分详尽的相关文档。请读一读这些内容。 |
尽管 Debian 软件包可以仅由编写 debian/rules 脚本而不使用 debhelper 软件包来生成,其实这样做是不切实际的。现代的 Debian“政策”对许多功能特性的实现做了要求,如应用适当的文件权限、使用合适的与硬件架构相关的软件库安装路径、安装脚本钩子的插入、调试符号软件包的生成、软件包依赖信息的生成、软件包信息文件的生成、对时间戳调节以符合可重现构建的要求,等等。
Debhelper 软件包提供了一套实用脚本,用来简化 Debian 打包工作流并减轻软件包维护者的负担。若能适当运用,它们可以帮助打包者自动地处理并实现 Debian”政策“所要求的功能。
现代化的 Debian 打包工作流可以组织成一个简单的模块化工作流,如下所示:
您几乎总是应当将 debhelper 列为您的软件包的构建依赖之一。本文档在接下来的内容中也假设您正在使用一个版本足够新的 debhelper 协助进行打包工作。
如果所获取上游源代码的形式为 hello-0.9.12.tar.gz,您可以将 hello 作为上游源代码名称,并将 0.9.12 作为上游版本号。
debmake 的目的是为软件包维护者提供开始工作的模板文件。注释行以 # 开始,其中包含一些教程性文字。您在将软件包上传至 Debian 仓库之前必须删除或者修改这样的注释行。
许可证信息的提取和赋值过程应用了大量启发式操作,因此在某些情况下可能不会正常工作。强烈建议您搭配使用其它工具,例如来自 devscripts 软件包的 licensecheck 工具,以配合 debmake 的使用。
组成 Debian 软件包名称的字符选取存在一定的限制。最明显的限制应当是软件包名称中禁止出现大写字母。这里给出正则表达式形式的规则总结:
请在《Debian 政策手册》的 第 5 章 - Control 文件及其字段 一节中查看其精确定义。
debmake 所假设的打包情景是相对简单的。因此,所有与解释器相关的程序都会默认为“Architecture: all”的情况。当然,这个假设并非总是成立。
您必须为 Debian 打包工作适当地调整软件包名称和上游版本号。
为了能有效地使用一些流行的工具(如 aptitude)管理软件包名称和版本信息,最好能将软件包名称保持在 30 字符以下;版本号和修订号加起来最好能不超过 14 个字符。[10]
为了避免命名冲突,对用户可见的二进制软件包名称不应选择任何常用的单词。
如果上游没有使用像 2.30.32 这样正常的版本编号方案,而是使用了诸如 11Apr29 这样包含日期、某些代号或者一个版本控制系统散列值等字符串作为版本号的一部分的话,请在上游版本号中将这些部分移除。这些信息可以稍后在 debian/changelog 文件中进行记录。如果您需要为软件设计一个版本字符串,可以使用 YYYYMMDD 格式,如 20110429 的字符串作为上游版本号。这样能保证 dpkg 命令在升级时能正确地确定版本的先后关系。如果您想要确保万一上游在未来重新采纳正常版本编号方案,例如 0.1 时能够做到顺畅地迁移,可以另行使用 0~YYMMDD 的格式,如 0~110429 作为上游版本号。
版本字符串可以按如下的方式使用 dpkg 命令进行比较。
$ dpkg --compare-versions ver1 op ver2
版本比较的规则可以归纳如下:
对于某些字符,如句点(.)、加号(+)和波浪号(~),有如下的特殊规则。
0.0 < 0.5 < 0.10 < 0.99 < 1 < 1.0~rc1 < 1.0 < 1.0+b1 < 1.0+nmu1 < 1.1 < 2.0
有一个稍需注意的情况,即当上游将 hello-0.9.12-ReleaseCandidate-99.tar.gz 这样的版本当作预发布版本,而将 hello-0.9.12.tar.gz 作为正式版本时。为了确保 Debian 软件包升级能够顺畅进行,您应当修改版本号命名,如将上游源代码压缩包重命名为 hello-0.9.12~rc99.tar.gz。
使用“3.0 (quilt)”格式的非本土 Debian 软件包是最常见最标准的 Debian 源码包格式。根据 dpkg-source(1) 的描述,此时的 debian/source/format 文件应当包含“3.0 (quilt) 的文字内容。上述的工作流和接下来给出的打包示例都使用了这种格式。
而本土 Debian 软件包是较罕见的一种 Debian 软件包格式。它通常只用于打包仅对 Debian 项目有价值、有意义的软件。因此,该格式的使用通常不被提倡。
![]() |
小心 |
---|---|
在上游 tarball 源码压缩包无法使用其正确名称 package_version.orig.tar.gz 被 dpkg-buildpackage 获取到的时候,会出现意外地构建了本土 Debian 软件包的情况。这是新手常见的一个错误,通常是因构建中错误地在符号链接名称中使用了“-”字符而非正确的“_”字符。[译注:此处仍然假设打包的场景是已经获取或形成了名为 package-version.tar.gz 的上游源码 tarball。Debian 的打包工作很大程度上是以上游源码 tarball 作为基础的,这一点须时刻牢记在心。] |
本土 Debian 软件包不对 上游代码 和 Debian 的修改 进行区分,仅包含以下内容:
如果您需要手动创建本土 Debian 软件包,可以使用 dpkg-source(1) 工具以“3.0 (native)”格式进行创建。
![]() |
提示 |
---|---|
某些人希望推行对那些即使是仅针对 Debian 编写的那些软件也使用非本土软件包格式的做法。这种做法所需要的不包含 debian/* 文件的 tarball 压缩包事先需要手动生成以符合在 第 5.1 节 “打包工作流” 中的标准工作流。他们认为使用非本土软件包格式可以方便与下游发行版之间的沟通与交流。 |
![]() |
提示 |
---|---|
如果使用本土软件包格式,没有必要事先创建 tarball 压缩包。要创建一个本土 Debian 软件包,应当将 debian/source/format 文件的内容设置为“3.0 (native)”,适当编写 debian/changelog 文件使得版本号中不包含 Debian 修订号(例如,1.0 而非 1.0-1),最后在源码树中调用“dpkg-source -b .”命令。这样做便可以自动生成包含源代码的 tarball。 |
debian/rules 脚本是用于实际构建 Debian 软件包的可执行脚本。
debian/rules 脚本重新封装了上游的构建系统(参见 第 5.16 节 “上游构建系统”)以达到将文件安装至 $(DESTDIR)并将生成的文件存入各个 deb 格式文件中的目的。
$(DESTDIR) 路径具体值依赖于构建的类型。
由 debhelper 软件包提供的 dh 命令与一些相关的软件包共同工作,作为典型的上游构建系统的一层封装,同时它支持所有 Debian 政策(Debian Policy)规定必须在 debian/rules 实现的目标(target),以此提供一个统一的访问接口。
![]() |
注意 |
---|---|
对使用了 debhelper“compat >=9”的情况,dh 命令将在编译参数未事先设置的情况下根据 dpkg-buildflags 命令返回的值设置并导出各个编译参数(如 CFLAGS、CXXFLAGS、FFLAGS、CPPFLAGS 和 LDFLAGS)。(dh 命令将调用在 Debian::Debhelper::Dh_Lib 模块中定义的 set_buildflags。) |
受益于 dh 命令对构建目标的抽象化 [11],一个符合 Debian 政策而支持所有必需目标(target)的 debian/rules 文件可以简单地写成如下形式[12]:
简单的 debian/rules:.
#!/usr/bin/make -f #export DH_VERBOSE = 1 %: dh $@
从本质上来看,这里的 dh 命令的作用是作为一个序列化工具,在合适的时候调用所有所需的 dh_* 命令。
![]() |
注意 |
---|---|
debmake 命令会在 debian/control 文件中写入“Build-Depends: debhelper (>=9)”,并在 debian/compat 文件中写入“9”。 |
![]() |
提示 |
---|---|
设置“export DH_VERBOSE = 1”会输出构建系统中每一条会修改文件内容的命令。它同时会在某些构建系统中启用详细输出构建日志的选项。 |
通过添加合适的 override_dh_* 目标(target)并编写对应的规则,可以实现对 debian/rules 脚本的灵活定制。
如果需要在 dh 命令调用某些特定的 dh_foo 命令时采取某些特别的操作,则任何自动执行的操作均可以被 debian/rules 中额外添加的 override_dh_foo 这样的 Makefile 目标所覆写。
构建的过程可以使用某些上游提供的接口进行定制化,如使用传递给标准的源代码构建系统的参数。这些构建系统包括但不限于:
在这种情况下,您应该添加一个 override_dh_auto_build 目标并在其中执行“dh_auto_build -- 自定义参数” 的命令。这样可以在 dh_auto_build 默认传递的参数之后确保将用户给出的 自定义参数 继续传递给那些构建系统。
![]() |
提示 |
---|---|
如果上文提到的构建系统命令已知得到了 dh_auto_build 命令的支持的话,请避免直接调用这些命令(而让 dh_auto_build 自动处理)。 |
debmake 命令所创建的初始模版文件除了应用了上文提到的简单 debian/rules 文件的优点外,同时为后续可能涉及的软件包加固等情景添加了一些额外的定制选项。您需要先了解整个构建系统背后的工作原理(参见 第 5.16 节 “上游构建系统”),之后才能收放自如地定制软件包来处理某些非常规的工作情况。
某些对自定义 debian/rules 有用的变量定义可以在 /usr/share/dpkg/ 目录下的文件中找到。比较重要的包括:
如果您希望在 debian/rules 中使用其中的某些变量,您可以将相关的代码复制到 debian/rules 文件中,或是重写一份简单的替代实现。总而言之请保持 debian/rules 文件尽量简单。
例如,您按如下的方法在 debian/rules 文件中添加内容,从而为 linux-any 目标架构添加额外的 CONFIGURE_FLAGS:
DEB_HOST_ARCH_OS ?= $(shell dpkg-architecture -qDEB_HOST_ARCH_OS) ... ifeq ($(DEB_HOST_ARCH_OS),linux) CONFIGURE_FLAGS += --enable-wayland endif
![]() |
提示 |
---|---|
历史上对于 debhelper 兼容等级小于等于 8 的情况下,在 debian/rules 文件中包含 buildflags.mk 文件是很有用的,它可以合适地设置一些构建标志,如 CPPFLAGS、CFLAGS、LDFLAGS 等,同时保证对特定选项,如 DEB_CFLAGS_MAINT_APPEND 和 DEB_BUILD_MAINT_OPTIONS 的合适处理。现在您应当使用的 debhelper 兼容等级大于等于 9,故如无特殊原因,请不要继续包含 buildflags.mk,请交由 dh 命令来处理和设置这些构建标志。 |
参见 第 5.20 节 “多体系结构”、dpkg-architecture(1) 和 dpkg-buildflags(1)。
为了做到软件包可重现的构建,这里给出一些相关的建议。
阅读可重现构建了解更多信息。
由 dpkg-genbuildinfo(1) 生成的控制文件 source-name_source-version_arch.buildinfo 记录了构建环境信息。参见 deb-buildinfo(5)
debian/control 文件包含了由空行分隔的数块元信息数据。每块元数据按照如下的顺序定义了下面这些内容:
参见《Debian 政策手册》中的 第 5 章 - Control 文件及其字段 一章以了解每块元信息的具体定义。
对行为良好的构建系统来说,对 Debian 二进制包的拆分可以由如下方式实现。
请查看本指南中相关的例子:
debmake 命令的 -b 选项提供了一个符合直觉又灵活的功能,可以用来创建 debian/control 的初始模板文件,其中可以定义多个 Debian 二进制软件包,每节中含有如下字段:
debmake 命令也会在每个适当的依赖字段中设置合适的变量替换占位符(substvars)。
我们在这里直接引用 debmake 手册页中的相关一部分内容。
设置二进制软件包的指定类型内容,使用一个用逗号分隔的二进制软件包名:类型成对列表;例如,使用完整形式“foo:bin,foo-doc:doc,libfoo1:lib,libfoo-dev:dev”或者使用短形式,“-doc,libfoo1,libfoo-dev”。
这里,二进制软件包是二进制软件包名称,可选的类型应当从下面的类型值中进行选取:
括号内成对的值,例如(any,foreign),是软件包的架构和多架构(Multi-Arch)特性的值,它们将设置在 debian/control 文件中。
大多数情况下,debmake 命令可以有效地从二进制软件包的名称猜测出正确的类型。如果类型的值并不明显,程序将回退到将类型设置为bin。例如,libfoo 设置类型为 lib,而 font-bar 会令程序设置类型为 data,……
如果源码树的内容和类型的设置不一致,debmake 命令会发出警告。
对于下面这样的上游源代码示例,我们在这里给出使用 debmake 处理时一些典型的 multiarch 软件包拆分的场景和做法:
二进制软件包 | 类型 | Architecture: | Multi-Arch: | 软件包内容 |
---|---|---|---|---|
lib foo1 |
lib * |
any |
same |
共享库,可共同安装 |
lib foo -dev |
dev * |
any |
same |
共享库头文件及相关开发文件,可共同安装 |
lib foo -tools |
bin * |
any |
foreign |
运行时支持程序,不可共同安装 |
lib foo -doc |
doc * |
all |
foreign |
共享库文档 |
bar |
bin * |
any |
foreign |
编译好的程序文件,不可共同安装 |
bar -doc |
doc * |
all |
foreign |
程序的配套文档文件 |
baz |
script |
all |
foreign |
解释型程序文件 |
Let’s consider that the upstream source tarball of the libfoo library is updated from libfoo-7.0.tar.gz to libfoo-8.0.tar.gz with a new SONAME major version which affects other packages.
库的二进制软件包将必须从 libfoo7 重命名为 libfoo8 以保持使用 unstable 套件的系统上所有依赖该库的软件包在上传了基于 libfoo-8.0.tar.gz 的新库后仍然能够正常运行。
![]() |
警告 |
---|---|
如果这个二进制库软件包没有得到更名,许多使用 unstable 套件的系统上的各个依赖该库的软件包会在新的库包上传后立刻破损,即便立刻请求进行 binNMU 上传也无法避免这个问题。由于种种原因,binNMU 不可能在上传后立刻开始进行,故无法缓解问题。 |
-dev 软件包必须遵循以下命名规则:
使用不带版本号的 -dev 软件包名称:libfoo-dev
使用带版本的 -dev 软件包名称:libfoo7-dev 和 libfoo8-dev
两个版本的库源码包可同时出现在发行版仓库中。
![]() |
提示 |
---|---|
如果包内数据文件编码方案有所变化(如,从 latin1 变为 utf-8),该场景应比照 API 变化做类似的考虑与处理。 |
参见 第 5.18 节 “库软件包”。
debian/control 也定义了软件包的依赖关系,其中变量替换机制(substvar)的功能可以用来将软件包维护者从跟踪(大多数简单的)软件包依赖的重复劳动中解放出来。请参见 deb-substvars(5)。
debmake 命令支持下列变量替换指令:
For the shared library, required libraries found simply by "objdump -p /path/to/program | grep NEEDED" are covered by the shlib substvar.
对于 Python 和其它解释器来说,所需的模块通常由对包含类似“import”、“use”、“require”等等关键字的行进行解析,并会体现在各自对应的变量替换占位符所在位置上。
对其它没有部署属于自己范畴内的变量替换机制的情况,misc 变量替换占位符通常用来覆盖对应的依赖替换需求。
对 POSIX shell 程序来说,并没有简单的办法来验证其依赖关系,substvar 的变量替换也无法自动得出它们的依赖。
对使用动态加载机制,包括 GObject introspection 机制的库和模块来说,现在没有简单的方法可以检查依赖关系,变量替换机制也无法自动推导出所需的依赖。
一个 binNMU(二进制非维护者上传) 是为库迁移或其它目的所作的非维护者软件包上传。在一次 binNMU 上传中,只有“Architecture: any”的软件包会被重构建,其版本号会在末尾附加一个编号(例如,原来版本为 2.3.4-3,新上传的包版本会变成 2.3.4-3+b1)。所有“Architecture: all”的包将不会重新构建。
来自同一个源码包的各个二进制包如果在 debian/control 文件中有互相的依赖关系,这些二进制包通常情况下应当对 binNMU 是安全的(即,进行 binNMU 不会破坏依赖关系)。然而,在“Architecture: any”和“Architecture: all”的软件包同时由同一源码包产出,且互相之间有依赖关系时,需要小心对待所依赖的版本,必要时应做出调整。
“Architecture: any”的软件包依赖于“Architecture: any”foo 软件包
“Architecture: any”的软件包依赖于“Architecture: all”bar 软件包
“Architecture: all”的软件包依赖于“Architecture: any”baz 软件包
debian/changelog 文件记录了 Debian 软件包的历史并在其第一行定义了上游软件包的版本和 Debian 修订版本。所有改变的内容应当以明确、正式而简明的语言风格进行记录。
即便您在自己独立进行软件包上传,您也必须记录所有较重要、用户可见的变更,例如:
如果您需要他人协助您进行上传,您应当更详尽地记录变更内容,包括所有打包相关的变动,从而方便他人对您的软件包进行审查。
debmake 命令会创建初始的模板文件,其中带有上游软件包版本和 Debian 打包修订编号。发行版部分被设置为 UNRELEASED 以避免半成品不小心被上传进入 Debian 仓库。
通常使用 debchange 命令(它具有一个别名,即 dch)对其进行编辑。
![]() |
提示 |
---|---|
您也可以手动使用任何文本编辑器修改 debian/changelog 文件,只要您能够遵循 debchange 命令所使用的特定文本排版格式即可。 |
![]() |
提示 |
---|---|
debian/changelog 文件使用的日期字符串可以使用“LC_ALL=C date -R”命令手动生成。 |
该文件将由 dh_installchangelogs 命令安装到 /usr/share/doc/binarypackage 目录,文件名为 changelog.Debian.gz。
上游的变更日志则会安装至 /usr/share/doc/binarypackage 目录中,文件名为 changelog.gz。
上游的变更日志是由 dh_installchangelogs 程序自动进行搜索和处理的;它会使用大小写不敏感的搜索方式寻找上游代码中特定名称的文件,如 changelog、changes、changelog.txt、changes.txt、history、history.txt 或 changelog.md。除了根目录,程序还会在 doc/ 目录和 docs/ 目录内进行搜索。
当您完成了主要打包工作并验证了其质量之后,请考虑运行“dch -r”命令并将最终完成的 debian/changelog 文件中发行版(distribution)部分进行设置,通常该字段应当使用 unstable。[13] 如果您的打包是一次向后移植(backports)、是安全更新或是对长期支持版的上传等等其它情况,请使用相应合适的发行版名称。
Debian 以十分严肃的态度对待版权和许可证信息。《Debian 政策手册》强制规定软件包的 debian/copyright 文件中需要提供相关信息的摘要。
您应当按照 机器可解析的 debian/copyright 文件(DEP-5)对其进行排版。
![]() |
小心 |
---|---|
这里的 debian/copyright 文件中描述的许可证信息匹配信息应当合适地进行排序,以确保越宽泛的文件匹配越靠前。请参见 第 6.4 节 “debmake -k”。 |
debmake 命令会以扫描整个源码树的方式创建初步的、兼容 DEP-5 的模板文件。它会内部调用许可证检查工具来对许可证文本进行分类。[14]
除非明确指定(有些严格过头的) -P 选项,debmake 命令会为了实用性而跳过对自动生成的文件的检查与报告,默认它们采用宽松的许可证。
![]() |
注意 |
---|---|
如果您发现了这个许可证检查工具存在一些问题,请向 debmake 软件包提交缺陷报告并提供包含出现问题的许可证和版权信息在内的相关文本内容。 |
![]() |
注意 |
---|---|
debmake 命令专注于在创建 debian/copyright 模板时聚合相同的授权和许可证信息并收录其详细内容。为了在有限的时间内尽可能完成工作,工具将只会提取文件中第一块看起来像授权文本或许可证声明的部分。因此,生成的许可证信息可能并不完美。请同时考虑使用其它工具,如 licensecheck 辅助进行检查。 |
![]() |
提示 |
---|---|
我们强烈推荐您使用 licensecheck(1) 命令再次检查源码许可证的状态,并在有必要的情况下进行人工代码审查。 |
在构建过程开始之前,debian/patches/ 目录内的 -p1 等级的补丁将会按照在 debian/patches/series 文件中指定的顺序依次应用于上游代码树中。
![]() |
注意 |
---|---|
本土 Debian 软件包(参见 第 5.3 节 “本土 Debian 软件包”)将不使用这些文件。 |
要准备这一系列 -p1 等级的补丁,有几种不同的方式可供您选择。
diff 命令
原始但万能的方法
dquilt 命令
“dpkg-source --commit”命令
由 dpkg-buildpackage 自动生成补丁
gbp-pq 命令
gbp-dpm 命令
无论这些补丁的来源如何,都建议使用兼容于 DEP-3 的头部信息对其进行标记。
![]() |
提示 |
---|---|
dgit 软件包提供了另外一套直接使用 git 集成操作 Debian 软件包仓库的工具。 |
“dpkg-source -x” 命令可以对 Debian 源码包进行解压缩。
该命令通常会将 debian/patches/ 目录内的补丁应用在源码树中,并将补丁状态记录在 .pc/ 目录中。
如果您想保持源码树不做修改(例如,为了在 第 5.13 节 “在版本控制系统中进行记录(标准)” 中继续使用),请在命令行中使用 --skip-patches 选项。
在 dpkg-source 工具 1.16.1 版本之前,该工具还未提供 --commit 选项对应的功能,此时需要 quilt 命令(或者对它的封装,dquilt 命令)来管理 debian/patches/ 目录中的 -p1 等级的补丁。
在使用 dpkg-source 命令时,补丁应当能够干净地进行应用。因此在补丁行数出现偏移或者其它情况出现时,您不能直接将旧补丁原封不动地复制到新版上游发布对应打包版本的目录中。
与此相对的是 dquilt 命令(参见 第 3.4 节 “quilt”)对补丁的处理更加宽容。您可以调用 dquilt 命令对补丁进行正常化。
$ while dquilt push; do dquilt refresh ; done $ dquilt pop -a
使用 dpkg-source 命令比起使用 dquilt 命令来说存在一大优势:dquilt 命令无法自动处理二进制文件出现变更的情况,而 dpkg-source 命令能够探测出现内容变动的二进制文件,并将其列入 debian/source/include-binaries 文件以便在 Debian 打包用压缩包中将文件囊括其中。
某些软件包由 GPG 密钥进行了签名。
例如,GNU hello 可使用 HTTP 协议从 https://ftp.gnu.org/gnu/hello/ 下载。它含有以下文件:
我们现在来选择最新的版本套装。
$ wget https://ftp.gnu.org/gnu/hello/hello-2.9.tar.gz ... $ wget https://ftp.gnu.org/gnu/hello/hello-2.9.tar.gz.sig ... $ gpg --verify hello-2.9.tar.gz.sig gpg: Signature made Thu 10 Oct 2013 08:49:23 AM JST using DSA key ID 80EE4A00 gpg: Can't check signature: public key not found
如果您从邮件列表获知上游维护者所使用的 GPG 公钥信息,请将它作为 debian/upstream/signing-key.asc 文件进行存储。否则,请使用 hkp 公钥服务器并经由您的信任网进行验证。
$ gpg --keyserver hkp://keys.gnupg.net --recv-key 80EE4A00 gpg: requesting key 80EE4A00 from hkp server keys.gnupg.net gpg: key 80EE4A00: public key "Reuben Thomas <rrt@sc3d.org>" imported gpg: no ultimately trusted keys found gpg: Total number processed: 1 gpg: imported: 1 $ gpg --verify hello-2.9.tar.gz.sig gpg: Signature made Thu 10 Oct 2013 08:49:23 AM JST using DSA key ID 80EE4A00 gpg: Good signature from "Reuben Thomas <rrt@sc3d.org>" ... Primary key fingerprint: 9297 8852 A62F A5E2 85B2 A174 6808 9F73 80EE 4A00
![]() |
提示 |
---|---|
如果您的网络环境阻挡了对 HKP 11371 端口的访问,请考虑使用“hkp://keyserver.ubuntu.com:80”。 |
在确认密钥身份 80EE4A00 值得信任之后,应当下载其公钥并将其保存在 debian/upstream/signing-key.asc 文件中。
$ gpg --armor --export 80EE4A00 >debian/upstream/signing-key.asc
之后,应相应地在 debian/watch 文件中做如下的修改。
version=4 pgpsigurlmangle=s/$/.sig/ https://ftp.gnu.org/gnu/hello/ hello-(\d[\d.]*)\.tar\.(?:gz|bz2|xz)
现在 uscan 命令会在扫描时自动使用 GPG 签名验证上游源码包的真实性。
Debian 严肃地对待软件自由,遵循 Debian 自由软件指导方针(DFSG)。
在使用 uscan 命令来更新 Debian 打包所用代码时,上游源码包(tarball)中不符合Debian 自由软件指导方针(DFSG)的部分可以利用该工具简单地进行移除。
运行 uscan 命令以下载新的上游源码包(tarball)。
另外也可以添加一些可选的配置文件并放入 debian/ 目录。它们大多用于控制由 debhelper 软件包提供的 dh_* 命令的行为,但也有一些文件会影响 dpkg-source、lintian 和 gbp 这些命令。
![]() |
提示 |
---|---|
请检查 debhelper(7) 的内容以了解当前可用的 dh_* 命令列表。 |
这些 debian/binarypackage.* 的文件提供了设置文件安装路径的强大功能。即使上游源代码没有构建系统,这个软件依然可以利用这里提到的这些文件来进行打包。请参考 第 8.2 节 “无 Makefile(shell,命令行界面)” 的示例。
下面列表中出现的“-x[1234]”上标指示了 debmake -x 选项生成对应模板文件所需要的最小值。请参考 debmake(1) 以了解详情。
下面按照字母表顺序列出一些值得注意的可选配置文件。
列出需要安装的 bash
补全脚本。
需要在构建环境和用户环境内均安装 bash-completion
软件包。
另请参考dh_bash-completion(1)。
列出(构建前)未被 dh_auto_clean 命令清理,且需要手工清理的文件。
另请参考 dh_auto_clean(1) 和 dh_clean(1)。
设置 debhelper 兼容等级(当前为“9”)。
另请参考 debhelper(8) 中“COMPATIBILITY LEVELS”一节。
如果兼容等级大于 3(“compat >= 3”),您没有创建该文件的必要,因为所有 etc/ 目录下的文件都是配置文件(conffiles)。
如果您正要打包的程序要求每个用户都对 /etc 目录下的配置文件进行修改,可以采取两种常见办法使其不作为 conffile 配置文件出现,避免 dpkg 命令处理软件包时给出不必要的处理选项。
另请参考 dh_installdeb(1)。
安装至 binarypackage 包内的 etc/cron/hourly/binarypackage 文件。
另请参见 dh_installcron(1) 和 cron(8)。
安装至 binarypackage 包内的 etc/cron/daily/binarypackage 文件。
另请参见 dh_installcron(1) 和 cron(8)。
安装至 binarypackage 包内的 etc/cron/weekly/binarypackage 文件。
另请参见 dh_installcron(1) 和 cron(8)。
安装至 binarypackage 包内的 etc/cron/monthly/binarypackage 文件。
另请参见 dh_installcron(1) 和 cron(8)。
安装至 binarypackage 包内的 etc/cron.d/binarypackage 文件。
参见 dh_installcron(1)、cron(8) 和 crontab(5)。
若该文件存在,它将被安装至 binarypackage 包中的 etc/default/binarypackage 位置。
参见 dh_installinit(1)。
列出 binarypackage 包中要创建的目录。
参见 dh_installdirs(1)。
通常情况下您并不需要这么做,因为所有的 dh_install* 命令都会自动创建所需的目录。请仅在遇到问题时考虑使用这一工具。
作为 binarypackage 包中的 doc-base 控制文件进行安装。
参见 dh_installdocs(1) 和 doc-base 软件包提供的 Debian doc-base 手册。
列出要安装在 binarypackage 包中的文档文件。
参见 dh_installdocs(1)。
安装至 binarypackage 包中的 usr/lib/emacsen-common/packages/compat/binarypackage 文件。
参见 dh_installemacsen(1)。
安装至 binarypackage 包中的 usr/lib/emacsen-common/packages/install/binarypackage 文件。
参见 dh_installemacsen(1)。
安装至 binarypackage 包中的 usr/lib/emacsen-common/packages/remove/binarypackage 文件。
参见 dh_installemacsen(1)。
安装至 binarypackage 包中的 usr/lib/emacsen-common/packages/startup/binarypackage 文件。
参见 dh_installemacsen(1)。
列出要安装至 binarypackage 包中 usr/share/doc/binarypackage/examples/ 位置下的示例文件或目录。
参见 dh_installexamples(1)。
如果该文件存在,它将作为 gbp 命令的配置文件发挥作用。
参见 gbp.conf(5)、gbp(1) 和 git-buildpackage(1)。
列出要安装至 binarypackage 包中的 info 文件。
参见 dh_installinfo(1)。
安装至 binarypackage 包中的 etc/init.d/binarypackage 文件。
参见 dh_installinit(1)。
列出未被 dh_auto_install 命令安装的其它应当安装的文件。
参见 dh_install(1) 和 dh_auto_install(1)。
这是 debmake 命令生成的版权声明文件示例,请用它们作为 debian/copyright 文件的参考。
请在最终工作成果中删除这些文件。
列出要生成符号链接的源文件和目标文件对。每一对链接均应在单独的一行中列出,源文件和目标文件之间使用空白字符分隔。
参见 dh_link(1)。
安装至软件包构建目录的 usr/share/lintian/overrides/binarypackage 位置。该文件用于消除 lintian 错误生成的诊断信息。
参见 dh_lintian(1)、lintian(1) 和 Lintian 用户手册。
这些文件是 debmake 命令生成的 man 手册页模板文件。请将其重命名为合适的文件名并更新其内容。
Debian 的政策要求软件包为其包含的每个程序、工具和函数同时提供一份相关的手册页。手册页使用 nroff(1) 语法写成。
如果您不熟悉如何编写用户手册页,请以 manpage.asciidoc 或 manpage.1 为起点。
列出要安装的 man 手册页。
参见 dh_installman(1)。
tech-ctte #741573 决定“Debian 应该在合适的情况下使用 .desktop 文件”。
安装至 binarypackage 包中的 usr/share/menu/binarypackage Debian 菜单文件。
参见 menufile(5) 以了解其格式。另请参见 dh_installmenu(1)。
安装至 usr/share/doc/binarypackage/NEWS.Debian 文件。
参见 dh_installchangelogs(1)。
这是 -p1 补丁文件的集合,它们将在使用源代码构建之前应用在上游源码上。
参见 dpkg-source(1)、第 3.4 节 “quilt” 和 第 4.8 节 “第三步(备选):修改上游源代码”。
debmake 默认不会生成补丁文件。
这些维护者脚本将安装至软件包的 DEBIAN 目录下。
在这些脚本中,#DEBHELPER# 记号将由其它 debhelper 命令进行处理,将其替换为相应的 shell 脚本片段。
参考《Debian 政策手册》的 dh_installdeb(1) 和 第六章 - 软件包维护脚本和安装过程 一节。
参考《Debian 政策手册》的 debconf-devel(7) 和 3.9.1 维护者脚本中的用户交互提示 一节。
安装至 debian/control 文件列出的第一个二进制软件包中的 usr/share/doc/binarypackage/README.Debian 位置。
参见 dh_installdocs(1)。
该文件提供了针对该 Debian 软件包的信息。
如果该文件存在,它将被安装到 binarypackage 包下面的 lib/systemd/system/binarypackage.service 位置。
参见 dh_systemd_enable(1)、dh_systemd_start(1) 和 dh_installinit(1)。
Debian 软件包格式。
参见 dpkg-source(1) 的“源码包格式”一节。
这些文件不会最终被安装,但 lintian 会对它们进行扫描以提供源码包的 override 信息。
另请参考 dh_lintian(1) 和 lintian(1)。
dpkg-source 命令使用此内容作为它的选项,比较重要的选项有:
该文件不会包含在生成的源码包中,仅对维护者在版本控制系统中维护软件包有意义。
参见 dpkg-source(1) 中的“文件格式”一节。
自由格式的文本,将被包含在自动生成补丁的顶部。
该文件不会包含在生成的源码包中,仅对维护者在版本控制系统中维护软件包有意义。
+ 参见 dpkg-source(1) 的“文件格式”一节。
这些符号文件如果存在,将交由 dpkg-gensymbols 命令进行处理和安装。
参见 dh_makeshlibs(1) 和 第 5.18.1 节 “库符号”。
安装至 debian/control 文件列出的第一个二进制包中的 usr/share/doc/binarypackage/TODO.Debian 文件。
参见 dh_installdocs(1)。
如果该文件存在,它将被安装至 binarypackage 包中的 usr/lib/tmpfiles.d/binarypackage.conf 文件。
参见 dh_systemd_enable(1)、dh_systemd_start(1) 和 dh_installinit(1)。
如果该文件存在,它将被安装至软件包构建目录的 etc/init/package.conf 位置。(已弃用)
参见 dh_installinit(1) 和 第 8.1 节 “挑选最好的模板”。
用于下载最新上游版本的 uscan 命令的控制文件。
该控制文件也可配置以使用其 GPG 签名自动验证上游 tarball 的真实性(参见 第 5.9 节 “debian/upstream/signing-key.asc”)。
参见 第 5.10 节 “debian/watch 和 DFSG” 和 uscan(1)。
这里给出针对上面列表中信息的一些额外提醒。
我们来重新归纳一下 Debian 打包定制化的相关内容。
所有对 Debian 软件包进行定制化的数据都存在于 debian/ 目录中。我们在第 4.6 节 “第三步:编辑模板文件”这里给出了一个简单的例子。通常情况下,定制化会涉及以下各个项目:
如果以上提到的手段仍然不足以制作满足要求的 Debian 软件包的话,对上游源代码的修改应当使用 -p1 补丁文件存放在打包源码树 debian/patches/ 目录下。这些补丁将按照 debian/patches/series 文件所规定的顺序在构建软件包之前应用(参见 第 5.8 节 “debian/patches/*”)。第 4.8 节 “第三步(备选):修改上游源代码” 这里给出了一些简单的例子。
您应当以引入最少修改的方式解决打包中出现的根本问题。所生成的软件包应当考虑到未来的更新需求并有一定的健壮性。
![]() |
注意 |
---|---|
如果补丁对上游有所帮助的话,也请将解决根本问题的补丁反馈给上游作者和维护者。 |
通常情况下,Debian 打包活动使用 Git 作为版本控制系统(VCS)进行记录;通常会用到下列的分支。
master 分支
upstream 分支
![]() |
提示 |
---|---|
添加一个 .gitignore 文件并将 .pc 文件列入其中也是一个好主意。 |
![]() |
提示 |
---|---|
可以在 debian/source/local-options 文件中添加 unapply-patches 和 abort-on-upstream-changes 这两行以保持上游源码处于未修改状态。 |
![]() |
提示 |
---|---|
您也可以使用除 upstream 分支以外其它名称的分支跟踪上游版本控制数据以方便拣选补丁。 |
您也可以选择不创建 -p1 等级的补丁。这时,您可以使用下列分支来记录 Debian 打包活动。
master 分支
upstream 分支
如下在 debian/ 目录下额外添加一些文件即可达到目的。
$ tar -xvzf <package-version>.tar.gz $ ln -sf <package_version>.orig.tar.gz $ cd <package-version>/ ... hack...hack... $ echo "single-debian-patch" >> debian/source/local-options $ cat >debian/source/local-patch-header <<END This patch contains all the Debian-specific changes mixed together. To review them separately, please inspect the VCS history at https://git.debian.org/?=collab-maint/foo.git.
如此可让 Debian 打包过程(dpkg-buildpackage、debuild 等)所调用的 dpkg-source 命令自动生成一个 -p1 等级的补丁文件 debian/patches/debian-changes。
![]() |
提示 |
---|---|
这种做法可以应用在任何版本控制工具中。这么做会把所有修改合并到同一个补丁文件中而丢失其开发历史,因此请务必保持版本控制系统的数据公开可见。 |
![]() |
提示 |
---|---|
debian/source/local-options 和 debian/source/local-patch-header 文件只用于在版本控制系统中记录信息。它们不应包含在 Debian 源码包中。 |
在某些情况下,直接使用自动生成的 Debian 源码包会引入不必要的一些内容。
通常情况下,第 3.5 节 “devscripts” 中设置的用于 dpkg-source 命令的 -i 和 -I 选项可以避免这些问题。这里 -i 针对非本土软件包而 -I 则针对本土软件包。请参见 dpkg-source(1) 和“dpkg-source --help”的输出。
以下几种方法均可避免引入不必要的内容。
含有多余文件的问题可以使用“debian/rules clean”这个 Makefile 目标的调用来解决,只需在该目标内删除文件即可。它也能处理自动生成的文件。
![]() |
注意 |
---|---|
运行 dpkg-buildpackage 命令时,它会在“dpkg-source --build”命令之前被调用“debian/rules clean”目标,而“dpkg-source --build”命令会忽略被删除的文件。 |
含有多余文件的问题还可以使用版本控制系统修复;具体来说,可以在首次构建之前将源码树提交到版本控制系统中。
您可以在第二次构建软件包之前恢复最初的源码树。例如:
$ git reset --hard $ git clean -dfx $ debuild
这里工作的原理是 dpkg-source 命令会忽略源码树中典型的版本控制系统相关的文件,相关的设置可以在 第 3.5 节 “devscripts” 的 DEBUILD_DPKG_BUILDPACKAGE_OPTS 设置中找到。
![]() |
提示 |
---|---|
如果源码树未受版本控制系统管理,您可以在第一次构建之前运行“git init; git add -A .; git commit”来初始化。 |
这种做法仅适合非本土软件包。
含有多余文件的问题可以使用在 debian/source/options 文件中添加忽略信息的方式解决,令编译系统忽略多余的文件;具体配置语法为添加 extend-diff-ignore=…”一行内容。
如需排除 config.sub、config.guess 和 Makefile 文件:
# Don't store changes on autogenerated files extend-diff-ignore = "(^|/)(config\.sub|config\.guess|Makefile)$"
![]() |
注意 |
---|---|
即使您无法删除文件,这种做法总可以正常工作。您无需在每次构建之前手动删除文件并手动进行恢复。 |
![]() |
提示 |
---|---|
如果您转而使用 debian/source/local-options 文件,您可以在生成的源码包中隐藏该项设置。这种做法在本地非标准版本控制系统和您的打包工作有冲突时可能有用。 |
这个方法只适用于本土软件包。
您可以使用这种做法在生成的源码包中排除某些文件;只需在 debian/source/options 文件或者 debian/source/local-options 文件中添加含有通配符的 “tar-ignore=…”一行内容即可。
![]() |
注意 |
---|---|
例如,如果您的本土软件包的源码包使用了一些具有 .o 扩展名的文件作为测试数据的话,第 3.5 节 “devscripts” 的默认设置就过于激进了,这些文件会被当作多余的文件默认自动排除。如需解决这个问题,您可以在 第 3.5 节 “devscripts” 中的 DEBUILD_DPKG_BUILDPACKAGE_OPTS 参数中移除 -I 选项,同时在每个软件包的 debian/source/local-options 文件中添加 “tar-ignore=…”的配置行。 |
上游的构建系统设计为经过数个步骤以从源码发行文件得到并在系统中安装所生成的二进制文件。
![]() |
提示 |
---|---|
在尝试制作 Debian 软件包之前,您应当熟悉了解上游源代码所使用的构建系统并尝试构建软件。 |
使用 Autotools(autoconf + automake)包括四个步骤。
第一步通常由上游维护者完成并使用“make dist”命令生成上游源码压缩包(tarball)。(所生成的源码压缩包不仅含有原始的版本控制系统中的文件,也含有其它生成的文件。)
软件包维护者至少要处理第二步到第四步的工作。可以在 debian/rules 文件中使用“dh $@ --with autotools-dev”的命令以自动处理这些步骤。
软件包维护者也可以想要处理第一步到第四步所有的工作。这时,可以在 debian/rules 文件中使用“dh $@ --with autoreconf”命令。这样会将所有自动生成的文件更新到最新的版本,通常可以提供对新架构的更好支持。
对于使用 compat level(兼容等级)10 或更高等级的源码包,使用最简单的“dh $@”而不带“--with autoreconf”选项已可自动处理上述第一步到第四步全部内容。
如果您想进一步学习 Autotools,请参考:
使用 CMake 通常也包含四个步骤。
上游源码包(tarball)不包含自动生成的文件,通常是在第一步之后直接由 tar 命令打包生成。
软件包维护者需要处理第二步到第四步的工作。
如果您想进一步学习 CMake,请参考:
使用 Python distutils 通常包含三个步骤。
上游维护者通常会处理好第一步并使用“python setup.py sdist”命令构建好上游源码包并进行发行。
软件包维护者需要处理第二步工作。在 jessie 发布后,打包时只需要在 debian/rules 文件中使用最简单的“dh $@”命令。
其它构建系统,如 CMake,其使用方法和 Python 这里的情况都很类似。
要更多了解 Python3 和 distutils 请参见:
Debian 软件吧在构建时都会带上调试信息;但打包生成二进制软件包时,这些打包信息会按照《Debian 政策手册》中第十章 - 文件的要求进行剥离。
参见
调试信息由 dh_strip 命令的默认行为自动打包并进行剥离。所分离得到的调试软件包名具有 -dbgsym 的后缀。
If there were no -dbg packages defined in the debian/control file, no special care is needed for updating the package after the Stretch 9.0 release.
如果在 debian/control 文件中曾经定义过 -dbg 软件包,在 Stretch 9.0 发布之后对旧软件包更新需要进行额外的处理。
打包软件库需要您投入更多的工作。下面有一些打包软件库的提醒和建议:
在打包共享库软件之前,请查阅:
如需研究其历史背景,请参见:
Debian lenny(5.0,2009年5月)中引入的 dpkg 符号支持可以帮助我们管理同一共享链接库软件包的向后 ABI 兼容性(backward ABI compatibility)。二进制软件包中的 DEBIAN/symbols 文件提供了每个符号及其对应的最小版本号。
一个极其简化的软件库打包流程大概如下所示。
从前一个二进制软件包中使用“dpkg-deb -e”命令解压缩得到旧有的 DEBIAN/symbols 文件。
将其复制为 debian/binarypackage.symbols 文件。
构建二进制软件包。
如果 dpkg-gensymbols 命令警告添加了新的符号的话:
如果 dpkg-gensymbols 命令不报和新链接符号有关的警告:
如需了解详细信息,您应当阅读下列第一手参考资料。
您也应当查看:
![]() |
提示 |
---|---|
对于 C++ 软件库或者其它一些难以跟踪符号变化的场景,请遵循《Debian 政策手册》的 -1 一节的内容。请确保这样操作时事先删除 debmake 命令生成的空的 debian/binarypackage.symbols 文件。在这种情况下,应当转而使用 DEBIAN/shlibs 文件。 |
当您打包新版本的库软件包而且此次更新影响到其它的软件包时,您必须向 release.debian.org 伪软件包提交一个变迁 bug 报告并附带一个ben 文件;您可以使用 reportbug 工具进行提交。提交后,请等待发行团队的审核批准方可进行下一步。
发行团队提供了变迁跟踪系统。参见 变迁(Transition)。
![]() |
小心 |
---|---|
请确保您按照 第 5.5.1.3 节 “库软件包名称” 的描述正确地对二进制软件包进行了重命名。 |
debconf 软件包可以帮助我们在下列两种情况下配置软件包:
使用菜单界面进行交互式配置(对话框(dialog)、gnome、kde 等等)
软件包安装时的所有用户交互都必须由这里的 debconf 系统进行处理,下列配置文件对这个过程进行控制。
debian/ binarypackage .config
debian/ binarypackage .template
软件包配置脚本
参见 dh_installdebconf(1)、debconf(7)、debconf-devel(7) 和《Debian 政策手册》中的 3.9.1 维护者脚本中的用户交互提示。
Debian wheezy(7.0,2013年5月)在 dpkg 和 apt 中引入了对跨架构二进制软件包安装的多架构支持(特别是 i386 架构和 amd64 架构,但也支持其它的组合),这部分内容值得我们额外关注。
您应当详细阅读下列参考内容。
Ubuntu 维基(上游)
Debian 维基(Debian 的现状)
多架构支持使用三元组(<triplet>)的值,例如 i386-linux-gnu 和 x86_64-linux-gnu;它们出现在共享链接库的安装路径中,例如 /usr/lib/<triplet>/,等等。
不过,在 debian/rules 文件中用于 override_dh_* 目标的三元组 <triplet> 值需要由维护者手动进行显式设置。三元组 <triplet> 的值可由 $(DEB_HOST_MULTIARCH) 变量在 debian/rules 文件中获取到,具体方法如下:
DEB_HOST_MULTIARCH = $(shell dpkg-architecture -qDEB_HOST_MULTIARCH) ... override_dh_install: mkdir -p package1/lib/$(DEB_HOST_MULTIARCH) cp -dR tmp/lib/. package1/lib/$(DEB_HOST_MULTIARCH)
参见:
Debian 政策要求遵守文件系统层级标准。其中 /usr/lib:程序和软件包的库 声明“/usr/lib 包含目标文件、库和其它不应由用户或 shell 脚本直接调用的内部二进制文件。”
Debian 在文件系统层级标准的基础上添加一项例外,即使用 /usr/lib/<triplet>/ 而非 /usr/lib<qual>/(例如,/lib32/ 和 /lib64/)以对多架构库提供支持。
表 5.1. 多架构库路径选项
经典路径 | i386 多体系结构路径 | amd64 多体系结构路径 |
---|---|---|
/lib/ |
/lib/i386-linux-gnu/ |
/lib/x86_64-linux-gnu/ |
/usr/lib/ |
/usr/lib/i386-linux-gnu/ |
/usr/lib/x86_64-linux-gnu/ |
对基于 Autotools 且由 debhelper (compat>=9)管理的软件包来说,这些路径设置已由 dh_auto_configure 命令自动处理。
对于其它使用不支持的构建系统的软件包,您需要按照下面的方式手动调整安装路径。
所有启用多架构的软件包安装至相同路径的文件必须内容完全相同。您必须小心处理,避免数据字节序或者压缩算法等等问题带来的文件内容差异。
![]() |
注意 |
---|---|
./configure 的 --libexecdir选项指定了由程序而非用户所使用的可执行文件的默认安装路径。其 Autotools 的默认值为 /usr/libexec/ 但在未启用多架构特性的 Debian 系统上其默认值是 /usr/lib/。如果这些可执行程序属于被标记为“Multi-arch: foreign”的软件包,最好还是使用例如 /usr/lib/ 或者 /usr/lib/软件包名 这样的路径而非使用 dh_auto_configure 设置的 /usr/lib/<triplet>/ 路径。GNU 编程规范:7.2.5 用于安装目录的变量 对 libexecdir 的描述是“libexecdir 的定义对所有软件包相同,所以您应当将您的数据安装在其下的一个子目录中。大多数软件包将数据安装至 $(libexecdir)/package-name/ 之中……”(在与 Debian 政策不冲突的前提下,遵守 GNU 的标准总是更好的。) |
位于默认路径 /usr/lib/ 和 /usr/lib/<triplet>/ 的共享库可被自动加载。
对位于其它路径的共享库,必须使用 pkg-config 命令设置 GCC 选项 -l 以正确进行加载。
在支持多架构的 Debian 系统上,GCC 默认会同时包含、使用 /usr/include/ 和 /usr/include/<triplet>/ 下的头文件。
如果头文件不在这些路径中,必须使用 pkg-config 命令设置 GCC 的 -I 参数以使得“#include <foo.h>”正常工作。
表 5.2. 多架构头文件路径选项
经典路径 | i386 多体系结构路径 | amd64 多体系结构路径 |
---|---|---|
/usr/include/ |
/usr/include/i386-linux-gnu/ |
/usr/include/x86_64-linux-gnu/ |
/usr/include/ 软件包名 / |
/usr/include/i386-linux-gnu/ 软件包名 / |
/usr/include/x86_64-linux-gnu/ 软件包名 / |
/usr/lib/i386-linux-gnu/ 软件包名 / |
/usr/lib/x86_64-linux-gnu/ 软件包名 / |
为库文件使用 /usr/lib/<triplet>/软件包名/ 路径可帮助上游维护者对使用 /usr/lib/<triplet> 的多架构系统和使用 /usr/lib<qual>/ 的双架构系统使用相同的安装脚本。[17]
使用包含 packagename 的文件路径也使得在同一系统上同时安装多个架构的开发库成为可能。
自 Debian jessie(8.0 开始)的编译器加固支持要求我们在打包时加以注意。
您应当详细阅读下列参考内容。
debmake 命令会向 debian/rules 文件中按需添加 DEB_BUILD_MAINT_OPTIONS、DEB_CFLAGS_MAINT_APPEND 和 DEB_LDFLAGS_MAINT_APPEND 的项目(参见 第 4 章 简单例子 和 dpkg-buildflags(1))。
DEP-8 定义了 debian/tests/control 文件的格式,它是 RFC822 风格的测试元数据文件,用于 Debian 软件包的持续集成(CI)。
它在完成构建包含 debian/tests/control 文件的源码包、得到二进制包之后发挥作用。在运行 autopkgtest 命令时,所生成的二进制软件包会根据这个文件在虚拟环境中自动进行安装和测试。
请参考 /usr/share/doc/autopkgtest/ 目录下的文档和《Debian 打包指导”中的 3. autopkgtest: 软件包的自动测试。
您可以在 Debian 系统上探索使用不同的持续集成系统。
Debian 关心对新硬件架构的移植工作。新架构的移植工作对自举(bootstrapping)操作有所要求,以完成对初始最小本地构建系统的交叉编译。为了在自举(bootstrapping)时避免构建依赖成环的问题,需要使用 配置类型(profile) 的构建功能特性来缩减所需构建依赖。
![]() |
提示 |
---|---|
如果一个核心软件包 |
reportbug 命令用于提交 binarypackage 软件包的错误报告;usr/share/bug/binarypackage/ 可以对针对该软件所提交报告的内容进行自定义。
dh_bugfiles 命令将安装以下位于 debian/ 目录中的的模板文件。
debian/binarypackage.bug-control → usr/share/bug/binarypackage/control
debian/binarypackage.bug-presubj → usr/share/bug/binarypackage/presubj
debian/binarypackage.bug-script → usr/share/bug/binarypackage or usr/share/bug/binarypackage/script
参见 dh_bugfiles(1) 和 为开发者提供的 reportbug 功能特性
![]() |
提示 |
---|---|
如果您总是需要提醒提交报告的用户某些注意事项或询问他们某些问题,使用这些文件可以将这个过程自动化。 |
[10] 对九成以上的软件包来说,软件包名称都不会超过 24 个字符;上游版本号通常不超过 10 个字符,而 Debian 修订版本号也通常不超过 3 个字符。
[11] 这个简化形式在 debhelper 软件包第七版或更新的版本中可用。本指南内容假设您在使用 debhelper 第九版或更新的版本。
[12] debmake 命令会产生稍微复杂一些的 debian/rules 文件。虽然如此,其核心结构没有什么变化。
[13] 如果您在使用 vim 编辑器,请确保使用“:wq”命令对内容进行保存。
[14] 程序以前会在内部调用来自 devscripts 软件包的 licensecheck 命令来进行检查。现在的 licensecheck 命令由独立的 licensecheck 软件包所提供,相较从前的实现也有了较大的改进。
[15] 该文档是在 symbols 文件被引入之前写成的。
[16] 在第六章 - 开发(-DEV)软件包中,存在强烈的使用含有 SONAME 版本号的 -dev 软件包名而非仅使用 -dev 作为名称的偏好,但前 ftp-master 成员(Steve Langasek)对此有不同意见。请注意该文档在 multiarch 系统和 symbols 引入之前写成,可能有一定程度的过时。
[17] 这个路径和 FHS 兼容。文件系统层级标准:/usr/lib:程序和软件包的库 称“应用程序可以使用 /usr/lib 下的一个子目录。如果一个应用程序使用一个子目录,所有由此程序所使用的架构相关数据均须放置于该子目录下。”