关于debian/目录

  1. debian官网参考资料: debian-policy-manualhttps://www.debian.org/doc/manuals/maint-guide/dreq.zh-cn.html
  2. 该目录包含了所有构建deb包需要的文件,例如changelog、control、rules等
  3. 可以通过devscripts自动或者手动的方式来生成这些文件

获取软件包源码

  1. /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
  2. 直接去launchpad.net或者salsa.debian.org上直接下载源码

debian/changelog

  1. 必须文件
  2. 这个文件记录了codename,版本号,发行日志,开发人员签名,发行日期等重要信息
  3. 版本号必须递增,且必须填写一次发行日志
  4. urgency重要程度一般有low/medium/high/critical
  5. 注意,如果BTS(BUG TRACING SYSTEM)平台上的bug在这次源码修改中修复了,可以添加closes: Bug#nnnnn字段到发行日志信息中,将触发BTS平台自动关闭对应bug
  6. 发行日志示例如下,其中方括号包含的内容是我写的注释
    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[日期]

debian/copyright

  1. 每个deb包安装后都会有对应的一个copyright文件放在/usr/share/doc/PACKAGE/目录下
  2. 默认创建的、安装的一般都是GPL-V2协议的copyright
  3. 自建软件包时,也应该有一个copyright文件放到debian/目录下,可以按需选择协议

debian/control

  1. 这个control文件可以算是最最重要的东西了
  2. 几乎记录了源码文件和其所生成的二进制包的所有信息,包括安装依赖,源码编译依赖,软件包描述等
  3. 每个二进制包都会记录在control文件中,包括其安装依赖,软件包描述等
  4. 源码域中的以下通用字段
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】
  1. 二进制包域中的一些字段
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的话一般不写!】
  1. control中也支持一些内置变量, 没用过,不太了解

debian/rules

  1. rules文件是一种类似makefile的描述编译规则的文件
  2. 必须有可执行权限,且要在第一行写上#! /usr/bin/make -f
  3. 必须在rules中完成源码编译和二进制包打包工作
  4. 执行make -f debian/rules args... 或 ./debian/rules args应该保持一致
  5. rules中最重要的的几个方法,在编包过程中会由dpkg-buildpackage调用这几个方法:
    clean, binary, binary-arch, binary-indep, build, build-arch and build-indep
  6. rules文件中的命令不应该要求和用户交互,否则无法自动完成编译

rules文件中的几个常用编译目标:

  1. build:
  1. build目标应该完成所有的配置和编译工作
  2. 需要交互的配置工作应该在编译开始前完成
  3. build阶段不应该要求提权
  4. build阶段可能需要先调用clean目标清理下环境
  5. 可以通过在build完成时生成一个时间戳build-stamp文件来避免每次重新编译导致无意义的等待
  1. build-arch:
  1. 应该完成所有架构相关的配置和编译工作
  2. 不能提权
  3. build目标可以依赖build-arch目标
  1. binary\binary-arch\binary-indep:
  1. binary:所有二进制包的配置和编译工作
  2. binary由架构相关的binary-arch和架构无关的binary-indep一起组成
  3. binary目标可以被binary-arch或者binary-indep依赖,避免编译未完成
  4. binary调用dpkg-deb完成二进制包的打包工作,生成的deb包将放在源码目录的根目录下
  5. binary-*两个目标必须存在,且必须成功
  1. clean:
  1. clean目标应该把binary和build目标生成的文件和做的改动都还原
  2. clean目标不应该用来删除源码根目录下的文件,应该其可能已经存在与上游源码压缩包中(如果要删掉,应该重新压缩源码包)

debian/*.install

  1. 例如写一个foo.install文件,里面内容如下,其效果就是将二进制包名为foo的deb包中的usr/lib/目录下的xxx安装到系统的/usr/lib/目录下,有点像# install -D命令
  2. 这个文件是dh_install命令调用的,所以在rules文件中不能将dh_install重写为空
  3. 如果源码包只生成一个二进制deb包,可以直接命名为install
    usr/lib/xxx /usr/lib/

debian/*.postinst

  1. 像install文件一样,可以为foo二进制包命名为foo.postinst——这样在安装foo二进制包时才会调用这个foo.postinst
  2. 安装后执行,用得比较多——可用来配置、启动你的程序
  3. 需要可执行权限
  4. 可以像普通shell脚本一样写。最好借用标准的postinst模板,然后自己重写其中的安装后执行的函数

debian/*.preinst

  1. 如上,不过是安装前执行的,可用来提前清理环境准备安装
  2. 也最好采用模板来改

debian/*.prerm

  1. 如上,卸载前执行,用来停止服务、进程准备卸载

debian/*.postrm

  1. 如上,卸载后执行,用来清理残余文件

debian/*.template

  1. 一个语言国际化模板,用来翻译显示文本,可以参考这里

debian/patches

  1. 这个目录仅在debian/source/format文件中写的是3.0 (quilt)时会有,用来存放quilt管理的所有补丁。quilt是一种针对debian软件包的本地版本控制管理工具。