关于debian/目录
- debian官网参考资料: debian-policy-manual
- 该目录包含了所有构建deb包需要的文件,例如changelog、control、rules等
- 可以通过devscripts自动或者手动的方式来生成这些文件
获取软件包源码
- 在
/etc/apt/sources.list
文件或/etc/apt/sources.list.d/
下的.list文件中添加如下的软件源配置, 然后通过# apt-get source PACKAGE
获取软件源中的源码文件。一般地,会有xx.orig.tar.gz和xx.debian.tar.gz和xx.dsc三个文件以及一个源码目录。如果没有源码目录,就自行解压dpkg-source -x *.dsc
。最终可以在源码目录中看到debian/目录。deb-src http://cn.archive.ubuntu.com/ubuntu/ xenial main restricted
- 直接去launchpad.net或者salsa.debian.org上直接下载源码
debian/changelog
-
必须文件
-
这个文件记录了codename,版本号,发行日志,开发人员签名,发行日期等重要信息
-
版本号必须递增,且必须填写一次发行日志
-
urgency重要程度一般有
low
/medium
/high
/critical
-
注意,如果BTS(BUG TRACING SYSTEM)平台上的bug在这次源码修改中修复了,可以添加
closes: Bug#nnnnn
字段到发行日志信息中,将触发BTS平台自动关闭对应bug -
发行日志示例如下,其中方括号包含的内容是我写的注释
debconf[软件包名] (1.5.58[版本号]) unstable[codename]; urgency=medium[重要程度]
- Don’t update po/debconf.pot unless doing so changes something other than
the POT-Creation-Date header. The basic approach here is from gettext,
though implemented a bit more simply since we can assume perl.[发行日志] - Show choices for teletype/readline boolean questions (closes: #802840).
- Move bash completion file to /usr/share/bash-completion/completions/.
– Colin Watson cjwatson@debian.org[签名] Sun, 08 Nov 2015 03:27:10 +0000[日期]
- Don’t update po/debconf.pot unless doing so changes something other than
debian/copyright
- 每个deb包安装后都会有对应的一个copyright文件放在/usr/share/doc/PACKAGE/目录下
- 默认创建的、安装的一般都是GPL-V2协议的copyright
- 自建软件包时,也应该有一个copyright文件放到debian/目录下,可以按需选择协议
debian/control
-
这个control文件可以算是最最重要的东西了
-
几乎记录了源码文件和其所生成的二进制包的所有信息,包括安装依赖,源码编译依赖,软件包描述等
-
每个二进制包都会记录在control文件中,包括其安装依赖,软件包描述等
-
源码域中的以下通用字段
Source (mandatory)【源码包名】 Maintainer (mandatory)【维护者】 Uploaders【上传者】 Section (recommended)【所属组件-一般要求填写,比如utils,misc,python等】 Priority (recommended)【重要程度】 Build-Depends et al【编译依赖】 Standards-Version (mandatory)【标准版本号】 Homepage【主页】 Version Control System (VCS) fields【版本控制系统】 Testsuite【测试套件】 Rules-Requires-Root【要求提权的一些操作,比如binary-target, 也可以是no】
-
二进制包域中的一些字段
Package (mandatory)【包名-必须有】 Architecture (mandatory)【架构,比如arm64/amd64/all】 Section (recommended) Priority (recommended) Essential【如果设置这里为true,那么这个包会禁止卸载,但可以升降级】 Depends et al【安装依赖】 Description (mandatory)【描述】 Homepage Built-Using【用来包含另一个源码包中的二进制包,**没用过, 不太了解**】 Package-Type【二进制包类型,有deb和udeb,注意deb的话一般不写!】
-
control中也支持一些内置变量, 没用过,不太了解…
debian/rules
-
rules文件是一种类似makefile的描述编译规则的文件
-
必须有可执行权限,且要在第一行写上
#! /usr/bin/make -f
-
必须在rules中完成源码编译和二进制包打包工作
-
执行
make -f debian/rules args...
或./debian/rules args
应该保持一致 -
rules中最重要的的几个方法,在编包过程中会由
dpkg-buildpackage
调用这几个方法:clean, binary, binary-arch, binary-indep, build, build-arch and build-indep
-
rules文件中的命令不应该要求和用户交互,否则无法自动完成编译
rules文件中的几个常用编译目标:
-
build:
- build目标应该完成所有的配置和编译工作
- 需要交互的配置工作应该在编译开始前完成
- build阶段不应该要求提权
- build阶段可能需要先调用clean目标清理下环境
- 可以通过在build完成时生成一个时间戳build-stamp文件来避免每次重新编译导致无意义的等待
-
build-arch:
- 应该完成所有架构相关的配置和编译工作
- 不能提权
- build目标可以依赖build-arch目标
-
binary\binary-arch\binary-indep:
- binary:所有二进制包的配置和编译工作
- binary由架构相关的binary-arch和架构无关的binary-indep一起组成
- binary目标可以被binary-arch或者binary-indep依赖,避免编译未完成
- binary调用dpkg-deb完成二进制包的打包工作,生成的deb包将放在源码目录的根目录下
- binary-*两个目标必须存在,且必须成功
-
clean:
- clean目标应该把binary和build目标生成的文件和做的改动都还原
- clean目标不应该用来删除源码根目录下的文件,应该其可能已经存在与上游源码压缩包中(如果要删掉,应该重新压缩源码包)
debian/*.install
-
例如写一个foo.install文件,里面内容如下,其效果就是将二进制包名为foo的deb包中的usr/lib/目录下的xxx安装到系统的/usr/lib/目录下,有点像
# install -D
命令 -
这个文件是dh_install命令调用的,所以在rules文件中不能将
dh_install
重写为空 -
如果源码包只生成一个二进制deb包,可以直接命名为install
usr/lib/xxx /usr/lib/
debian/*.postinst
- 像install文件一样,可以为foo二进制包命名为foo.postinst——这样在安装foo二进制包时才会调用这个foo.postinst
- 安装后执行,用得比较多——可用来配置、启动你的程序
- 需要可执行权限
- 可以像普通shell脚本一样写。最好借用标准的postinst模板,然后自己重写其中的安装后执行的函数
debian/*.preinst
- 如上,不过是安装前执行的,可用来提前清理环境准备安装
- 也最好采用模板来改
debian/*.prerm
- 如上,卸载前执行,用来停止服务、进程准备卸载
debian/*.postrm
- 如上,卸载后执行,用来清理残余文件
debian/*.template
- 一个语言国际化模板,用来翻译显示文本,可以参考这里
debian/patches
- 这个目录仅在debian/source/format文件中写的是
3.0 (quilt)
时会有,用来存放quilt
管理的所有补丁。quilt是一种针对debian软件包的本地版本控制管理工具。