Linux之deb包中的debian目录
Linux之deb包中的debian目录
deb包中有一个叫做 debian
的子目录。这个目录中存放着许多文件,这些文件决定了软件包的一些行为。
必须文件
debian
目录中最重要的文件当属 control
, changelog
, copyright
, 以及 rules
, 所有的软件包都必须有这几个文件。
control
control 文件中包含了软件包的元数据,例如软件包的名称、版本、维护者、依赖关系等。
这些变量供 dpkg
、dselect
、apt-get
、apt-cache
、aptitude
等包管理工具进行管理时所使用,均在 Debian Policy Manual, 5 “Control files and their fields” 中被定义。
下面是一个 control 文件的简单例子:
Source: gentoo
Section: unknown
Priority: optional
Maintainer: Josip Rodin <joy-mg@debian.org>
Build-Depends: debhelper (>=10)
Standards-Version: 4.0.0
Homepage: <insert the upstream URL, if relevant>
Package: gentoo
Architecture: any
Depends: ${shlibs:Depends}, ${misc:Depends}
Description: <insert up to 60 chars description>
<insert long description, indented with spaces>
从上面看,主要分为2部分,第一部分是源代码包的控制信息,第二部分是二进制包的控制信息。
源代码包的控制信息:
Source:
源代码包的名称Section:
该源码包要进入发行版中的分类Priority:
用户安装此软件包的优先级Maintainer:
维护者信息Build-Depends:
编译此软件包需要的软件包Standards-Version:
此软件包所依据的 Debian Policy Manual 标准版本号Homepage:
软件包的官方主页
二进制包的控制信息:
Package:
二进制包的名称Architecture:
软件包的架构,all
表示生成的二进制包独立于体系结构,不依赖于具体的硬件平台Depends:
软件包的依赖关系,它Debian 软件包系统中最强大的特性之一。每个软件包都可以和其他软件包有各种不同的关系。除 Depends 外,还有 Recommends、Suggests、Pre-Depends、Breaks、Conflicts、Provides 和 Replaces。Description:
软件包的描述
由于篇幅有限,更多细节请参考官方文档。
changelog
changelog 文件中包含了软件包的变更日志,记录了软件包的版本变更情况。
它的格式在 Debian Policy Manual, 4.4 “debian/changelog” 中有详细的描述。这种格式被 dpkg 和其他程序用以解析版本号信息、适用的发行版和紧急程度。
它将帮助下载你的软件包的人了解这个软件包中是否有他们需要知道的事情。它会被作为 /usr/share/doc/gentoo/changelog.Debian.gz
保存在二进制包中。
下面是一个 changelog 文件的简单例子:
1 gentoo (0.9.12-1) unstable; urgency=medium
2
3 * Initial release. (Closes: #nnnn) <nnnn is the bug number of your ITP>
4
5 -- Josip Rodin <joy-mg@debian.org> Mon, 22 Mar 2010 00:37:31 +0100
第 1 行是软件包名、版本号、发行版和紧急程度。软件包名必须与实际的源代码包名相同,发行版应该是 unstable。除非有特殊原因,紧急程度默认设置为 medium(中等)。
后面几行是变更修改的相关信息,包括修改日期、修改者、修改内容等。
copyright
copyright 文件中包含了软件包的版权信息,包括版权所有者、版权年份、许可证等。
这部分不过多介绍,更多可以参考 Debian Policy Manual, 12.5 “Copyright information” 和 DEP-5: Machine-parseable debian/copyright。
rules
rules 文件中包含了软件包的构建规则,包括如何编译、安装、打包等步骤。
现在我们需要看看 dpkg-buildpackage
用于实际创建软件包的 rules 文件。这个文件事实上是另一个 Makefile,但不同于上游源代码中的那个。和 debian 目录中的其他文件不同,这个文件被标记为可执行。
rules 文件中的 Target
每一个 rules 文件, 就像其他的 Makefile 一样,包含着若干 rules,其中每一个都定义了一个 target 以及其具体 操作。一个新的 rule 以自己的 target 声明(置于第一列)来起头。 后续的行都以 TAB 字符 (ASCII 9) 来开头,以指示 target 的具体行为。 空行和以井号 #
开头的行会被当作注释而被忽略
当你想要执行一个 rule 的时候,就将 target(目标)名称作为命令行参数来调用。比如说, debian/rules build
以及 fakeroot make -f debian/rules binary
会分别执行 build
和 binary
两个 target。
以下是对各 target 的简单解释:
clean target
:清理所有编译的、生成的或编译树中无用的文件。(必须)build target
:在编译树中将代码编译为程序并生成格式化的文档。(必须)build-arch target
:在编译树中将代码编译为依赖于体系结构的程序。(必须)build-indep target
:在编译树中将代码编译为独立于平台的格式化文档。(必须)install target
:把文件安装到 debian 目录内为各个二进制包构建的文件树。如果有定义,那么 binary* target 则会依赖于此 target。(可选)binary target
:创建所有二进制包(是 binary-arch 和 binary-indep 的合并)。(必须)binary-arch target
:在父目录中创建平台依赖(Architecture: any)的二进制包。(必须)binary-indep target
:在父目录中创建平台独立(Architecture: all)的二进制包。(必须)get-orig-source target
:从上游站点获得最新的原始源代码包。(可选)
可能你现在感到有些迷惑,在接下来讲解 dh_make
给出的默认的 rules
文件时事情会变得简单。
默认的rules文件
新版本的 dh_make 会生成一个使用 dh 命令的非常简单但非常强大的默认的 rules 文件:
#!/usr/bin/make -f
# See debhelper(7) (uncomment to enable)
# output every command that modifies files on the build system.
#DH_VERBOSE = 1
# see FEATURE AREAS in dpkg-buildflags(1)
#export DEB_BUILD_MAINT_OPTIONS = hardening=+all
# see ENVIRONMENT in dpkg-buildflags(1)
# package maintainers to append CFLAGS
#export DEB_CFLAGS_MAINT_APPEND = -Wall -pedantic
# package maintainers to append LDFLAGS
#export DEB_LDFLAGS_MAINT_APPEND = -Wl,--as-needed
%:
dh $@
简单说明:#!/usr/bin/make -f
: 告诉操作系统这个文件应使用 /usr/bin/make 处理。
最后两行: 使用了 pattern rule,以此隐式地完成所有工作。 其中的百分号意味着“任何 targets”, 它会以 target 名称作参数调用单个程序 dh
。
例如:debian/rules build
运行了 dh build
,其实际执行的命令为:
dh_testdir
dh_auto_configure
dh_auto_build
dh_auto_test
dh_*
命令的功能依其名称不言而喻。假定有一个基于 Makefile 的典型构建环境:dh_auto_build
通常使用以下命令执行 Makefile
中的第一个 target:
make
以此类推。
定制 rules 文件
有很多方法来定制使用新的 dh 命令创建的 rules 文件。这个就不多说了,可以参考官方文档。
其他可选文件
要控制 debhelper
在构建软件包过程中的大部分行为,可以在 debian 目录中放置可选的配置文件。
这里就介绍几个我觉得比较常用的可选文件。
install
如果你的软件包需要那些标准的 make install
没有安装的文件,你可以把文件名和目标路径写入 install 文件,它们将被 dh_install
安装。你需要首先检查要安装的文件是否有更有针对性的特定工具会对其进行安装。例如,文档应写在 docs 文件中安装,而不是这一个。
这个 install 文件每行安装一份文件,格式上先是相对于编译目录的文件路径,然后是一个空格,接下来是相对于安装目录的目标目录。例如,假设某个二进制文件 src/bar
没有被默认安装,则应让 install 呈现成这样:
src/bar usr/bin
这意味着安装这个软件包时,将有一个二进制文件 /usr/bin/bar
.
{pre,post}{inst,rm}
postinst
、preinst
、postrm
和 prerm
文件被称为 maintainer scripts
。它们是放置于软件包控制区域,并由 dpkg 在软件包安装、升级或卸载时执行的脚本。
作为一个新手,应当避免手工编辑 maintainer scripts
,因为它们常存在各种问题。更多信息请阅读 Debian Policy Manual, 6 “Package maintainer scripts and installation procedure” 并查看 dh_make
给出的示例文件。
如果是自己手工自定义的这些脚本,必须保证不仅测试 install
和 upgrade
,还应测试 remove
和 purge
。升级到新版本应当是静默且非侵入式的,各种情况都需要考虑到。
参考
这篇主要是简单介绍了deb包的 debian
目录中一些常用的文件,以及大致的作用,里面还有很多的细节,这里就不赘述了,可参考官方文档: