Appendix A. debmake(1) 手册页

A.1. 名称

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

A.2. 概述

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] [-waddon, …“] [-x [01234]] [-y] [-L] [-P] [*-T]

A.3. 描述

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

  • 下载上游源码压缩包(tarball)并命名为 package-version**.tar.gz** 文件。
  • 对其进行解压缩并将所有文件放置于 package-version/ 目录之下。
  • package-version/ 目录中调用 debmake,并按需带上参数。
  • 手工调整 package-version**/debian/** 目录下的文件。
  • package-version/ 目录下调用 dpkg-buildpackage(通常使用其高层封装工具,例如 debuild 或者 pdebuild)以构建 Debian 软件包。

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

A.3.1. 可选参数:

-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构建工具

在执行结束时调用“构建工具”。构建工具可以是“dpkg-buildpackage”、“debuild”、“pdebuild”、pdebuild —pbuilder cowbuilder”等等。

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

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

-j, --judge

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

  • 软件包名**.build-dep.logdpkg-depcheck** 的日志文件。
  • 软件包名**.install.log:记录 debian/tmp** 目录下所安装文件的日志。

-l许可证文件,…“, --license许可证文件,…

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

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

-m, --monoarch

强制软件包不使用多架构特性。

-o 文件, --option 文件

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

The content of file is sourced as the Python code at the end of para.py. For example, the package description can be specified by the following file.

  1. para['desc'] = 'program short description'
  2. para['desc_long'] = '''\
  3. program long description which you wish to include.
  4. .
  5. Empty line is space + .
  6. You keep going on ...
  7. '''

-q, --quitearly

在创建 debian/ 目录下的文件之前即提前退出程序。

-s, --spec

使用上游配置文件(例如 Python 里的 setup.py 等)信息来初始化软件包描述内容。

-v, --version

显示版本信息。

-waddon,…“, --withaddon,…

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

The addon values are listed all separated by “,”, e.g., “-w “python3,autoreconf””.

For Autotools based packages, autoreconf as addon to run “autoreconf -i -v -f” for every package building is default behavior of the dh(1) command.

For Autotools based packages, if they install Python (version 3) programs, setting python3 as addon to the debmake command argument is needed since this is non-obvious. But for setup.py based packages, setting python3 as addon to the debmake command argument is not needed since this is obvious and the debmake command automatically set it to the dh(1) command.

-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

在模板文件中输出教程注释行。

A.4. 示例

对比较正常的源码来说,您可以使用一行命令简单地构建一个自用的 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

For a typical Python (version 3) module in the package-version**.tar.gz** archive:

  • 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

A.5. 帮助软件包

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

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

A.6. 注意事项

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”的情况。当然,这个假设并非总是成立。

A.7. 除错

请使用 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”)

用法如下:

  1. $ DEBUG=pdfbmeclak debmake ...

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

A.8. 作者

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

A.9. 许可证

Expat 许可证

A.10. 参见

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

另见 dpkg-source(1), deb-control(5), debhelper(7), dh(1), dpkg-buildpackage(1), debuild(1), quilt(1), dpkg-depcheck(1), pdebuild(1), pbuilder(8), cowbuilder(8), gbp-buildpackage(1), gbp-pq(1) 和 git-pbuilder(1) 的手册页。