Appendix A. debmake(1) 手册页

debmake,用来制作 Debian 源码包的程序

debmake [-h] [-c | -k] [-n | -a 软件包名-版本号.orig.tar.gz | -d | -t ] [-p package] [-u version] [-r 修订号] [-z 扩展] [-b "binarypackage, …]" [-e foo@example.org] [-f "名称 姓氏"] [-i "构建工具" | -j] [-l license_file] [-m] [-o file] [-q] [-s] [-v] [-w "addon, …"] [-x [01234]] [-y] [-L] [-P] [-T]

debmake 协助从上游源代码构建一个 Debian 软件包,通常做法如下:

  • 下载上游源码压缩包(tarball)并命名为 package-version.tar.gz 文件。
  • 对其进行解压缩并将所有文件放置于 package-version/ 目录之下。
  • package-version/ 目录中调用 debmake,并按需带上参数。
  • 手工调整 package-version/debian/ 目录下的文件。
  • dpkg-buildpackage (usually from its wrapper debuild or sbuild) is invoked in the package-version/ directory to make Debian packages.

请确保将 -b-f-l-w 选项的参数使用引号合适地保护起来,以避免 shell 环境的干扰。

-h, --help
显示本帮助信息并退出。
-c, --copyright

为授权+许可证文本而扫描源码,然后退出。

  • -c:简单输出风格
  • -cc:正常输出风格(类似 debian/copyright 文件)
  • -ccc:调试输出风格
-k, --kludge

debian/copyright 文件和源代码进行比较并退出。

debian/copyright 必须将通用的文件匹配模式放在前部并将个别文件的例外放在后部。

  • -k:基本输出风格
  • -kk:冗长输出风格
-n, --native

制作一个原生 Debian 源码包,即不涉及 .orig.tar.gz。这样将制作一个“3.0 (native)”格式的包。

如果您正打算打包一个含 debian/* 目录的 Debian 特有的源码树成为一个 Debian 原生软件包的话,还请三思。您可以使用“debmake -d -i debuild”或者“debmake -t -i debuild”命令来创建一个“3.0 (quilt)”格式的非原生 Debian 软件包。唯一的区别是 debian/changelog 文件必须使用非原生软件包对应的命名规范:版本号-修订号。非原生的软件包对下游发行版更友好。

-a package-version.tar.gz, --archive package-version.tar.gz

直接使用上游源码压缩包。(-p, -u, -z:被覆盖)

上游源码压缩包可以命名为 package_version.orig.tar.gz 或者 tar.gz。在某些情况下,也可使用 tar.bz2tar.xz

如果所指定的源码压缩包文件名中包含大写字母,Debian 打包时生成的名称会将其转化为小写字母。

如果所指定的参数是一个指向上游源码压缩包的 URL(http://、https:// 或 ftp://),程序将会使用 wgetcurl 下载这个压缩包。

-d, --dist

先运行“make dist”命令或其等效命令以生成上游源码压缩包并在打包过程中使用。

debmake -d”命令设计用于在 软件包名/ 目录下使用了上游版本控制系统的场景,且其构建系统支持“make dist”或其等效命令。(如 automake/autoconf、Python distutils 等等)

-t, --tar

运行“tar”命令以生成上游源码压缩包并在打包过程中使用。

debmake -t”命令设计用于在 软件包名/ 目录下使用了上游版本控制系统的场景。除非您使用了 -u 选项或者使用 debian/changelog 文件提供了上游版本号,默认情况下程序将运用协调世界时日期和时间按照 0~%y%m%d%H%M 的格式作为快照的上游版本号,例如 0~1403012359。所生成的压缩包将排除上游版本控制系统中的 debian/ 目录。(它也会排除常见的版本控制系统目录:.git/ .hg/ .svn/ .CVS/。)

-p 软件包名, --package 软件包名
设置 Debian 软件包名称。
-u 上游版本号, --upstreamversion 版本号
设置上游软件包版本。
-r 修订号, --revision 修订号
设置 Debian 软件包修订号。
-z 扩展名, --targz 扩展名
设置源码压缩包类型,扩展名=(tar.gz|tar.bz2|tar.xz)。(别名:z, b, x
-b "二进制软件包名[:type],…", --binaryspec "二进制软件包名[:type],…"

设置二进制软件包的指定类型内容,使用一个用逗号分隔的二进制软件包名:类型成对列表;例如,使用完整形式“foo:bin,foo-doc:doc,libfoo1:lib,libfoo-dev:dev”或者使用短形式,“-doc,libfoo1,libfoo-dev”。

这里,二进制软件包是二进制软件包名称,可选的类型应当从下面的类型值中进行选取:

  • bin:C/C++ 预编译 ELF 二进制代码软件包(any,foreign)(默认,别名:"",即,空字符串
  • data:数据(字体、图像、……)软件包(all,foreign)(别名:da
  • dev:库开发软件包(any,same)(别名:de
  • doc:文档软件包(all,foreign)(别名:do
  • lib:库软件包(any,same)(别名:l
  • perl:Perl 脚本软件包(all,foreign)(别名:pl
  • python3:Python(版本 3)脚本软件包(all,foreign)(别名:py3
  • ruby:Ruby 脚本软件包(all,foreign)(别名:rb
  • nodejs:基于 Node.js 的 JavaScript 软件包(all,foreign)(别名:js
  • script:Shell 脚本软件包(all,foreign)(别名:sh

括号内成对的值,例如(any,foreign),是软件包的架构多架构(Multi-Arch)特性的值,它们将设置在 debian/control 文件中。

大多数情况下,debmake 命令可以有效地从二进制软件包的名称猜测出正确的类型。如果类型的值并不明显,程序将回退到将类型设置为bin。例如,libfoo 设置类型lib,而 font-bar 会令程序设置类型data,……

如果源码树的内容和类型的设置不一致,debmake 命令会发出警告。

-e foo@example.org, --email foo@example.org

设置电子邮件地址。

默认值为环境变量 $DEBEMAIL 的值。

-f "名称 姓氏", --fullname "名称 姓氏"

设置全名。

默认值为环境变量 $DEBFULLNAME 的值。

-i "构建工具", --invoke "构建工具"

invoke "buildtool" at the end of execution. buildtool may be “dpkg-buildpackage”, “debuild”, “sbuild”, etc.

默认情况是不执行任何程序。

设置该选项也会自动设置 --local 选项。

-j, --judge

运行 dpkg-depcheck 以检查构建依赖和文件路径。检查日志将存储在父目录下。

  • 软件包名.build-dep.logdpkg-depcheck 的日志文件。
  • 软件包名.install.log:记录 debian/tmp 目录下所安装文件的日志。
-l "许可证文件,…", --license "许可证文件,…"

在存放许可证扫描结果的 debian/copyright 文件末尾添加格式化后的许可证文本。

默认值是添加 COPYINGLICENSE 文件,您只需要在许可证文件部分添加额外的文件名即可,并使用“,”分隔各个文件名。

-m, --monoarch
强制软件包不使用多架构特性。
-o 文件, --option 文件

从指定file读取可选参数。(这个选项不适合日常使用。)

文件 file 的内容,将在 para.py 的末尾作为 Python 代码的源代码。例如,软件包描述信息可以使用下述文件来定义。

para['desc'] = 'program short description'
para['desc_long'] = '''\
 program long description which you wish to include.
 .
 Empty line is space + .
 You keep going on ...
'''
-q, --quitearly
在创建 debian/ 目录下的文件之前即提前退出程序。
-s, --spec
使用上游配置文件(例如 Python 里的 setup.py 等)信息来初始化软件包描述内容。
-v, --version
显示版本信息。
-w "addon,…", --with "addon,…"

debian/rules 文件中向 dh(1) 命令的参数中添加额外的 dh(1) 参数以指定所使用的附加组件(addon)。

这里 addon 的值中各项使用“,”进行分隔,例如“-w "python3,autoreconf"”

对于基于 Autotools 的软件包,autoreconf 作为 addon 运行“autoreconf -i -v -f”,是dh(1) 命令在每次构建软件包的默认行为。

对基于 Autotools 的软件包,如果它们要安装 Python(版本 3) 程序,您需要指定 python3 作为 addondebmake 命令参数,因为这不是显而易见的。但对基于 setup.py 的软件包来说,并不需要指定 python3 作为 addondebmake 命令参数,因为这是显而易见的,debmake 会自动为 dh(1) 命令设置这样的参数。

-x n, --extra n

以模板文件的形式创建配置文件(请注意 debian/changelogdebian/controldebian/copyrightdebian/rules 文件是构建 Debian 二进制软件包所需的最小文件集合。)

n 的数字大小决定了生成哪些配置模板文件。

  • -x0:最少的配置文件(这是存在任何已有配置文件时的默认选项)
  • -x1:所有 -x0 提供的文件以及用于生成单个二进制软件包可能需要的配置文件。(这是只生成单个二进制软件包,且不存在其它已有配置文件时的默认选项)
  • -x2:所有 -x2 提供的文件以及用于生成多个二进制软件包可能需要的配置文件。(这是生成多个二进制软件包,且不存在其它已有配置文件时的默认选项)
  • -x3:所有 -x2 提供的文件以及不常使用的配置模板文件。不常使用的配置模板文件在生成时会带上 .ex 后缀名以方便对其删除。如需使用这些配置文件,请重命名这些文件并去除 .ex 的后缀。
  • -x4 选项:全部配置 -x3 文件加版权声明文件示例。
-y, --yes
对所有提示“强制选择是”(不提示选项“询问 [是/否]”;重复选项两次则为“强制选择否”)
-L, --local
为本地软件包生成配置文件以绕过 lintian(1) 的检查。
-P, --pedantic
对自动生成的文件进行严格(甚至古板到迂腐程度)的检查。
-T, --tutorial
在模板文件中输出教程注释行。

对比较正常的源码来说,您可以使用一行命令简单地构建一个自用的 Debian 二进制软件包。测试安装这样生成的软件包通常比传统的“make install”命令安装至 /usr/local 目录更好,因为 Debian 软件包可以使用“dpkg -P …””命令更干净地卸载掉。这里提供构建这类测试软件包的一些例子(这些例子应该在大多数情况下足够使用。如果 -d 选项无法工作,请尝试使用 -t 选项。)

对典型的使用 autoconf/automake 的 C 程序源码树:

  • debmake -d -i debuild

对于典型的 Python(版本 3)模块源码树:

  • debmake -s -d -b":python3" -i debuild

对于 package-version.tar.gz 存档里的一个典型 Python*(版本 3) 模块:

  • debmake -s -a package-version.tar.gz -b":python3" -i debuild

对于典型的以 package-version.tar.gz 归档提供的 Perl 模块:

  • debmake -a package-version.tar.gz -b":perl" -i debuild

打包工作也许需要额外安装一些专用的帮助软件包。

  • Python(版本 3)程序可能需要 dh-python 软件包。
  • Autotools (Autoconf + Automake) 构建系统可能需要 autotools-devdh-autoreconf 软件包。
  • Ruby 程序可能需要 gem2deb 软件包。
  • 基于JavaScript 的 Node.js 程序可能需要 pkg-js-tools 软件包。
  • Java 程序可能需要 javahelper 软件包。
  • Gnome 程序可能需要 gobject-introspection 软件包。
  • 等等。

debmake 的目的是为软件包维护者提供开始工作的模板文件。注释行以 # 开始,其中包含一些教程性文字。您在将软件包上传至 Debian 仓库之前必须删除或者修改这样的注释行。

许可证信息的提取和赋值过程应用了大量启发式操作,因此在某些情况下可能不会正常工作。强烈建议您搭配使用其它工具,例如来自 devscripts 软件包的 licensecheck 工具,以配合 debmake 的使用。

组成 Debian 软件包名称的字符选取存在一定的限制。最明显的限制应当是软件包名称中禁止出现大写字母。这里给出正则表达式形式的规则总结:

  • 上游软件包名称(-p):[-+.a-z0-9]{2,}
  • 二进制软件包名称(-b):[-+.a-z0-9]{2,}
  • 上游版本号(-u):[0-9][-+.:~a-z0-9A-Z]*
  • Debian 修订版本(-r): [0-9][+.~a-z0-9A-Z]*

请在《Debian 政策手册》的 第 5 章 - Control 文件及其字段 一节中查看其精确定义。

debmake 所假设的打包情景是相对简单的。因此,所有与解释器相关的程序都会默认为“Architecture: all”的情况。当然,这个假设并非总是成立。

请使用 reportbug 命令报告 debmake 软件包的问题与错误。

环境变量 $DEBUG 中设置的字符用来确定日志输出等级。

  • i:打印信息
  • p:列出全部全局参数
  • d:列出所有二进制软件包解析得到的参数
  • f:用于扫描授权信息的输入文件名
  • y:授权信息栏的年份/名称切分信息
  • s:format_state 的行扫描器
  • b:content_state 扫描循环:循环开始
  • m: content_state 扫描循环:正则匹配之后
  • e: content_state 扫描循环:循环结束
  • c:打印授权区段文本
  • l:打印许可证区段文本
  • a:打印作者/翻译者区段文本
  • k:debian/copyright 各节的排序关键字
  • n:debian/copyright 的扫描结果(“debmake -k”)

用法如下:

 $ DEBUG=pdfbmeclak debmake ...

查看源码中的 README.developer 文件以了解更多信息。

Copyright © 2014-2021 Osamu Aoki <osamu@debian.org>

Expat 许可证

debmake-doc 软件包提供了“Debian 维护者指南”手册,以纯文本、HTML 和 PDF 三种格式存放在 /usr/share/doc/debmake-doc/ 目录下。

See also dpkg-source(1), deb-control(5), debhelper(7), dh(1), dpkg-buildpackage(1), debuild(1), quilt(1), dpkg-depcheck(1), sbuild(1), gbp-buildpackage(1), and gbp-pq(1) manpages.