Chapter 8. 更多示例

有一句古老的拉丁谚语:“fabricando fit faber”(“熟能生巧”)。

强烈建议使用简单的包来练习和试验 Debian 打包的所有步骤。本章为您的练习提供了许多上游案例。

这也可以作为许多编程主题的介绍性示例。

  • 在 POSIX shell,Python3 和 C 中编程。
  • 使用图标图形创建桌面 GUI 程序启动器的方法。
  • 命令行界面 命令转换为 图形界面 命令。
  • 转化程序以使用 gettext 来为 POSIX shell、Python3 和 C 源码的程序进行 国际化和本地化
  • 构建系统概述:Makefile、Python distutils、Autotools 以及 CMake。

请注意,Debian 对以下事项非常注意:

  • 自由软件
  • 操作系统的稳定性与安全性
  • 通过以下方式以实现通用操作系统:

    • 上游源码的自由选择,
    • CPU架构的自由选择,以及
    • 用户界面语言的自由选择。

Chapter 4, 简单例子 中介绍的典型打包示例是本章节的先决条件。

在以下数小节中,有些细节被刻意模糊。请尝试阅读相关文件,并且尝试自行厘清它们。

[Tip]Tip

打包示例的最佳来源就是目前的 Debian 归档本身。请使用 “Debian 代码搜索” 服务来查找相关示例。

8.1. 挑选最好的模板

以下是一个从空目录由零开始构建简单的 Debian 软件包的示例。

这是一个很棒的平台,可以使您获得所有的模板文件,而不会使您正在处理的上游源码树变得一团糟。

让我们假设这个空目录为 debhello-0.1

  1. $ mkdir debhello-0.1
  2. $ tree
  3. .
  4. └── debhello-0.1
  5. 1 directory, 0 files

让我们通过指定 -x4 选项来生成最大数量的模板文件。

此外,让我们使用 “-p debhello -t -u 0.1 -r 1” 选项来制作缺失的上游源码包。

  1. $ debmake -t -p debhello -u 0.1 -r 1 -x4
  2. I: set parameters
  3. ...
  4. I: debmake -x "4" ...
  5. I: creating => debian/control
  6. I: creating => debian/copyright
  7. I: substituting => /usr/share/debmake/extra0/changelog
  8. ...
  9. I: creating => debian/license-examples/Expat
  10. I: substituting => /usr/share/debmake/extra4/BSD-3-Clause
  11. I: creating => debian/license-examples/BSD-3-Clause
  12. I: substituting => /usr/share/debmake/extra4/LGPL-3.0+
  13. I: creating => debian/license-examples/LGPL-3.0+
  14. I: $ wrap-and-sort

我们来检查一下自动产生的模板文件。

  1. $ cd ..
  2. $ tree
  3. .
  4. ├── debhello-0.1
  5. └── debian
  6. ├── README.Debian
  7. ├── changelog
  8. ├── clean
  9. ├── compat.ex
  10. ├── control
  11. ├── copyright
  12. ├── debhello.bug-control.ex
  13. ├── debhello.bug-presubj.ex
  14. ├── debhello.bug-script.ex
  15. ├── debhello.conffiles.ex
  16. ...
  17. └── watch
  18. ├── debhello-0.1.tar.gz
  19. └── debhello_0.1.orig.tar.gz -> debhello-0.1.tar.gz
  20. 5 directories, 51 files

现在,您可以复制 debhello-0.1/**debian/** 目录下所有生成的模板文件到您的软件包中。

[Tip]Tip

通过使用 -T 选项(教程模式)调用 debmake 命令,可以使生成的模板文件更加详细。

8.2. 无 Makefile(shell,命令行界面)

此处是一个从 POSIX shell 命令行界面程序创建简单的 Debian 软件包的示例,我们假设它没有使用任何构建系统。

让我们假设上游的源码包为 debhello-0.2.tar.gz

此类源码不具有自动化方法,所以必须手动安装文件。

  1. $ tar -xzmf debhello-0.2.tar.gz
  2. $ cd debhello-0.2
  3. $ sudo cp scripts/hello /bin/hello
  4. ...

让我们取得源码并制作 Debian 软件包。

下载 debhello-0.2.tar.gz.

  1. $ wget http://www.example.org/download/debhello-0.2.tar.gz
  2. ...
  3. $ tar -xzmf debhello-0.2.tar.gz
  4. $ tree
  5. .
  6. ├── debhello-0.2
  7. ├── LICENSE
  8. ├── data
  9. ├── hello.desktop
  10. └── hello.png
  11. ├── man
  12. └── hello.1
  13. └── scripts
  14. └── hello
  15. └── debhello-0.2.tar.gz
  16. 4 directories, 6 files

这里的 POSIX shell 脚本 hello 非常的简单。

**hello(v=0.2).**

  1. $ cat debhello-0.2/scripts/hello
  2. #!/bin/sh -e
  3. echo "Hello from the shell!"
  4. echo ""
  5. echo -n "Type Enter to exit this program: "
  6. read X

此处的 hello.desktop 支持 桌面项(Desktop Entry)规范

**hello.desktop(v=0.2).**

  1. $ cat debhello-0.2/data/hello.desktop
  2. [Desktop Entry]
  3. Name=Hello
  4. Name[fr]=Bonjour
  5. Comment=Greetings
  6. Comment[fr]=Salutations
  7. Type=Application
  8. Keywords=hello
  9. Exec=hello
  10. Terminal=true
  11. Icon=hello.png
  12. Categories=Utility;

此处的 hello.png 是图标的图像文件。

让我们使用 debmake 命令来打包。这里使用 -b’:sh’ 选项来指明生成的二进制包是一个 shell 脚本。

  1. $ cd debhello-0.2
  2. $ debmake -b':sh'
  3. I: set parameters
  4. I: sanity check of parameters
  5. I: pkg="debhello", ver="0.2", rev="1"
  6. I: *** start packaging in "debhello-0.2". ***
  7. I: provide debhello_0.2.orig.tar.gz for non-native Debian package
  8. I: pwd = "/path/to"
  9. I: $ ln -sf debhello-0.2.tar.gz debhello_0.2.orig.tar.gz
  10. I: pwd = "/path/to/debhello-0.2"
  11. I: parse binary package settings: :sh
  12. I: binary package=debhello Type=script / Arch=all M-A=foreign
  13. ...

让我们来检查一下自动产生的模板文件。

执行基本的 debmake 命令后的源码树。(v=0.2).

  1. $ cd ..
  2. $ tree
  3. .
  4. ├── debhello-0.2
  5. ├── LICENSE
  6. ├── data
  7. ├── hello.desktop
  8. └── hello.png
  9. ├── debian
  10. ├── README.Debian
  11. ├── changelog
  12. ├── control
  13. ├── copyright
  14. ├── patches
  15. └── series
  16. ├── rules
  17. ├── source
  18. ├── format
  19. └── local-options
  20. └── watch
  21. ├── man
  22. └── hello.1
  23. └── scripts
  24. └── hello
  25. ├── debhello-0.2.tar.gz
  26. └── debhello_0.2.orig.tar.gz -> debhello-0.2.tar.gz
  27. 7 directories, 16 files

**debian/rules(模板文件,v=0.2):.**

  1. $ cat debhello-0.2/debian/rules
  2. #!/usr/bin/make -f
  3. # You must remove unused comment lines for the released package.
  4. #export DH_VERBOSE = 1
  5. %:
  6. dh $@

这基本上是带有 dh 命令的标准 debian/rules 文件。因为这是个脚本软件包,所以这个 debian/rules 模板文件没有与构建标记(build flag)相关的内容。

**debian/control(模板文件,v=0.2):.**

  1. $ cat debhello-0.2/debian/control
  2. Source: debhello
  3. Section: unknown
  4. Priority: optional
  5. Maintainer: "Firstname Lastname" <email.address@example.org>
  6. Build-Depends: debhelper-compat (= 13)
  7. Standards-Version: 4.5.0
  8. Homepage: <insert the upstream URL, if relevant>
  9. Package: debhello
  10. Architecture: all
  11. Multi-Arch: foreign
  12. Depends: ${misc:Depends}
  13. Description: auto-generated package by debmake
  14. This Debian binary package was auto-generated by the
  15. debmake(1) command provided by the debmake package.

因为这是个 shell 脚本包,所以 debmake 命令设置了“Architecture: all”和“Multi-Arch: foreign”。此外,它还将所需的 substvar 参数设置为“Depends: ${misc:Depends}”。Chapter 5, 基本内容 对此进行了解释。

因为这个上游源码缺少上游的 Makefile,所以这个功能需要由维护者提供。这个上游源码仅包含脚本文件和数据文件,没有 C 的源码文件,因此 构建(build) 的过程可以被跳过,但是需要实现 安装(install) 的过程。对于这种情况,通过添加 debian/installdebian/manpages 文件可以很好地实现这一功能,且不会使 debian/rules 文件变得复杂。

作为维护者,我们要把这个 Debian 软件包做得更好。

**debian/rules(维护者版本,v=0.2):.**

  1. $ vim debhello-0.2/debian/rules
  2. ... hack, hack, hack, ...
  3. $ cat debhello-0.2/debian/rules
  4. #!/usr/bin/make -f
  5. export DH_VERBOSE = 1
  6. %:
  7. dh $@

**debian/control(维护者版本,v=0.2):.**

  1. $ vim debhello-0.2/debian/control
  2. ... hack, hack, hack, ...
  3. $ cat debhello-0.2/debian/control
  4. Source: debhello
  5. Section: devel
  6. Priority: optional
  7. Maintainer: Osamu Aoki <osamu@debian.org>
  8. Build-Depends: debhelper-compat (= 13)
  9. Standards-Version: 4.3.0
  10. Homepage: https://salsa.debian.org/debian/debmake-doc
  11. Package: debhello
  12. Architecture: all
  13. Multi-Arch: foreign
  14. Depends: ${misc:Depends}
  15. Description: example package in the debmake-doc package
  16. This is an example package to demonstrate Debian packaging using
  17. the debmake command.
  18. .
  19. The generated Debian package uses the dh command offered by the
  20. debhelper package and the dpkg source format `3.0 (quilt)'.
[Warning]Warning

如果您对 debian/control 模板文件中的“Section: unknown”部分不作修改的话,后续的 lintian 错误可能导致构建失败。

**debian/install(维护者版本,v=0.2):.**

  1. $ vim debhello-0.2/debian/install
  2. ... hack, hack, hack, ...
  3. $ cat debhello-0.2/debian/install
  4. data/hello.desktop usr/share/applications
  5. data/hello.png usr/share/pixmaps
  6. scripts/hello usr/bin

**debian/manpages(维护者版本,v=0.2):.**

  1. $ vim debhello-0.2/debian/manpages
  2. ... hack, hack, hack, ...
  3. $ cat debhello-0.2/debian/manpages
  4. man/hello.1

debian/ 目录下还有一些其它的模板文件。它们也需要进行更新。

**debian/ 目录下的模板文件。(v=0.2):.**

  1. $ tree debhello-0.2/debian
  2. debhello-0.2/debian
  3. ├── README.Debian
  4. ├── changelog
  5. ├── control
  6. ├── copyright
  7. ├── install
  8. ├── manpages
  9. ├── patches
  10. └── series
  11. ├── rules
  12. ├── source
  13. ├── format
  14. └── local-options
  15. └── watch
  16. 2 directories, 11 files

您可以在此源代码树中使用 debuild 命令(或其等效命令)创建非原生的 Debian 软件包。如下所示,该命令的输出非常详细,并且解释了它所做的事。

  1. $ cd debhello-0.2
  2. $ debuild
  3. dpkg-buildpackage -us -uc -ui -i -i
  4. ...
  5. fakeroot debian/rules clean
  6. dh clean
  7. ...
  8. debian/rules build
  9. dh build
  10. dh_update_autotools_config
  11. dh_autoreconf
  12. create-stamp debian/debhelper-build-stamp
  13. fakeroot debian/rules binary
  14. dh binary
  15. dh_testroot
  16. dh_prep
  17. rm -f -- debian/debhello.substvars
  18. rm -fr -- debian/.debhelper/generated/debhello/ debian/debhello/ debi...
  19. ...
  20. fakeroot debian/rules binary
  21. dh binary
  22. ...

现在我们来看看成果如何。

通过 debuild 生成的第 0.2 版的 debhello 文件:.

  1. $ cd ..
  2. $ tree -FL 1
  3. .
  4. ├── debhello-0.2/
  5. ├── debhello-0.2.tar.gz
  6. ├── debhello_0.2-1.debian.tar.xz
  7. ├── debhello_0.2-1.dsc
  8. ├── debhello_0.2-1_all.deb
  9. ├── debhello_0.2-1_amd64.build
  10. ├── debhello_0.2-1_amd64.buildinfo
  11. ├── debhello_0.2-1_amd64.changes
  12. └── debhello_0.2.orig.tar.gz -> debhello-0.2.tar.gz
  13. 1 directory, 8 files

您可以看见生成的全部文件。

  • debhello_0.2.orig.tar.gz 是指向上游源码包的符号链接。
  • debhello_0.2-1.debian.tar.xz 包含了维护者生成的内容。
  • debhello_0.2-1.dsc 是 Debian 源码包的元数据文件。
  • The debhello_0.2-1_all.deb 是 Debian 二进制软件包。
  • debhello_0.2-1_amd64.build 是 Debian 二进制软件包。
  • debhello_0.2-1_amd64.buildinfo 文件是由 dpkg-genbuildinfo(1) 自动生成的元文件。
  • debhello_0.2-1_amd64.changes 是 Debian 二进制软件包的元数据文件。

debhello_0.2-1.debian.tar.xz 包含了 Debian 对上游源代码的修改,具体如下所示。

压缩过的归档文件 debhello_0.2-1.debian.tar.xz 中的内容物:.

  1. $ tar -tzf debhello-0.2.tar.gz
  2. debhello-0.2/
  3. debhello-0.2/LICENSE
  4. debhello-0.2/data/
  5. debhello-0.2/data/hello.desktop
  6. debhello-0.2/data/hello.png
  7. debhello-0.2/man/
  8. debhello-0.2/man/hello.1
  9. debhello-0.2/scripts/
  10. debhello-0.2/scripts/hello
  11. $ tar --xz -tf debhello_0.2-1.debian.tar.xz
  12. debian/
  13. debian/README.Debian
  14. debian/changelog
  15. debian/control
  16. debian/copyright
  17. debian/install
  18. debian/manpages
  19. debian/patches/
  20. debian/patches/series
  21. debian/rules
  22. debian/source/
  23. debian/source/format
  24. debian/watch

debhello_0.2-1_amd64.deb 包含了将要安装至系统中的文件,如下所示。

**debhello_0.2-1_all.deb 二进制软件包中的内容:.**

  1. $ dpkg -c debhello_0.2-1_all.deb
  2. drwxr-xr-x root/root ... ./
  3. drwxr-xr-x root/root ... ./usr/
  4. drwxr-xr-x root/root ... ./usr/bin/
  5. -rwxr-xr-x root/root ... ./usr/bin/hello
  6. drwxr-xr-x root/root ... ./usr/share/
  7. drwxr-xr-x root/root ... ./usr/share/applications/
  8. -rw-r--r-- root/root ... ./usr/share/applications/hello.desktop
  9. drwxr-xr-x root/root ... ./usr/share/doc/
  10. drwxr-xr-x root/root ... ./usr/share/doc/debhello/
  11. -rw-r--r-- root/root ... ./usr/share/doc/debhello/README.Debian
  12. -rw-r--r-- root/root ... ./usr/share/doc/debhello/changelog.Debian.gz
  13. -rw-r--r-- root/root ... ./usr/share/doc/debhello/copyright
  14. drwxr-xr-x root/root ... ./usr/share/man/
  15. drwxr-xr-x root/root ... ./usr/share/man/man1/
  16. -rw-r--r-- root/root ... ./usr/share/man/man1/hello.1.gz
  17. drwxr-xr-x root/root ... ./usr/share/pixmaps/
  18. -rw-r--r-- root/root ... ./usr/share/pixmaps/hello.png

此处是生成的 debhello_0.2-1_all.deb 的依赖项列表。

**debhello_0.2-1_all.deb 的依赖项列表:.**

  1. $ dpkg -f debhello_0.2-1_all.deb pre-depends depends recommends conflicts br...

8.3. Makefile(shell,命令行界面)

下面是从 POSIX shell 命令行界面程序创建简单的 Debian 软件包的示例,我们假设它使用 Makefile 作为构建系统。

让我们假设上游的源码包为 debhello-1.0.tar.gz

这一类源代码设计可以用这样的方式安装成为非系统文件:

  1. $ tar -xzmf debhello-1.0.tar.gz
  2. $ cd debhello-1.0
  3. $ make install

Debian 的打包需要对“make install”流程进行改变,从而将文件安装至目标系统镜像所在位置,而非通常使用的 /usr/local 下的位置。

让我们取得源码并制作 Debian 软件包。

下载 debhello-1.0.tar.gz.

  1. $ wget http://www.example.org/download/debhello-1.0.tar.gz
  2. ...
  3. $ tar -xzmf debhello-1.0.tar.gz
  4. $ tree
  5. .
  6. ├── debhello-1.0
  7. ├── LICENSE
  8. ├── Makefile
  9. ├── data
  10. ├── hello.desktop
  11. └── hello.png
  12. ├── man
  13. └── hello.1
  14. └── scripts
  15. └── hello
  16. └── debhello-1.0.tar.gz
  17. 4 directories, 7 files

这里的 Makefile 正确使用 $(DESTDIR)$(prefix)。其他的所有文件都和 Section 8.2, “无 Makefile(shell,命令行界面)” 中的一样,并且大多数的打包工作也都一样。

**Makefile(v=1.0).**

  1. $ cat debhello-1.0/Makefile
  2. prefix = /usr/local
  3. all:
  4. : # do nothing
  5. install:
  6. install -D scripts/hello \
  7. $(DESTDIR)$(prefix)/bin/hello
  8. install -m 644 -D data/hello.desktop \
  9. $(DESTDIR)$(prefix)/share/applications/hello.desktop
  10. install -m 644 -D data/hello.png \
  11. $(DESTDIR)$(prefix)/share/pixmaps/hello.png
  12. install -m 644 -D man/hello.1 \
  13. $(DESTDIR)$(prefix)/share/man/man1/hello.1
  14. clean:
  15. : # do nothing
  16. distclean: clean
  17. uninstall:
  18. -rm -f $(DESTDIR)$(prefix)/bin/hello
  19. -rm -f $(DESTDIR)$(prefix)/share/applications/hello.desktop
  20. -rm -f $(DESTDIR)$(prefix)/share/pixmaps/hello.png
  21. -rm -f $(DESTDIR)$(prefix)/share/man/man1/hello.1
  22. .PHONY: all install clean distclean uninstall

让我们使用 debmake 命令来打包。这里使用 -b’:sh’ 选项来指明生成的二进制包是一个 shell 脚本。

  1. $ cd debhello-1.0
  2. $ debmake -b':sh'
  3. I: set parameters
  4. I: sanity check of parameters
  5. I: pkg="debhello", ver="1.0", rev="1"
  6. I: *** start packaging in "debhello-1.0". ***
  7. I: provide debhello_1.0.orig.tar.gz for non-native Debian package
  8. I: pwd = "/path/to"
  9. I: $ ln -sf debhello-1.0.tar.gz debhello_1.0.orig.tar.gz
  10. I: pwd = "/path/to/debhello-1.0"
  11. I: parse binary package settings: :sh
  12. I: binary package=debhello Type=script / Arch=all M-A=foreign
  13. ...

让我们来检查一下自动产生的模板文件。

**debian/rules(模板文件,v=1.0):.**

  1. $ cat debhello-1.0/debian/rules
  2. #!/usr/bin/make -f
  3. # You must remove unused comment lines for the released package.
  4. #export DH_VERBOSE = 1
  5. %:
  6. dh $@
  7. #override_dh_auto_install:
  8. # dh_auto_install -- prefix=/usr
  9. #override_dh_install:
  10. # dh_install --list-missing -X.pyc -X.pyo

作为维护者,我们要把这个 Debian 软件包做得更好。

**debian/rules(维护者版本,v=1.0):.**

  1. $ vim debhello-1.0/debian/rules
  2. ... hack, hack, hack, ...
  3. $ cat debhello-1.0/debian/rules
  4. #!/usr/bin/make -f
  5. export DH_VERBOSE = 1
  6. %:
  7. dh $@
  8. override_dh_auto_install:
  9. dh_auto_install -- prefix=/usr

因为上游源码含有正确的上游 Makefile 文件,所以没有必要再去创建 debian/installdebian/manpages 文件。

debian/control 文件和 Section 8.2, “无 Makefile(shell,命令行界面)” 中的完全一致。

debian/ 目录下还有一些其它的模板文件。它们也需要进行更新。

**debian/ 目录下的模板文件。(v=1.0):.**

  1. $ tree debhello-1.0/debian
  2. debhello-1.0/debian
  3. ├── README.Debian
  4. ├── changelog
  5. ├── control
  6. ├── copyright
  7. ├── patches
  8. └── series
  9. ├── rules
  10. ├── source
  11. ├── format
  12. └── local-options
  13. └── watch
  14. 2 directories, 9 files

其余的打包操作基本上和 Section 8.2, “无 Makefile(shell,命令行界面)” 中的相同。

8.4. setup.py(Python3,命令行界面)

此处是一个从 Python3 命令行界面程序创建简单的 Debian 软件包的示例,我们假设程序使用 setup.py 作为它的构建系统。

让我们假设上游的源码包为 debhello-1.1.tar.gz

这一类源代码设计可以用这样的方式安装成为非系统文件:

  1. $ tar -xzmf debhello-1.1.tar.gz
  2. $ cd debhello-1.1
  3. $ python3 setup.py install

Debian 打包要求将最后一行更改为 “python3 setup.py install —install-layout=deb” 以将文件安装到目标系统镜像所在位置。使用 dh 命令进行 Debian 打包时会自动解决此问题。

让我们取得源码并制作 Debian 软件包。

下载 debhello-1.1.tar.gz.

  1. $ wget http://www.example.org/download/debhello-1.1.tar.gz
  2. ...
  3. $ tar -xzmf debhello-1.1.tar.gz
  4. $ tree
  5. .
  6. ├── debhello-1.1
  7. ├── LICENSE
  8. ├── MANIFEST.in
  9. ├── PKG-INFO
  10. ├── hello_py
  11. └── __init__.py
  12. ├── scripts
  13. └── hello
  14. └── setup.py
  15. └── debhello-1.1.tar.gz
  16. 3 directories, 7 files

此处的 hello 脚本和它所关联的 hello_py 模块如下所示。

**hello(v=1.1).**

  1. $ cat debhello-1.1/scripts/hello
  2. #!/usr/bin/python3
  3. import hello_py
  4. if __name__ == '__main__':
  5. hello_py.main()

**hello_py/__init__.py(v=1.1).**

  1. $ cat debhello-1.1/hello_py/__init__.py
  2. #!/usr/bin/python3
  3. def main():
  4. print('Hello Python3!')
  5. input("Press Enter to continue...")
  6. return
  7. if __name__ == '__main__':
  8. main()

这些是使用带有 setup.pyMANIFEST.in 文件的 Python distutils 来打包的。

**setup.py(v=1.1).**

  1. $ cat debhello-1.1/setup.py
  2. #!/usr/bin/python3
  3. # vi:se ts=4 sts=4 et ai:
  4. from distutils.core import setup
  5. setup(name='debhello',
  6. version='4.0',
  7. description='Hello Python',
  8. long_description='Hello Python program.',
  9. author='Osamu Aoki',
  10. author_email='osamu@debian.org',
  11. url='http://people.debian.org/~osamu/',
  12. packages=['hello_py'],
  13. package_dir={'hello_py': 'hello_py'},
  14. scripts=['scripts/hello'],
  15. classifiers = ['Development Status :: 3 - Alpha',
  16. 'Environment :: Console',
  17. 'Intended Audience :: Developers',
  18. 'License :: OSI Approved :: MIT License',
  19. 'Natural Language :: English',
  20. 'Operating System :: POSIX :: Linux',
  21. 'Programming Language :: Python :: 3',
  22. 'Topic :: Utilities',
  23. ],
  24. platforms = 'POSIX',
  25. license = 'MIT License'
  26. )

**MANIFEST.in(v=1.1).**

  1. $ cat debhello-1.1/MANIFEST.in
  2. include MANIFEST.in
  3. include LICENSE
[Tip]Tip

许多现代的 Python 软件包使用 setuptools 来分发。因为 setuptools 是 disutils 的增强替代品,因此该示例对它们也很有用。

让我们使用 debmake 命令来打包。这里使用 -b’:py3’ 选项来指明生成的二进制包包含 Python3 脚本和模块文件。

  1. $ cd debhello-1.1
  2. $ debmake -b':py3'
  3. I: set parameters
  4. I: sanity check of parameters
  5. I: pkg="debhello", ver="1.1", rev="1"
  6. I: *** start packaging in "debhello-1.1". ***
  7. I: provide debhello_1.1.orig.tar.gz for non-native Debian package
  8. I: pwd = "/path/to"
  9. I: $ ln -sf debhello-1.1.tar.gz debhello_1.1.orig.tar.gz
  10. I: pwd = "/path/to/debhello-1.1"
  11. I: parse binary package settings: :py3
  12. I: binary package=debhello Type=python3 / Arch=all M-A=foreign
  13. ...

让我们来检查一下自动产生的模板文件。

**debian/rules(模板文件,v=1.1):.**

  1. $ cat debhello-1.1/debian/rules
  2. #!/usr/bin/make -f
  3. # You must remove unused comment lines for the released package.
  4. #export DH_VERBOSE = 1
  5. %:
  6. dh $@ --with python3 --buildsystem=pybuild

这基本上是带有 dh 命令的标准 debian/rules 文件。

使用“--with python3”选项会调用 dh_python3 来计算 Python 依赖项、将维护者脚本添加到字节码文件等。参见 dh_python3(1)。

使用“--buildsystem=pybuild”选项会为要求的 Python 版本调用各种构建系统,以便构建模块和扩展。参见 pybuild(1)。

**debian/control(模板文件,v=1.1):.**

  1. $ cat debhello-1.1/debian/control
  2. Source: debhello
  3. Section: unknown
  4. Priority: optional
  5. Maintainer: "Firstname Lastname" <email.address@example.org>
  6. Build-Depends: debhelper-compat (= 13), dh-python, python3-all
  7. Standards-Version: 4.5.0
  8. Homepage: <insert the upstream URL, if relevant>
  9. X-Python3-Version: >= 3.2
  10. Package: debhello
  11. Architecture: all
  12. Multi-Arch: foreign
  13. Depends: ${misc:Depends}, ${python3:Depends}
  14. Description: auto-generated package by debmake
  15. This Debian binary package was auto-generated by the
  16. debmake(1) command provided by the debmake package.

因为这是 Python3 软件包,debmake 命令会设置“Architecture: all”和“Multi-Arch: foreign”。此外,它还将所需的 substvar 参数设置为“Depends: ${python3:Depends}, ${misc:Depends}”。Chapter 5, 基本内容 对这些做出了解释。

作为维护者,我们要把这个 Debian 软件包做得更好。

**debian/rules(维护者版本,v=1.1):.**

  1. $ vim debhello-1.1/debian/rules
  2. ... hack, hack, hack, ...
  3. $ cat debhello-1.1/debian/rules
  4. #!/usr/bin/make -f
  5. export DH_VERBOSE = 1
  6. %:
  7. dh $@ --with python3 --buildsystem=pybuild

**debian/control(维护者版本,v=1.1):.**

  1. $ vim debhello-1.1/debian/control
  2. ... hack, hack, hack, ...
  3. $ cat debhello-1.1/debian/control
  4. Source: debhello
  5. Section: devel
  6. Priority: optional
  7. Maintainer: Osamu Aoki <osamu@debian.org>
  8. Build-Depends: debhelper-compat (= 13), dh-python, python3-all
  9. Standards-Version: 4.3.0
  10. Homepage: https://salsa.debian.org/debian/debmake-doc
  11. X-Python3-Version: >= 3.2
  12. Package: debhello
  13. Architecture: all
  14. Multi-Arch: foreign
  15. Depends: ${misc:Depends}, ${python3:Depends}
  16. Description: example package in the debmake-doc package
  17. This is an example package to demonstrate Debian packaging using
  18. the debmake command.
  19. .
  20. The generated Debian package uses the dh command offered by the
  21. debhelper package and the dpkg source format `3.0 (quilt)'.

hello 命令没有附带上游提供的手册页。让我们这些维护者给它添上。

**debian/manpages 等。(维护者版本,v=1.1):.**

  1. $ vim debhello-1.1/debian/hello.1
  2. ... hack, hack, hack, ...
  3. $ vim debhello-1.1/debian/manpages
  4. ... hack, hack, hack, ...
  5. $ cat debhello-1.1/debian/manpages
  6. debian/hello.1

debian/ 目录下还有一些其它的模板文件。它们也需要进行更新。

其余的打包工作与 Section 8.3, “Makefile(shell,命令行界面)” 中的几乎一致。

**debian/ 目录下的模板文件。(v=1.1):.**

  1. $ tree debhello-1.1/debian
  2. debhello-1.1/debian
  3. ├── README.Debian
  4. ├── changelog
  5. ├── control
  6. ├── copyright
  7. ├── hello.1
  8. ├── manpages
  9. ├── patches
  10. └── series
  11. ├── rules
  12. ├── source
  13. ├── format
  14. └── local-options
  15. └── watch
  16. 2 directories, 11 files

此处是生成的 debhello_1.1-1_all.deb 包的依赖项列表。

**debhello_1.1-1_all.deb 的依赖项列表:.**

  1. $ dpkg -f debhello_1.1-1_all.deb pre-depends depends recommends conflicts br...
  2. Depends: python3:any (>= 3.2~)

8.5. Makefile(shell,图形界面)

此处是一个从 POSIX shell 图形界面程序构建简单的 Debian 软件包的示例,我们假设程序使用 Makefile 作为构建系统。

上游是基于 Section 8.3, “Makefile(shell,命令行界面)” 中的源代码,并带有增强的图形界面支持。

让我们假设上游的源码包为 debhello-1.2.tar.gz

让我们取得源码并制作 Debian 软件包。

下载 debhello-1.2.tar.gz.

  1. $ wget http://www.example.org/download/debhello-1.2.tar.gz
  2. ...
  3. $ tar -xzmf debhello-1.2.tar.gz
  4. $ tree
  5. .
  6. ├── debhello-1.2
  7. ├── LICENSE
  8. ├── Makefile
  9. ├── data
  10. ├── hello.desktop
  11. └── hello.png
  12. ├── man
  13. └── hello.1
  14. └── scripts
  15. └── hello
  16. └── debhello-1.2.tar.gz
  17. 4 directories, 7 files

此处的 hello 已经被重写以便使用 zenity 命令来使其成为 GTK+ 图形界面程序。

**hello(v=1.2).**

  1. $ cat debhello-1.2/scripts/hello
  2. #!/bin/sh -e
  3. zenity --info --title "hello" --text "Hello from the shell!"

这里,作为图形界面程序,桌面文件被更新为 Terminal=false

**hello.desktop(v=1.2).**

  1. $ cat debhello-1.2/data/hello.desktop
  2. [Desktop Entry]
  3. Name=Hello
  4. Name[fr]=Bonjour
  5. Comment=Greetings
  6. Comment[fr]=Salutations
  7. Type=Application
  8. Keywords=hello
  9. Exec=hello
  10. Terminal=false
  11. Icon=hello.png
  12. Categories=Utility;

其余的所有文件都与 Section 8.3, “Makefile(shell,命令行界面)” 中的一致。

让我们使用 debmake 命令来打包。这里使用 -b’:sh’ 选项来指明生成的二进制包是一个 shell 脚本。

  1. $ cd debhello-1.2
  2. $ debmake -b':sh'
  3. I: set parameters
  4. I: sanity check of parameters
  5. I: pkg="debhello", ver="1.2", rev="1"
  6. I: *** start packaging in "debhello-1.2". ***
  7. I: provide debhello_1.2.orig.tar.gz for non-native Debian package
  8. I: pwd = "/path/to"
  9. I: $ ln -sf debhello-1.2.tar.gz debhello_1.2.orig.tar.gz
  10. I: pwd = "/path/to/debhello-1.2"
  11. I: parse binary package settings: :sh
  12. I: binary package=debhello Type=script / Arch=all M-A=foreign
  13. ...

让我们来检查一下自动产生的模板文件。

**debian/control(模板文件,v=1.2):.**

  1. $ cat debhello-1.2/debian/control
  2. Source: debhello
  3. Section: unknown
  4. Priority: optional
  5. Maintainer: "Firstname Lastname" <email.address@example.org>
  6. Build-Depends: debhelper-compat (= 13)
  7. Standards-Version: 4.5.0
  8. Homepage: <insert the upstream URL, if relevant>
  9. Package: debhello
  10. Architecture: all
  11. Multi-Arch: foreign
  12. Depends: ${misc:Depends}
  13. Description: auto-generated package by debmake
  14. This Debian binary package was auto-generated by the
  15. debmake(1) command provided by the debmake package.

作为维护者,我们要把这个 Debian 软件包做得更好。

**debian/control(维护者版本,v=1.2):.**

  1. $ vim debhello-1.2/debian/control
  2. ... hack, hack, hack, ...
  3. $ cat debhello-1.2/debian/control
  4. Source: debhello
  5. Section: devel
  6. Priority: optional
  7. Maintainer: Osamu Aoki <osamu@debian.org>
  8. Build-Depends: debhelper-compat (= 13)
  9. Standards-Version: 4.3.0
  10. Homepage: https://salsa.debian.org/debian/debmake-doc
  11. Package: debhello
  12. Architecture: all
  13. Multi-Arch: foreign
  14. Depends: zenity, ${misc:Depends}
  15. Description: example package in the debmake-doc package
  16. This is an example package to demonstrate Debian packaging using
  17. the debmake command.
  18. .
  19. The generated Debian package uses the dh command offered by the
  20. debhelper package and the dpkg source format `3.0 (quilt)'.

请注意,这里需要手动添加 zenity 依赖。

debian/rules 文件与 Section 8.3, “Makefile(shell,命令行界面)” 中的完全一致。

debian/ 目录下还有一些其它的模板文件。它们也需要进行更新。

**debian/ 目录下的模板文件。(v=1.2):.**

  1. $ tree debhello-1.2/debian
  2. debhello-1.2/debian
  3. ├── README.Debian
  4. ├── changelog
  5. ├── control
  6. ├── copyright
  7. ├── patches
  8. └── series
  9. ├── rules
  10. ├── source
  11. ├── format
  12. └── local-options
  13. └── watch
  14. 2 directories, 9 files

其余的打包工作与 Section 8.3, “Makefile(shell,命令行界面)” 中的几乎一致。

此处是 debhello_1.2-1_all.deb 的依赖项列表。

**debhello_1.2-1_all.deb 的依赖项列表:.**

  1. $ dpkg -f debhello_1.2-1_all.deb pre-depends depends recommends conflicts br...
  2. Depends: zenity

8.6. setup.py(Python3,图形界面)

此处是一个从 Python3 图形界面程序构建简单的 Debian 软件包的示例,我们假设程序使用 setup.py 作为自身的构建系统。

上游是基于 Section 8.4, “setup.py(Python3,命令行界面)” 中的源代码,并带有增强的图形界面、桌面图标、手册页。

让我们假设上游源码包为 debhello-1.3.tar.gz

让我们取得源码并制作 Debian 软件包。

下载 debhello-1.3.tar.gz.

  1. $ wget http://www.example.org/download/debhello-1.3.tar.gz
  2. ...
  3. $ tar -xzmf debhello-1.3.tar.gz
  4. $ tree
  5. .
  6. ├── debhello-1.3
  7. ├── LICENSE
  8. ├── MANIFEST.in
  9. ├── PKG-INFO
  10. ├── data
  11. ├── hello.desktop
  12. └── hello.png
  13. ├── hello_py
  14. └── __init__.py
  15. ├── man
  16. └── hello.1
  17. ├── scripts
  18. └── hello
  19. └── setup.py
  20. └── debhello-1.3.tar.gz
  21. 5 directories, 10 files

以下是上游源码。

**hello(v=1.3).**

  1. $ cat debhello-1.3/scripts/hello
  2. #!/usr/bin/python3
  3. import hello_py
  4. if __name__ == '__main__':
  5. hello_py.main()

**hello_py/__init__.py(v=1.3).**

  1. $ cat debhello-1.3/hello_py/__init__.py
  2. #!/usr/bin/python3
  3. from gi.repository import Gtk
  4. class TopWindow(Gtk.Window):
  5. def __init__(self):
  6. Gtk.Window.__init__(self)
  7. self.title = "Hello World!"
  8. self.counter = 0
  9. self.border_width = 10
  10. self.set_default_size(400, 100)
  11. self.set_position(Gtk.WindowPosition.CENTER)
  12. self.button = Gtk.Button(label="Click me!")
  13. self.button.connect("clicked", self.on_button_clicked)
  14. self.add(self.button)
  15. self.connect("delete-event", self.on_window_destroy)
  16. def on_window_destroy(self, *args):
  17. Gtk.main_quit(*args)
  18. def on_button_clicked(self, widget):
  19. self.counter += 1
  20. widget.set_label("Hello, World!\nClick count = %i" % self.counter)
  21. def main():
  22. window = TopWindow()
  23. window.show_all()
  24. Gtk.main()
  25. if __name__ == '__main__':
  26. main()

**setup.py(v=1.3).**

  1. $ cat debhello-1.3/setup.py
  2. #!/usr/bin/python3
  3. # vi:se ts=4 sts=4 et ai:
  4. from distutils.core import setup
  5. setup(name='debhello',
  6. version='4.1',
  7. description='Hello Python',
  8. long_description='Hello Python program.',
  9. author='Osamu Aoki',
  10. author_email='osamu@debian.org',
  11. url='http://people.debian.org/~osamu/',
  12. packages=['hello_py'],
  13. package_dir={'hello_py': 'hello_py'},
  14. scripts=['scripts/hello'],
  15. data_files=[
  16. ('share/applications', ['data/hello.desktop']),
  17. ('share/pixmaps', ['data/hello.png']),
  18. ('share/man/man1', ['man/hello.1']),
  19. ],
  20. classifiers = ['Development Status :: 3 - Alpha',
  21. 'Environment :: Console',
  22. 'Intended Audience :: Developers',
  23. 'License :: OSI Approved :: MIT License',
  24. 'Natural Language :: English',
  25. 'Operating System :: POSIX :: Linux',
  26. 'Programming Language :: Python :: 3',
  27. 'Topic :: Utilities',
  28. ],
  29. platforms = 'POSIX',
  30. license = 'MIT License'
  31. )

**MANIFEST.in(v=1.3).**

  1. $ cat debhello-1.3/MANIFEST.in
  2. include MANIFEST.in
  3. include LICENSE
  4. include data/hello.deskto
  5. include data/hello.png
  6. include man/hello.1

让我们使用 debmake 命令来打包。这里使用 -b’:py3’ 选项来指明生成的二进制包包含 Python3 脚本和模块文件。

  1. $ cd debhello-1.3
  2. $ debmake -b':py3'
  3. I: set parameters
  4. I: sanity check of parameters
  5. I: pkg="debhello", ver="1.3", rev="1"
  6. I: *** start packaging in "debhello-1.3". ***
  7. I: provide debhello_1.3.orig.tar.gz for non-native Debian package
  8. I: pwd = "/path/to"
  9. I: $ ln -sf debhello-1.3.tar.gz debhello_1.3.orig.tar.gz
  10. I: pwd = "/path/to/debhello-1.3"
  11. I: parse binary package settings: :py3
  12. I: binary package=debhello Type=python3 / Arch=all M-A=foreign
  13. ...

其余的步骤与 Section 8.4, “setup.py(Python3,命令行界面)” 中的基本一致。

作为维护者,我们要把这个 Debian 软件包做得更好。

**debian/rules(维护者版本,v=1.3):.**

  1. $ vim debhello-1.3/debian/rules
  2. ... hack, hack, hack, ...
  3. $ cat debhello-1.3/debian/rules
  4. #!/usr/bin/make -f
  5. export DH_VERBOSE = 1
  6. %:
  7. dh $@ --with python3 --buildsystem=pybuild

**debian/control(维护者版本,v=1.3):.**

  1. $ vim debhello-1.3/debian/control
  2. ... hack, hack, hack, ...
  3. $ cat debhello-1.3/debian/control
  4. Source: debhello
  5. Section: devel
  6. Priority: optional
  7. Maintainer: Osamu Aoki <osamu@debian.org>
  8. Build-Depends: debhelper-compat (= 13), dh-python, python3-all
  9. Standards-Version: 4.3.0
  10. Homepage: https://salsa.debian.org/debian/debmake-doc
  11. X-Python3-Version: >= 3.2
  12. Package: debhello
  13. Architecture: all
  14. Multi-Arch: foreign
  15. Depends: gir1.2-gtk-3.0, python3-gi, ${misc:Depends}, ${python3:Depends}
  16. Description: example package in the debmake-doc package
  17. This is an example package to demonstrate Debian packaging using
  18. the debmake command.
  19. .
  20. The generated Debian package uses the dh command offered by the
  21. debhelper package and the dpkg source format `3.0 (quilt)'.

请注意,此处需要手动添加 python3-gigir1.2-gtk-3.0 依赖。

因为上游源码已经自带手册页,并且其余的文件在 setup.py 文件中都有对应条目,就没有必要再去创建 Section 8.4, “setup.py(Python3,命令行界面)” 中所要求的 debian/installdebian/manpages 文件。

其余的打包工作与 Section 8.4, “setup.py(Python3,命令行界面)” 中的几乎完全一致。

此处是 debhello_1.3-1_all.deb 的依赖项列表。

**debhello_1.3-1_all.deb 的依赖项列表:.**

  1. $ dpkg -f debhello_1.3-1_all.deb pre-depends depends recommends conflicts br...
  2. Depends: gir1.2-gtk-3.0, python3-gi, python3:any (>= 3.2~)

8.7. Makefile(单个二进制软件包)

这里给出了从简单的 C 语言源代码创建简单的 Debian 软件包的例子,并假设上游使用了 Makefile 作为构建系统。

此处的上游源代码是 Chapter 4, 简单例子 中的源代码的增强版本。它带有手册页、桌面文件和桌面图标。并且为了更加贴合实际,它还有一个外部库文件 libm

让我们假设上游源码包为 debhello-1.4.tar.gz

这一类源代码设计可以用这样的方式安装成为非系统文件:

  1. $ tar -xzmf debhello-1.4.tar.gz
  2. $ cd debhello-1.4
  3. $ make
  4. $ make install

Debian 的打包需要对“make install”流程进行改变,从而将文件安装至系统镜像所在位置,而非通常使用的 /usr/local 下的位置。

让我们取得源码并制作 Debian 软件包。

下载 debhello-1.4.tar.gz.

  1. $ wget http://www.example.org/download/debhello-1.4.tar.gz
  2. ...
  3. $ tar -xzmf debhello-1.4.tar.gz
  4. $ tree
  5. .
  6. ├── debhello-1.4
  7. ├── LICENSE
  8. ├── Makefile
  9. ├── data
  10. ├── hello.desktop
  11. └── hello.png
  12. ├── man
  13. └── hello.1
  14. └── src
  15. ├── config.h
  16. └── hello.c
  17. └── debhello-1.4.tar.gz
  18. 4 directories, 8 files

此处的源码如下所示。

**src/hello.c(v=1.4):.**

  1. $ cat debhello-1.4/src/hello.c
  2. #include "config.h"
  3. #include <math.h>
  4. #include <stdio.h>
  5. int
  6. main()
  7. {
  8. printf("Hello, I am " PACKAGE_AUTHOR "!\n");
  9. printf("4.0 * atan(1.0) = %10f8\n", 4.0*atan(1.0));
  10. return 0;
  11. }

**src/config.h(v=1.4):.**

  1. $ cat debhello-1.4/src/config.h
  2. #define PACKAGE_AUTHOR "Osamu Aoki"

**Makefile(v=1.4):.**

  1. $ cat debhello-1.4/Makefile
  2. prefix = /usr/local
  3. all: src/hello
  4. src/hello: src/hello.c
  5. $(CC) $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) -o $@ $^ -lm
  6. install: src/hello
  7. install -D src/hello \
  8. $(DESTDIR)$(prefix)/bin/hello
  9. install -m 644 -D data/hello.desktop \
  10. $(DESTDIR)$(prefix)/share/applications/hello.desktop
  11. install -m 644 -D data/hello.png \
  12. $(DESTDIR)$(prefix)/share/pixmaps/hello.png
  13. install -m 644 -D man/hello.1 \
  14. $(DESTDIR)$(prefix)/share/man/man1/hello.1
  15. clean:
  16. -rm -f src/hello
  17. distclean: clean
  18. uninstall:
  19. -rm -f $(DESTDIR)$(prefix)/bin/hello
  20. -rm -f $(DESTDIR)$(prefix)/share/applications/hello.desktop
  21. -rm -f $(DESTDIR)$(prefix)/share/pixmaps/hello.png
  22. -rm -f $(DESTDIR)$(prefix)/share/man/man1/hello.1
  23. .PHONY: all install clean distclean uninstall

请注意,此 Makefile 含有正确的手册页、桌面文件、桌面图标的 install 对象。

让我们使用 debmake 命令打包。

  1. $ cd debhello-1.4
  2. $ debmake
  3. I: set parameters
  4. I: sanity check of parameters
  5. I: pkg="debhello", ver="1.4", rev="1"
  6. I: *** start packaging in "debhello-1.4". ***
  7. I: provide debhello_1.4.orig.tar.gz for non-native Debian package
  8. I: pwd = "/path/to"
  9. I: $ ln -sf debhello-1.4.tar.gz debhello_1.4.orig.tar.gz
  10. I: pwd = "/path/to/debhello-1.4"
  11. I: parse binary package settings:
  12. I: binary package=debhello Type=bin / Arch=any M-A=foreign
  13. ...

其余的工作与 Section 4.5, “第二步:使用 debmake 产生模板文件” 中的几乎一致。

Section 4.6, “第三步:编辑模板文件” 中所写的一样,让我们这些维护者来把这个 Debian 软件包做的更好。

如果环境变量 DEB_BUILD_MAINT_OPTIONS 没有在 debian/rules 文件中进行导出,lintian 会在链接 libm 时抛出警告:“W: debhello: hardening-no-relro usr/bin/hello”。

debian/control 文件与 Section 4.6, “第三步:编辑模板文件” 中的完全一致,因为 libm 库是 libc6 库的一部分,所以它总是可获得的(优先级:必需 / Priority: required)。

debian/ 目录下还有一些其它的模板文件。它们也需要进行更新。

**debian/ 目录下的模板文件。(v=1.4):.**

  1. $ tree debhello-1.4/debian
  2. debhello-1.4/debian
  3. ├── README.Debian
  4. ├── changelog
  5. ├── control
  6. ├── copyright
  7. ├── patches
  8. └── series
  9. ├── rules
  10. ├── source
  11. ├── format
  12. └── local-options
  13. └── watch
  14. 2 directories, 9 files

其余的打包步骤与 Section 4.7, “第四步:使用 debuild 构建软件包” 中的基本一致。

此处是生成的二进制包的依赖项列表。

生成的二进制包的依赖项列表(v=1.4):.

  1. $ dpkg -f debhello-dbgsym_1.4-1_amd64.deb pre-depends depends recommends con...
  2. Depends: debhello (= 1.4-1)
  3. $ dpkg -f debhello_1.4-1_amd64.deb pre-depends depends recommends conflicts ...
  4. Depends: libc6 (>= 2.3.4)

8.8. Makefile.in + configure(单个二进制软件包)

这里给出了从简单的 C 语言源代码创建简单的 Debian 软件包的例子,并假设上游使用了 Makefile.inconfigure 作为构建系统。

此处的源码示例是 Section 8.7, “Makefile(单个二进制软件包)” 中的源代码的增强版本。它也有一个外部链接库 libm,并且它的源代码可以使用 configure 脚本进行配置,然后生成相应的 Makefilesrc/config.h 文件。

让我们假设上游源码包为 debhello-1.5.tar.gz

此类型的源码旨在作为非系统文件安装,例如:

  1. $ tar -xzmf debhello-1.5.tar.gz
  2. $ cd debhello-1.5
  3. $ ./configure --with-math
  4. $ make
  5. $ make install

让我们取得源码并制作 Debian 软件包。

下载 debhello-1.5.tar.gz.

  1. $ wget http://www.example.org/download/debhello-1.5.tar.gz
  2. ...
  3. $ tar -xzmf debhello-1.5.tar.gz
  4. $ tree
  5. .
  6. ├── debhello-1.5
  7. ├── LICENSE
  8. ├── Makefile.in
  9. ├── configure
  10. ├── data
  11. ├── hello.desktop
  12. └── hello.png
  13. ├── man
  14. └── hello.1
  15. └── src
  16. └── hello.c
  17. └── debhello-1.5.tar.gz
  18. 4 directories, 8 files

此处的源码如下所示。

**src/hello.c(v=1.5):.**

  1. $ cat debhello-1.5/src/hello.c
  2. #include "config.h"
  3. #ifdef WITH_MATH
  4. # include <math.h>
  5. #endif
  6. #include <stdio.h>
  7. int
  8. main()
  9. {
  10. printf("Hello, I am " PACKAGE_AUTHOR "!\n");
  11. #ifdef WITH_MATH
  12. printf("4.0 * atan(1.0) = %10f8\n", 4.0*atan(1.0));
  13. #else
  14. printf("I can't do MATH!\n");
  15. #endif
  16. return 0;
  17. }

**Makefile.in(v=1.5):.**

  1. $ cat debhello-1.5/Makefile.in
  2. prefix = @prefix@
  3. all: src/hello
  4. src/hello: src/hello.c
  5. $(CC) @VERBOSE@ \
  6. $(CPPFLAGS) \
  7. $(CFLAGS) \
  8. $(LDFLAGS) \
  9. -o $@ $^ \
  10. @LINKLIB@
  11. install: src/hello
  12. install -D src/hello \
  13. $(DESTDIR)$(prefix)/bin/hello
  14. install -m 644 -D data/hello.desktop \
  15. $(DESTDIR)$(prefix)/share/applications/hello.desktop
  16. install -m 644 -D data/hello.png \
  17. $(DESTDIR)$(prefix)/share/pixmaps/hello.png
  18. install -m 644 -D man/hello.1 \
  19. $(DESTDIR)$(prefix)/share/man/man1/hello.1
  20. clean:
  21. -rm -f src/hello
  22. distclean: clean
  23. uninstall:
  24. -rm -f $(DESTDIR)$(prefix)/bin/hello
  25. -rm -f $(DESTDIR)$(prefix)/share/applications/hello.desktop
  26. -rm -f $(DESTDIR)$(prefix)/share/pixmaps/hello.png
  27. -rm -f $(DESTDIR)$(prefix)/share/man/man1/hello.1
  28. .PHONY: all install clean distclean uninstall

**configure(v=1.5):.**

  1. $ cat debhello-1.5/configure
  2. #!/bin/sh -e
  3. # default values
  4. PREFIX="/usr/local"
  5. VERBOSE=""
  6. WITH_MATH="0"
  7. LINKLIB=""
  8. PACKAGE_AUTHOR="John Doe"
  9. # parse arguments
  10. while [ "${1}" != "" ]; do
  11. VAR="${1%=*}" # Drop suffix =*
  12. VAL="${1#*=}" # Drop prefix *=
  13. case "${VAR}" in
  14. --prefix)
  15. PREFIX="${VAL}"
  16. ;;
  17. --verbose|-v)
  18. VERBOSE="-v"
  19. ;;
  20. --with-math)
  21. WITH_MATH="1"
  22. LINKLIB="-lm"
  23. ;;
  24. --author)
  25. PACKAGE_AUTHOR="${VAL}"
  26. ;;
  27. *)
  28. echo "W: Unknown argument: ${1}"
  29. esac
  30. shift
  31. done
  32. # setup configured Makefile and src/config.h
  33. sed -e "s,@prefix@,${PREFIX}," \
  34. -e "s,@VERBOSE@,${VERBOSE}," \
  35. -e "s,@LINKLIB@,${LINKLIB}," \
  36. <Makefile.in >Makefile
  37. if [ "${WITH_MATH}" = 1 ]; then
  38. echo "#define WITH_MATH" >src/config.h
  39. else
  40. echo "/* not defined: WITH_MATH */" >src/config.h
  41. fi
  42. echo "#define PACKAGE_AUTHOR \"${PACKAGE_AUTHOR}\"" >>src/config.h

请注意,configure 命令替换 Makefile.in 文件中的 @…@ 字符串以生成 Makefilesrc/config.h

让我们使用 debmake 命令打包。

  1. $ cd debhello-1.5
  2. $ debmake
  3. I: set parameters
  4. I: sanity check of parameters
  5. I: pkg="debhello", ver="1.5", rev="1"
  6. I: *** start packaging in "debhello-1.5". ***
  7. I: provide debhello_1.5.orig.tar.gz for non-native Debian package
  8. I: pwd = "/path/to"
  9. I: $ ln -sf debhello-1.5.tar.gz debhello_1.5.orig.tar.gz
  10. I: pwd = "/path/to/debhello-1.5"
  11. I: parse binary package settings:
  12. I: binary package=debhello Type=bin / Arch=any M-A=foreign
  13. ...

结果与 Section 4.5, “第二步:使用 debmake 产生模板文件” 中的相似,但是并不完全一致。

让我们来检查一下自动产生的模板文件。

**debian/rules(模板文件,v=1.5):.**

  1. $ cat debhello-1.5/debian/rules
  2. #!/usr/bin/make -f
  3. # You must remove unused comment lines for the released package.
  4. #export DH_VERBOSE = 1
  5. #export DEB_BUILD_MAINT_OPTIONS = hardening=+all
  6. #export DEB_CFLAGS_MAINT_APPEND = -Wall -pedantic
  7. #export DEB_LDFLAGS_MAINT_APPEND = -Wl,--as-needed
  8. %:
  9. dh $@

作为维护者,我们要把这个 Debian 软件包做得更好。

**debian/rules(维护者版本,v=1.5):.**

  1. $ vim debhello-1.5/debian/rules
  2. ... hack, hack, hack, ...
  3. $ cat debhello-1.5/debian/rules
  4. #!/usr/bin/make -f
  5. export DH_VERBOSE = 1
  6. export DEB_BUILD_MAINT_OPTIONS = hardening=+all
  7. export DEB_CFLAGS_MAINT_APPEND = -Wall -pedantic
  8. export DEB_LDFLAGS_MAINT_APPEND = -Wl,--as-needed
  9. %:
  10. dh $@
  11. override_dh_auto_configure:
  12. dh_auto_configure -- \
  13. --with-math \
  14. --author="Osamu Aoki"

debian/ 目录下还有一些其它的模板文件。它们也需要进行更新。

其余的打包步骤与 Section 4.7, “第四步:使用 debuild 构建软件包” 中的基本一致。

8.9. Autotools(单个二进制文件)

这里给出了从简单的 C 语言源代码创建简单的 Debian 软件包的例子,并假设上游使用了 Autotools = Autoconf (Makefile.amconfigure.ac) 作为构建系统。参见 Section 5.16.1, “Autotools”

此种源码通常也带有上游自动生成的 Makefile.inconfigure 文件。在 autotools-dev 软件包的帮助下,我们可以按 Section 8.8, “Makefile.in + configure(单个二进制软件包)” 中所介绍的,使用这些文件进行打包。

更好的做法是,如果上游提供的 Makefile.amconfigure.ac 兼容最新版本,我们可以使用最新的 Autoconf 和 Automake 软件包重新生成这些(Makefile 和 configure)文件。这么做有利于移植到新的 CPU 架构上等优势。此项工作可以使用带有 “--with autoreconf” 选项的 dh 命令来自动化。

让我们假设上游的源码包为 debhello-1.6.tar.gz

此类型的源码旨在作为非系统文件安装,例如:

  1. $ tar -xzmf debhello-1.6.tar.gz
  2. $ cd debhello-1.6
  3. $ autoreconf -ivf # optional
  4. $ ./configure --with-math
  5. $ make
  6. $ make install

让我们取得源码并制作 Debian 软件包。

下载 debhello-1.6.tar.gz.

  1. $ wget http://www.example.org/download/debhello-1.6.tar.gz
  2. ...
  3. $ tar -xzmf debhello-1.6.tar.gz
  4. $ tree
  5. .
  6. ├── debhello-1.6
  7. ├── Makefile.am
  8. ├── configure.ac
  9. ├── data
  10. ├── hello.desktop
  11. └── hello.png
  12. ├── man
  13. ├── Makefile.am
  14. └── hello.1
  15. └── src
  16. ├── Makefile.am
  17. └── hello.c
  18. └── debhello-1.6.tar.gz
  19. 4 directories, 9 files

此处的源码如下所示。

**src/hello.c(v=1.6):.**

  1. $ cat debhello-1.6/src/hello.c
  2. #include "config.h"
  3. #ifdef WITH_MATH
  4. # include <math.h>
  5. #endif
  6. #include <stdio.h>
  7. int
  8. main()
  9. {
  10. printf("Hello, I am " PACKAGE_AUTHOR "!\n");
  11. #ifdef WITH_MATH
  12. printf("4.0 * atan(1.0) = %10f8\n", 4.0*atan(1.0));
  13. #else
  14. printf("I can't do MATH!\n");
  15. #endif
  16. return 0;
  17. }

**Makefile.am(v=1.6):.**

  1. $ cat debhello-1.6/Makefile.am
  2. SUBDIRS = src man
  3. $ cat debhello-1.6/man/Makefile.am
  4. dist_man_MANS = hello.1
  5. $ cat debhello-1.6/src/Makefile.am
  6. bin_PROGRAMS = hello
  7. hello_SOURCES = hello.c

**configure.ac(v=1.6):.**

  1. $ cat debhello-1.6/configure.ac
  2. # -*- Autoconf -*-
  3. # Process this file with autoconf to produce a configure script.
  4. AC_PREREQ([2.69])
  5. AC_INIT([debhello],[2.1],[foo@example.org])
  6. AC_CONFIG_SRCDIR([src/hello.c])
  7. AC_CONFIG_HEADERS([config.h])
  8. echo "Standard customization chores"
  9. AC_CONFIG_AUX_DIR([build-aux])
  10. AM_INIT_AUTOMAKE([foreign])
  11. # Add #define PACKAGE_AUTHOR ... in config.h with a comment
  12. AC_DEFINE(PACKAGE_AUTHOR, ["Osamu Aoki"], [Define PACKAGE_AUTHOR])
  13. echo "Add --with-math option functionality to ./configure"
  14. AC_ARG_WITH([math],
  15. [AS_HELP_STRING([--with-math],
  16. [compile with math library @<:@default=yes@:>@])],
  17. [],
  18. [with_math="yes"]
  19. )
  20. echo "==== withval := \"$withval\""
  21. echo "==== with_math := \"$with_math\""
  22. # m4sh if-else construct
  23. AS_IF([test "x$with_math" != "xno"],[
  24. echo "==== Check include: math.h"
  25. AC_CHECK_HEADER(math.h,[],[
  26. AC_MSG_ERROR([Couldn't find math.h.] )
  27. ])
  28. echo "==== Check library: libm"
  29. AC_SEARCH_LIBS(atan, [m])
  30. #AC_CHECK_LIB(m, atan)
  31. echo "==== Build with LIBS := \"$LIBS\""
  32. AC_DEFINE(WITH_MATH, [1], [Build with the math library])
  33. ],[
  34. echo "==== Skip building with math.h."
  35. AH_TEMPLATE(WITH_MATH, [Build without the math library])
  36. ])
  37. # Checks for programs.
  38. AC_PROG_CC
  39. AC_CONFIG_FILES([Makefile
  40. man/Makefile
  41. src/Makefile])
  42. AC_OUTPUT
[Tip]Tip

如果没有像上述例子中,在 AM_INIT_AUTOMAKE() 中指定严格级别(strictness level)为 “foreign”,那么 automake 会默认严格级别为 “gnu”,并需要在顶级目录中有若干文件。参见 automake 文档的 “3.2 Strictness”。

让我们使用 debmake 命令打包。

  1. $ cd debhello-1.6
  2. $ debmake
  3. I: set parameters
  4. I: sanity check of parameters
  5. I: pkg="debhello", ver="1.6", rev="1"
  6. I: *** start packaging in "debhello-1.6". ***
  7. I: provide debhello_1.6.orig.tar.gz for non-native Debian package
  8. I: pwd = "/path/to"
  9. I: $ ln -sf debhello-1.6.tar.gz debhello_1.6.orig.tar.gz
  10. I: pwd = "/path/to/debhello-1.6"
  11. I: parse binary package settings:
  12. I: binary package=debhello Type=bin / Arch=any M-A=foreign
  13. ...

结果与 Section 8.8, “Makefile.in + configure(单个二进制软件包)” 中的类似,但是并不完全一致。

让我们来检查一下自动产生的模板文件。

**debian/rules(模板文件,v=1.6):**

  1. $ cat debhello-1.6/debian/rules
  2. #!/usr/bin/make -f
  3. # You must remove unused comment lines for the released package.
  4. #export DH_VERBOSE = 1
  5. #export DEB_BUILD_MAINT_OPTIONS = hardening=+all
  6. #export DEB_CFLAGS_MAINT_APPEND = -Wall -pedantic
  7. #export DEB_LDFLAGS_MAINT_APPEND = -Wl,--as-needed
  8. %:
  9. dh $@ --with autoreconf
  10. #override_dh_install:
  11. # dh_install --list-missing -X.la -X.pyc -X.pyo

作为维护者,我们要把这个 Debian 软件包做得更好。

**debian/rules(维护者版本,v=1.6):.**

  1. $ vim debhello-1.6/debian/rules
  2. ... hack, hack, hack, ...
  3. $ cat debhello-1.6/debian/rules
  4. #!/usr/bin/make -f
  5. export DH_VERBOSE = 1
  6. export DEB_BUILD_MAINT_OPTIONS = hardening=+all
  7. export DEB_CFLAGS_MAINT_APPEND = -Wall -pedantic
  8. export DEB_LDFLAGS_MAINT_APPEND = -Wl,--as-needed
  9. %:
  10. dh $@ --with autoreconf
  11. override_dh_auto_configure:
  12. dh_auto_configure -- \
  13. --with-math

debian/ 目录下还有一些其它的模板文件。它们也需要进行更新。

其余的打包步骤与 Section 4.7, “第四步:使用 debuild 构建软件包” 中的基本一致。

8.10. CMake(单个二进制软件包)

此处是一个从简单的 C 语言源码程序生成简单的 Debian 软件包的示例,我们假设上游使用 CMake(CMakeLists.txt 和若干形似 config.h.in 的文件)作为构建系统。参见 Section 5.16.2, “CMake”

cmake 命令根据 CMakeLists.txt 文件和它的 -D 选项来生成 Makefile 文件。此外,它还会根据 configure_file(…) 中指定的条目来替换带有 @…@ 的字符串、更改 #cmakedefine …

让我们假设上游的源码包为 debhello-1.7.tar.gz

此类型的源码旨在作为非系统文件安装,例如:

  1. $ tar -xzmf debhello-1.7.tar.gz
  2. $ cd debhello-1.7
  3. $ mkdir obj-x86_64-linux-gnu # for out-of-tree build
  4. $ cd obj-x86_64-linux-gnu
  5. $ cmake ..
  6. $ make
  7. $ make install

让我们取得源码并制作 Debian 软件包。

下载 debhello-1.7.tar.gz.

  1. $ wget http://www.example.org/download/debhello-1.7.tar.gz
  2. ...
  3. $ tar -xzmf debhello-1.7.tar.gz
  4. $ tree
  5. .
  6. ├── debhello-1.7
  7. ├── CMakeLists.txt
  8. ├── data
  9. ├── hello.desktop
  10. └── hello.png
  11. ├── man
  12. ├── CMakeLists.txt
  13. └── hello.1
  14. └── src
  15. ├── CMakeLists.txt
  16. ├── config.h.in
  17. └── hello.c
  18. └── debhello-1.7.tar.gz
  19. 4 directories, 9 files

此处的源码如下所示。

**src/hello.c(v=1.7):.**

  1. $ cat debhello-1.7/src/hello.c
  2. #include "config.h"
  3. #ifdef WITH_MATH
  4. # include <math.h>
  5. #endif
  6. #include <stdio.h>
  7. int
  8. main()
  9. {
  10. printf("Hello, I am " PACKAGE_AUTHOR "!\n");
  11. #ifdef WITH_MATH
  12. printf("4.0 * atan(1.0) = %10f8\n", 4.0*atan(1.0));
  13. #else
  14. printf("I can't do MATH!\n");
  15. #endif
  16. return 0;
  17. }

**src/config.h.in(v=1.7):.**

  1. $ cat debhello-1.7/src/config.h.in
  2. /* name of the package author */
  3. #define PACKAGE_AUTHOR "@PACKAGE_AUTHOR@"
  4. /* math library support */
  5. #cmakedefine WITH_MATH

**CMakeLists.txt(v=1.7):.**

  1. $ cat debhello-1.7/CMakeLists.txt
  2. cmake_minimum_required(VERSION 2.8)
  3. project(debhello)
  4. set(PACKAGE_AUTHOR "Osamu Aoki")
  5. add_subdirectory(src)
  6. add_subdirectory(man)
  7. $ cat debhello-1.7/man/CMakeLists.txt
  8. install(
  9. FILES ${CMAKE_CURRENT_SOURCE_DIR}/hello.1
  10. DESTINATION share/man/man1
  11. )
  12. $ cat debhello-1.7/src/CMakeLists.txt
  13. # Always define HAVE_CONFIG_H
  14. add_definitions(-DHAVE_CONFIG_H)
  15. # Interactively define WITH_MATH
  16. option(WITH_MATH "Build with math support" OFF)
  17. #variable_watch(WITH_MATH)
  18. # Generate config.h from config.h.in
  19. configure_file(
  20. "${CMAKE_CURRENT_SOURCE_DIR}/config.h.in"
  21. "${CMAKE_CURRENT_BINARY_DIR}/config.h"
  22. )
  23. include_directories("${CMAKE_CURRENT_BINARY_DIR}")
  24. add_executable(hello hello.c)
  25. install(TARGETS hello
  26. RUNTIME DESTINATION bin
  27. )

让我们使用 debmake 命令打包。

  1. $ cd debhello-1.7
  2. $ debmake
  3. I: set parameters
  4. I: sanity check of parameters
  5. I: pkg="debhello", ver="1.7", rev="1"
  6. I: *** start packaging in "debhello-1.7". ***
  7. I: provide debhello_1.7.orig.tar.gz for non-native Debian package
  8. I: pwd = "/path/to"
  9. I: $ ln -sf debhello-1.7.tar.gz debhello_1.7.orig.tar.gz
  10. I: pwd = "/path/to/debhello-1.7"
  11. I: parse binary package settings:
  12. I: binary package=debhello Type=bin / Arch=any M-A=foreign
  13. ...

结果与 Section 8.8, “Makefile.in + configure(单个二进制软件包)” 中的类似,但是并不完全一致。

让我们来检查一下自动产生的模板文件。

**debian/rules(模板文件,v=1.7):.**

  1. $ cat debhello-1.7/debian/rules
  2. #!/usr/bin/make -f
  3. # You must remove unused comment lines for the released package.
  4. #export DH_VERBOSE = 1
  5. #export DEB_BUILD_MAINT_OPTIONS = hardening=+all
  6. #export DEB_CFLAGS_MAINT_APPEND = -Wall -pedantic
  7. #export DEB_LDFLAGS_MAINT_APPEND = -Wl,--as-needed
  8. %:
  9. dh $@
  10. #override_dh_auto_configure:
  11. # dh_auto_configure -- \
  12. # -DCMAKE_LIBRARY_ARCHITECTURE="$(DEB_TARGET_MULTIARCH)"

**debian/control(模板文件,v=1.7):.**

  1. $ cat debhello-1.7/debian/control
  2. Source: debhello
  3. Section: unknown
  4. Priority: optional
  5. Maintainer: "Firstname Lastname" <email.address@example.org>
  6. Build-Depends: cmake, debhelper-compat (= 13)
  7. Standards-Version: 4.5.0
  8. Homepage: <insert the upstream URL, if relevant>
  9. Package: debhello
  10. Architecture: any
  11. Multi-Arch: foreign
  12. Depends: ${misc:Depends}, ${shlibs:Depends}
  13. Description: auto-generated package by debmake
  14. This Debian binary package was auto-generated by the
  15. debmake(1) command provided by the debmake package.

作为维护者,我们要把这个 Debian 软件包做得更好。

**debian/rules(维护者版本,v=1.7):.**

  1. $ vim debhello-1.7/debian/rules
  2. ... hack, hack, hack, ...
  3. $ cat debhello-1.7/debian/rules
  4. #!/usr/bin/make -f
  5. export DH_VERBOSE = 1
  6. export DEB_BUILD_MAINT_OPTIONS = hardening=+all
  7. export DEB_CFLAGS_MAINT_APPEND = -Wall -pedantic
  8. export DEB_LDFLAGS_MAINT_APPEND = -Wl,--as-needed
  9. %:
  10. dh $@
  11. override_dh_auto_configure:
  12. dh_auto_configure -- -DWITH-MATH=1

**debian/control(维护者版本,v=1.7):.**

  1. $ vim debhello-1.7/debian/control
  2. ... hack, hack, hack, ...
  3. $ cat debhello-1.7/debian/control
  4. Source: debhello
  5. Section: devel
  6. Priority: optional
  7. Maintainer: Osamu Aoki <osamu@debian.org>
  8. Build-Depends: cmake, debhelper-compat (= 13)
  9. Standards-Version: 4.3.0
  10. Homepage: https://salsa.debian.org/debian/debmake-doc
  11. Package: debhello
  12. Architecture: any
  13. Multi-Arch: foreign
  14. Depends: ${misc:Depends}, ${shlibs:Depends}
  15. Description: example package in the debmake-doc package
  16. This is an example package to demonstrate Debian packaging using
  17. the debmake command.
  18. .
  19. The generated Debian package uses the dh command offered by the
  20. debhelper package and the dpkg source format `3.0 (quilt)'.

debian/ 目录下还有一些其它的模板文件。它们也需要进行更新。

其余的打包工作与 Section 8.8, “Makefile.in + configure(单个二进制软件包)” 中的近乎一致。

8.11. Autotools(多个二进制软件包)

此处是从一个简单的 C 语言源码程序创建一个包含可执行软件包、共享库包、开发文件包和调试符号包的一系列 Debian 二进制包的示例,我们假设上游使用 Autotools = Autoconf 和 Automake (使用 Makefile.amconfigure.ac 作为输入文件)作为构建系统。参见 Section 5.16.1, “Autotools”

让我们用与 Section 8.9, “Autotools(单个二进制文件)” 中的相同的方式打包。

让我们假设上游源码包为 debhello-2.0.tar.gz

此类型的源码旨在作为非系统文件安装,例如:

  1. $ tar -xzmf debhello-2.0.tar.gz
  2. $ cd debhello-2.0
  3. $ autoreconf -ivf # optional
  4. $ ./configure --with-math
  5. $ make
  6. $ make install

让我们取得源码并制作 Debian 软件包。

下载 debhello-2.0.tar.gz.

  1. $ wget http://www.example.org/download/debhello-2.0.tar.gz
  2. ...
  3. $ tar -xzmf debhello-2.0.tar.gz
  4. $ tree
  5. .
  6. ├── debhello-2.0
  7. ├── Makefile.am
  8. ├── configure.ac
  9. ├── data
  10. ├── hello.desktop
  11. └── hello.png
  12. ├── lib
  13. ├── Makefile.am
  14. ├── sharedlib.c
  15. └── sharedlib.h
  16. ├── man
  17. ├── Makefile.am
  18. └── hello.1
  19. └── src
  20. ├── Makefile.am
  21. └── hello.c
  22. └── debhello-2.0.tar.gz
  23. 5 directories, 12 files

此处的源码如下所示。

**src/hello.c(v=2.0):.**

  1. $ cat debhello-2.0/src/hello.c
  2. #include "config.h"
  3. #include <stdio.h>
  4. #include <sharedlib.h>
  5. int
  6. main()
  7. {
  8. printf("Hello, I am " PACKAGE_AUTHOR "!\n");
  9. sharedlib();
  10. return 0;
  11. }

**lib/sharedlib.hlib/sharedlib.c(v=1.6):.**

  1. $ cat debhello-2.0/lib/sharedlib.h
  2. int sharedlib();
  3. $ cat debhello-2.0/lib/sharedlib.c
  4. #include <stdio.h>
  5. int
  6. sharedlib()
  7. {
  8. printf("This is a shared library!\n");
  9. return 0;
  10. }

**Makefile.am(v=2.0):.**

  1. $ cat debhello-2.0/Makefile.am
  2. # recursively process `Makefile.am` in SUBDIRS
  3. SUBDIRS = lib src man
  4. $ cat debhello-2.0/man/Makefile.am
  5. # manpages (distributed in the source package)
  6. dist_man_MANS = hello.1
  7. $ cat debhello-2.0/lib/Makefile.am
  8. # libtool librares to be produced
  9. lib_LTLIBRARIES = libsharedlib.la
  10. # source files used for lib_LTLIBRARIES
  11. libsharedlib_la_SOURCES = sharedlib.c
  12. # C pre-processor flags used for lib_LTLIBRARIES
  13. #libsharedlib_la_CPPFLAGS =
  14. # Headers files to be installed in <prefix>/include
  15. include_HEADERS = sharedlib.h
  16. # Versioning Libtool Libraries with version triplets
  17. libsharedlib_la_LDFLAGS = -version-info 1:0:0
  18. $ cat debhello-2.0/src/Makefile.am
  19. # program executables to be produced
  20. bin_PROGRAMS = hello
  21. # source files used for bin_PROGRAMS
  22. hello_SOURCES = hello.c
  23. # C pre-processor flags used for bin_PROGRAMS
  24. AM_CPPFLAGS = -I$(srcdir) -I$(top_srcdir)/lib
  25. # Extra options for the linker for hello
  26. # hello_LDFLAGS =
  27. # Libraries the `hello` binary to be linked
  28. hello_LDADD = $(top_srcdir)/lib/libsharedlib.la

**configure.ac(v=2.0):.**

  1. $ cat debhello-2.0/configure.ac
  2. # -*- Autoconf -*-
  3. # Process this file with autoconf to produce a configure script.
  4. AC_PREREQ([2.69])
  5. AC_INIT([debhello],[2.2],[foo@example.org])
  6. AC_CONFIG_SRCDIR([src/hello.c])
  7. AC_CONFIG_HEADERS([config.h])
  8. echo "Standard customization chores"
  9. AC_CONFIG_AUX_DIR([build-aux])
  10. AM_INIT_AUTOMAKE([foreign])
  11. # Set default to --enable-shared --disable-static
  12. LT_INIT([shared disable-static])
  13. # find the libltdl sources in the libltdl sub-directory
  14. LT_CONFIG_LTDL_DIR([libltdl])
  15. # choose one
  16. LTDL_INIT([recursive])
  17. #LTDL_INIT([subproject])
  18. #LTDL_INIT([nonrecursive])
  19. # Add #define PACKAGE_AUTHOR ... in config.h with a comment
  20. AC_DEFINE(PACKAGE_AUTHOR, ["Osamu Aoki"], [Define PACKAGE_AUTHOR])
  21. # Checks for programs.
  22. AC_PROG_CC
  23. # only for the recursive case
  24. AC_CONFIG_FILES([Makefile
  25. lib/Makefile
  26. man/Makefile
  27. src/Makefile])
  28. AC_OUTPUT

让我们用 debmake 命令将这些打包到多个包中:

  • debhello: type = bin
  • libsharedlib1: type = lib
  • libsharedlib-dev: type = dev

此处的 -b’,libsharedlib1,libsharedlib-dev’ 选项是用以指明生成的二进制包。

  1. $ cd debhello-2.0
  2. $ debmake -b',libsharedlib1,libsharedlib-dev'
  3. I: set parameters
  4. I: sanity check of parameters
  5. I: pkg="debhello", ver="2.0", rev="1"
  6. I: *** start packaging in "debhello-2.0". ***
  7. I: provide debhello_2.0.orig.tar.gz for non-native Debian package
  8. I: pwd = "/path/to"
  9. I: $ ln -sf debhello-2.0.tar.gz debhello_2.0.orig.tar.gz
  10. I: pwd = "/path/to/debhello-2.0"
  11. I: parse binary package settings: ,libsharedlib1,libsharedlib-dev
  12. I: binary package=debhello Type=bin / Arch=any M-A=foreign
  13. I: binary package=libsharedlib1 Type=lib / Arch=any M-A=same
  14. I: binary package=libsharedlib-dev Type=dev / Arch=any M-A=same
  15. I: analyze the source tree
  16. I: build_type = Autotools with autoreconf
  17. ...

结果与 Section 8.8, “Makefile.in + configure(单个二进制软件包)” 中的相似,但是这个具有更多的模板文件。

让我们来检查一下自动产生的模板文件。

**debian/rules(模板文件,v=2.0):.**

  1. $ cat debhello-2.0/debian/rules
  2. #!/usr/bin/make -f
  3. # You must remove unused comment lines for the released package.
  4. #export DH_VERBOSE = 1
  5. #export DEB_BUILD_MAINT_OPTIONS = hardening=+all
  6. #export DEB_CFLAGS_MAINT_APPEND = -Wall -pedantic
  7. #export DEB_LDFLAGS_MAINT_APPEND = -Wl,--as-needed
  8. %:
  9. dh $@ --with autoreconf
  10. #override_dh_install:
  11. # dh_install --list-missing -X.la -X.pyc -X.pyo

作为维护者,我们要把这个 Debian 软件包做得更好。

**debian/rules(维护者版本,v=2.0):.**

  1. $ vim debhello-2.0/debian/rules
  2. ... hack, hack, hack, ...
  3. $ cat debhello-2.0/debian/rules
  4. #!/usr/bin/make -f
  5. export DH_VERBOSE = 1
  6. export DEB_BUILD_MAINT_OPTIONS = hardening=+all
  7. export DEB_CFLAGS_MAINT_APPEND = -Wall -pedantic
  8. export DEB_LDFLAGS_MAINT_APPEND = -Wl,--as-needed
  9. %:
  10. dh $@ --with autoreconf
  11. override_dh_missing:
  12. dh_missing -X.la

**debian/control(维护者版本,v=2.0):.**

  1. $ vim debhello-2.0/debian/control
  2. ... hack, hack, hack, ...
  3. $ cat debhello-2.0/debian/control
  4. Source: debhello
  5. Section: devel
  6. Priority: optional
  7. Maintainer: Osamu Aoki <osamu@debian.org>
  8. Build-Depends: debhelper-compat (= 13), dh-autoreconf
  9. Standards-Version: 4.3.0
  10. Homepage: https://salsa.debian.org/debian/debmake-doc
  11. Package: debhello
  12. Architecture: any
  13. Multi-Arch: foreign
  14. Depends: libsharedlib1 (= ${binary:Version}),
  15. ${misc:Depends},
  16. ${shlibs:Depends}
  17. Description: example executable package
  18. This is an example package to demonstrate Debian packaging using
  19. the debmake command.
  20. .
  21. The generated Debian package uses the dh command offered by the
  22. debhelper package and the dpkg source format `3.0 (quilt)'.
  23. .
  24. This package provides the executable program.
  25. Package: libsharedlib1
  26. Section: libs
  27. Architecture: any
  28. Multi-Arch: same
  29. Pre-Depends: ${misc:Pre-Depends}
  30. Depends: ${misc:Depends}, ${shlibs:Depends}
  31. Description: example shared library package
  32. This is an example package to demonstrate Debian packaging using
  33. the debmake command.
  34. .
  35. The generated Debian package uses the dh command offered by the
  36. debhelper package and the dpkg source format `3.0 (quilt)'.
  37. .
  38. This package contains the shared library.
  39. Package: libsharedlib-dev
  40. Section: libdevel
  41. Architecture: any
  42. Multi-Arch: same
  43. Depends: libsharedlib1 (= ${binary:Version}), ${misc:Depends}
  44. Description: example development package
  45. This is an example package to demonstrate Debian packaging using
  46. the debmake command.
  47. .
  48. The generated Debian package uses the dh command offered by the
  49. debhelper package and the dpkg source format `3.0 (quilt)'.
  50. .
  51. This package contains the development files.

*debian/\.install(维护者版本,v=2.0):.**

  1. $ vim debhello-2.0/debian/debhello.install
  2. ... hack, hack, hack, ...
  3. $ cat debhello-2.0/debian/debhello.install
  4. usr/bin/*
  5. usr/share/*
  6. $ vim debhello-2.0/debian/libsharedlib1.install
  7. ... hack, hack, hack, ...
  8. $ cat debhello-2.0/debian/libsharedlib1.install
  9. usr/lib/*/*.so.*
  10. $ vim debhello-2.0/debian/libsharedlib-dev.install
  11. ... hack, hack, hack, ...
  12. $ cat debhello-2.0/debian/libsharedlib-dev.install
  13. ###usr/lib/*/pkgconfig/*.pc
  14. usr/include
  15. usr/lib/*/*.so

因为上游源码已经具有正确的自动生成的 Makefile 文件,所以没有必要再去创建 debian/installdebian/manpages 文件。

debian/ 目录下还有一些其它的模板文件。它们也需要进行更新。

**debian/ 目录下的模板文件。(v=2.0):.**

  1. $ tree debhello-2.0/debian
  2. debhello-2.0/debian
  3. ├── README.Debian
  4. ├── changelog
  5. ├── control
  6. ├── copyright
  7. ├── debhello.install
  8. ├── libsharedlib-dev.install
  9. ├── libsharedlib1.install
  10. ├── libsharedlib1.symbols
  11. ├── patches
  12. └── series
  13. ├── rules
  14. ├── source
  15. ├── format
  16. └── local-options
  17. └── watch
  18. 2 directories, 13 files

其余的打包工作与 Section 8.8, “Makefile.in + configure(单个二进制软件包)” 中的近乎一致。

此处是生成的二进制包的依赖项列表。

生成的二进制包的依赖项列表(v=2.0):.

  1. $ dpkg -f debhello-dbgsym_2.0-1_amd64.deb pre-depends depends recommends con...
  2. Depends: debhello (= 2.0-1)
  3. $ dpkg -f debhello_2.0-1_amd64.deb pre-depends depends recommends conflicts ...
  4. Depends: libsharedlib1 (= 2.0-1), libc6 (>= 2.2.5)
  5. $ dpkg -f libsharedlib-dev_2.0-1_amd64.deb pre-depends depends recommends co...
  6. Depends: libsharedlib1 (= 2.0-1)
  7. $ dpkg -f libsharedlib1-dbgsym_2.0-1_amd64.deb pre-depends depends recommend...
  8. Depends: libsharedlib1 (= 2.0-1)
  9. $ dpkg -f libsharedlib1_2.0-1_amd64.deb pre-depends depends recommends confl...
  10. Depends: libc6 (>= 2.2.5)

8.12. CMake(多个二进制软件包)

此处是从一个简单的 C 语言源码程序创建一系列包含可执行软件包、共享库包、开发文件包和调试符号包的 Debian 二进制包的示例,我们假设上游使用 CMake(CMakeLists.txt 和其他形如 config.h.in 的文件)作为构建系统。参见 Section 5.16.2, “CMake”

让我们假设上游源码包为 debhello-2.1.tar.gz

此类型的源码旨在作为非系统文件安装,例如:

  1. $ tar -xzmf debhello-2.1.tar.gz
  2. $ cd debhello-2.1
  3. $ mkdir obj-x86_64-linux-gnu
  4. $ cd obj-x86_64-linux-gnu
  5. $ cmake ..
  6. $ make
  7. $ make install

让我们取得源码并制作 Debian 软件包。

下载 debhello-2.1.tar.gz.

  1. $ wget http://www.example.org/download/debhello-2.1.tar.gz
  2. ...
  3. $ tar -xzmf debhello-2.1.tar.gz
  4. $ tree
  5. .
  6. ├── debhello-2.1
  7. ├── CMakeLists.txt
  8. ├── data
  9. ├── hello.desktop
  10. └── hello.png
  11. ├── lib
  12. ├── CMakeLists.txt
  13. ├── sharedlib.c
  14. └── sharedlib.h
  15. ├── man
  16. ├── CMakeLists.txt
  17. └── hello.1
  18. └── src
  19. ├── CMakeLists.txt
  20. ├── config.h.in
  21. └── hello.c
  22. └── debhello-2.1.tar.gz
  23. 5 directories, 12 files

此处的源码如下所示。

**src/hello.c(v=2.1):.**

  1. $ cat debhello-2.1/src/hello.c
  2. #include "config.h"
  3. #include <stdio.h>
  4. #include <sharedlib.h>
  5. int
  6. main()
  7. {
  8. printf("Hello, I am " PACKAGE_AUTHOR "!\n");
  9. sharedlib();
  10. return 0;
  11. }

**src/config.h.in(v=2.1):.**

  1. $ cat debhello-2.1/src/config.h.in
  2. /* name of the package author */
  3. #define PACKAGE_AUTHOR "@PACKAGE_AUTHOR@"

**lib/sharedlib.clib/sharedlib.h(v=2.1):.**

  1. $ cat debhello-2.1/lib/sharedlib.h
  2. int sharedlib();
  3. $ cat debhello-2.1/lib/sharedlib.c
  4. #include <stdio.h>
  5. int
  6. sharedlib()
  7. {
  8. printf("This is a shared library!\n");
  9. return 0;
  10. }

**CMakeLists.txt(v=2.1):.**

  1. $ cat debhello-2.1/CMakeLists.txt
  2. cmake_minimum_required(VERSION 2.8)
  3. project(debhello)
  4. set(PACKAGE_AUTHOR "Osamu Aoki")
  5. add_subdirectory(lib)
  6. add_subdirectory(src)
  7. add_subdirectory(man)
  8. $ cat debhello-2.1/man/CMakeLists.txt
  9. install(
  10. FILES ${CMAKE_CURRENT_SOURCE_DIR}/hello.1
  11. DESTINATION share/man/man1
  12. )
  13. $ cat debhello-2.1/src/CMakeLists.txt
  14. # Always define HAVE_CONFIG_H
  15. add_definitions(-DHAVE_CONFIG_H)
  16. # Generate config.h from config.h.in
  17. configure_file(
  18. "${CMAKE_CURRENT_SOURCE_DIR}/config.h.in"
  19. "${CMAKE_CURRENT_BINARY_DIR}/config.h"
  20. )
  21. include_directories("${CMAKE_CURRENT_BINARY_DIR}")
  22. include_directories("${CMAKE_SOURCE_DIR}/lib")
  23. add_executable(hello hello.c)
  24. target_link_libraries(hello sharedlib)
  25. install(TARGETS hello
  26. RUNTIME DESTINATION bin
  27. )

让我们使用 debmake 命令打包。

  1. $ cd debhello-2.1
  2. $ debmake -b',libsharedlib1,libsharedlib-dev'
  3. I: set parameters
  4. I: sanity check of parameters
  5. I: pkg="debhello", ver="2.1", rev="1"
  6. I: *** start packaging in "debhello-2.1". ***
  7. I: provide debhello_2.1.orig.tar.gz for non-native Debian package
  8. I: pwd = "/path/to"
  9. I: $ ln -sf debhello-2.1.tar.gz debhello_2.1.orig.tar.gz
  10. I: pwd = "/path/to/debhello-2.1"
  11. I: parse binary package settings: ,libsharedlib1,libsharedlib-dev
  12. I: binary package=debhello Type=bin / Arch=any M-A=foreign
  13. ...

结果与 Section 8.8, “Makefile.in + configure(单个二进制软件包)” 中的类似,但是并不完全一致。

让我们来检查一下自动产生的模板文件。

**debian/rules(模板文件,v=2.1):.**

  1. $ cat debhello-2.1/debian/rules
  2. #!/usr/bin/make -f
  3. # You must remove unused comment lines for the released package.
  4. #export DH_VERBOSE = 1
  5. #export DEB_BUILD_MAINT_OPTIONS = hardening=+all
  6. #export DEB_CFLAGS_MAINT_APPEND = -Wall -pedantic
  7. #export DEB_LDFLAGS_MAINT_APPEND = -Wl,--as-needed
  8. %:
  9. dh $@
  10. #override_dh_auto_configure:
  11. # dh_auto_configure -- \
  12. # -DCMAKE_LIBRARY_ARCHITECTURE="$(DEB_TARGET_MULTIARCH)"

作为维护者,我们要把这个 Debian 软件包做得更好。

**debian/rules(维护者版本,v=2.1):.**

  1. $ vim debhello-2.1/debian/rules
  2. ... hack, hack, hack, ...
  3. $ cat debhello-2.1/debian/rules
  4. #!/usr/bin/make -f
  5. export DH_VERBOSE = 1
  6. export DEB_BUILD_MAINT_OPTIONS = hardening=+all
  7. export DEB_CFLAGS_MAINT_APPEND = -Wall -pedantic
  8. export DEB_LDFLAGS_MAINT_APPEND = -Wl,--as-needed
  9. DEB_HOST_MULTIARCH ?= $(shell dpkg-architecture -qDEB_HOST_MULTIARCH)
  10. %:
  11. dh $@
  12. override_dh_auto_configure:
  13. dh_auto_configure -- \
  14. -DCMAKE_LIBRARY_ARCHITECTURE="$(DEB_HOST_MULTIARCH)"

**debian/control(维护者版本,v=2.1):.**

  1. $ vim debhello-2.1/debian/control
  2. ... hack, hack, hack, ...
  3. $ cat debhello-2.1/debian/control
  4. Source: debhello
  5. Section: devel
  6. Priority: optional
  7. Maintainer: Osamu Aoki <osamu@debian.org>
  8. Build-Depends: cmake, debhelper-compat (= 13)
  9. Standards-Version: 4.3.0
  10. Homepage: https://salsa.debian.org/debian/debmake-doc
  11. Package: debhello
  12. Architecture: any
  13. Multi-Arch: foreign
  14. Depends: libsharedlib1 (= ${binary:Version}),
  15. ${misc:Depends},
  16. ${shlibs:Depends}
  17. Description: example executable package
  18. This is an example package to demonstrate Debian packaging using
  19. the debmake command.
  20. .
  21. The generated Debian package uses the dh command offered by the
  22. debhelper package and the dpkg source format `3.0 (quilt)'.
  23. .
  24. This package provides the executable program.
  25. Package: libsharedlib1
  26. Section: libs
  27. Architecture: any
  28. Multi-Arch: same
  29. Pre-Depends: ${misc:Pre-Depends}
  30. Depends: ${misc:Depends}, ${shlibs:Depends}
  31. Description: example shared library package
  32. This is an example package to demonstrate Debian packaging using
  33. the debmake command.
  34. .
  35. The generated Debian package uses the dh command offered by the
  36. debhelper package and the dpkg source format `3.0 (quilt)'.
  37. .
  38. This package contains the shared library.
  39. Package: libsharedlib-dev
  40. Section: libdevel
  41. Architecture: any
  42. Multi-Arch: same
  43. Depends: libsharedlib1 (= ${binary:Version}), ${misc:Depends}
  44. Description: example development package
  45. This is an example package to demonstrate Debian packaging using
  46. the debmake command.
  47. .
  48. The generated Debian package uses the dh command offered by the
  49. debhelper package and the dpkg source format `3.0 (quilt)'.
  50. .
  51. This package contains the development files.

*debian/\.install(维护者版本,v=2.1):.**

  1. $ vim debhello-2.1/debian/debhello.install
  2. ... hack, hack, hack, ...
  3. $ cat debhello-2.1/debian/debhello.install
  4. usr/bin/*
  5. usr/share/*
  6. $ vim debhello-2.1/debian/libsharedlib1.install
  7. ... hack, hack, hack, ...
  8. $ cat debhello-2.1/debian/libsharedlib1.install
  9. usr/lib/*/*.so.*
  10. $ vim debhello-2.1/debian/libsharedlib-dev.install
  11. ... hack, hack, hack, ...
  12. $ cat debhello-2.1/debian/libsharedlib-dev.install
  13. ###usr/lib/*/pkgconfig/*.pc
  14. usr/include
  15. usr/lib/*/*.so

需要对上游的 CMakeList.txt 进行修补,以便应对多架构的路径。

**debian/patches/*(维护者版本,v=2.1):.**

  1. ... hack, hack, hack, ...
  2. $ cat debhello-2.1/debian/libsharedlib1.symbols
  3. libsharedlib.so.1 libsharedlib1 #MINVER#
  4. sharedlib@Base 2.1

因为上游源码已经具有正确的自动生成的 Makefile 文件,所以没有必要再去创建 debian/installdebian/manpages 文件。

debian/ 目录下还有一些其它的模板文件。它们也需要进行更新。

**debian/ 目录下的模板文件。(v=2.1):.**

  1. $ tree debhello-2.1/debian
  2. debhello-2.1/debian
  3. ├── README.Debian
  4. ├── changelog
  5. ├── control
  6. ├── copyright
  7. ├── debhello.install
  8. ├── libsharedlib-dev.install
  9. ├── libsharedlib1.install
  10. ├── libsharedlib1.symbols
  11. ├── patches
  12. ├── 000-cmake-multiarch.patch
  13. └── series
  14. ├── rules
  15. ├── source
  16. ├── format
  17. └── local-options
  18. └── watch
  19. 2 directories, 14 files

其余的打包工作与 Section 8.8, “Makefile.in + configure(单个二进制软件包)” 中的近乎一致。

此处是生成的二进制包的依赖项列表。

生成的二进制包的依赖项列表(v=2.1):.

  1. $ dpkg -f debhello-dbgsym_2.1-1_amd64.deb pre-depends depends recommends con...
  2. Depends: debhello (= 2.1-1)
  3. $ dpkg -f debhello_2.1-1_amd64.deb pre-depends depends recommends conflicts ...
  4. Depends: libsharedlib1 (= 2.1-1), libc6 (>= 2.2.5)
  5. $ dpkg -f libsharedlib-dev_2.1-1_amd64.deb pre-depends depends recommends co...
  6. Depends: libsharedlib1 (= 2.1-1)
  7. $ dpkg -f libsharedlib1-dbgsym_2.1-1_amd64.deb pre-depends depends recommend...
  8. Depends: libsharedlib1 (= 2.1-1)
  9. $ dpkg -f libsharedlib1_2.1-1_amd64.deb pre-depends depends recommends confl...
  10. Depends: libc6 (>= 2.2.5)

8.13. 国际化

此处是更新 Section 8.11, “Autotools(多个二进制软件包)” 中提供的简单上游 C 语言源代码 debhello-2.0.tar.gz 以便进行国际化(i18n)并创建更新后的上游 C 语言源代码 debhello-2.0.tar.gz 的示例。

在实际情况中,此软件包应该已被国际化过。所以此示例用作帮助您了解国际化的具体实现方法。

[Tip]Tip

负责维护国际化的维护者的日常活动就是将通过缺陷追踪系统(BTS)反馈给您的 po 翻译文件添加至 po/ 目录,然后更新 po/LINGUAS 文件的语言列表。

让我们取得源码并制作 Debian 软件包。

下载 debhello-2.0.tar.gz(国际化版).

  1. $ wget http://www.example.org/download/debhello-2.0.tar.gz
  2. ...
  3. $ tar -xzmf debhello-2.0.tar.gz
  4. $ tree
  5. .
  6. ├── debhello-2.0
  7. ├── Makefile.am
  8. ├── configure.ac
  9. ├── data
  10. ├── hello.desktop
  11. └── hello.png
  12. ├── lib
  13. ├── Makefile.am
  14. ├── sharedlib.c
  15. └── sharedlib.h
  16. ├── man
  17. ├── Makefile.am
  18. └── hello.1
  19. └── src
  20. ├── Makefile.am
  21. └── hello.c
  22. └── debhello-2.0.tar.gz
  23. 5 directories, 12 files

使用 gettextize 命令将此源代码树国际化,并删除由 Autotools 自动生成的文件。

运行 gettextize(国际化版):.

  1. $ cd debhello-2.0
  2. $ gettextize
  3. Creating po/ subdirectory
  4. Creating build-aux/ subdirectory
  5. Copying file ABOUT-NLS
  6. Copying file build-aux/config.rpath
  7. Not copying intl/ directory.
  8. Copying file po/Makefile.in.in
  9. Copying file po/Makevars.template
  10. Copying file po/Rules-quot
  11. Copying file po/boldquot.sed
  12. Copying file po/en@boldquot.header
  13. Copying file po/en@quot.header
  14. Copying file po/insert-header.sin
  15. Copying file po/quot.sed
  16. Copying file po/remove-potcdate.sin
  17. Creating initial po/POTFILES.in
  18. Creating po/ChangeLog
  19. Creating directory m4
  20. Copying file m4/gettext.m4
  21. Copying file m4/iconv.m4
  22. Copying file m4/lib-ld.m4
  23. Copying file m4/lib-link.m4
  24. Copying file m4/lib-prefix.m4
  25. Copying file m4/nls.m4
  26. Copying file m4/po.m4
  27. Copying file m4/progtest.m4
  28. Creating m4/ChangeLog
  29. Updating Makefile.am (backup is in Makefile.am~)
  30. Updating configure.ac (backup is in configure.ac~)
  31. Creating ChangeLog
  32. Please use AM_GNU_GETTEXT([external]) in order to cause autoconfiguration
  33. to look for an external libintl.
  34. Please create po/Makevars from the template in po/Makevars.template.
  35. You can then remove po/Makevars.template.
  36. Please fill po/POTFILES.in as described in the documentation.
  37. Please run 'aclocal' to regenerate the aclocal.m4 file.
  38. You need aclocal from GNU automake 1.9 (or newer) to do this.
  39. Then run 'autoconf' to regenerate the configure file.
  40. You will also need config.guess and config.sub, which you can get from the CV...
  41. of the 'config' project at http://savannah.gnu.org/. The commands to fetch th...
  42. are
  43. $ wget 'http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/config/config/conf...
  44. $ wget 'http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/config/config/conf...
  45. You might also want to copy the convenience header file gettext.h
  46. from the /usr/share/gettext directory into your package.
  47. It is a wrapper around <libintl.h> that implements the configure --disable-nl...
  48. option.
  49. Press Return to acknowledge the previous 6 paragraphs.
  50. $ rm -rf m4 build-aux *~

让我们确认一下 po/ 目录下生成的文件。

**po 目录下的文件(国际化版):.**

  1. $ ls -l po
  2. /home/osamu/pub/salsa/debmake/debmake-doc/debhello-2.0-pkg2/step151.cmd: line...
  3. total 60
  4. -rw-rw-r-- 1 osamu osamu 494 Sep 28 23:51 ChangeLog
  5. -rw-rw-r-- 1 osamu osamu 17577 Sep 28 23:51 Makefile.in.in
  6. -rw-rw-r-- 1 osamu osamu 3376 Sep 28 23:51 Makevars.template
  7. -rw-rw-r-- 1 osamu osamu 59 Sep 28 23:51 POTFILES.in
  8. -rw-rw-r-- 1 osamu osamu 2203 Sep 28 23:51 Rules-quot
  9. -rw-rw-r-- 1 osamu osamu 217 Sep 28 23:51 boldquot.sed
  10. -rw-rw-r-- 1 osamu osamu 1337 Sep 28 23:51 en@boldquot.header
  11. -rw-rw-r-- 1 osamu osamu 1203 Sep 28 23:51 en@quot.header
  12. -rw-rw-r-- 1 osamu osamu 672 Sep 28 23:51 insert-header.sin
  13. -rw-rw-r-- 1 osamu osamu 153 Sep 28 23:51 quot.sed
  14. -rw-rw-r-- 1 osamu osamu 432 Sep 28 23:51 remove-potcdate.sin

让我们在 configure.ac 文件中添加 “AM_GNU_GETTEXT([external])” 等条目。

**configure.ac(国际化版):.**

  1. $ vim configure.ac
  2. ... hack, hack, hack, ...
  3. $ cat configure.ac
  4. # -*- Autoconf -*-
  5. # Process this file with autoconf to produce a configure script.
  6. AC_PREREQ([2.69])
  7. AC_INIT([debhello],[2.2],[foo@example.org])
  8. AC_CONFIG_SRCDIR([src/hello.c])
  9. AC_CONFIG_HEADERS([config.h])
  10. echo "Standard customization chores"
  11. AC_CONFIG_AUX_DIR([build-aux])
  12. AM_INIT_AUTOMAKE([foreign])
  13. # Set default to --enable-shared --disable-static
  14. LT_INIT([shared disable-static])
  15. # find the libltdl sources in the libltdl sub-directory
  16. LT_CONFIG_LTDL_DIR([libltdl])
  17. # choose one
  18. LTDL_INIT([recursive])
  19. #LTDL_INIT([subproject])
  20. #LTDL_INIT([nonrecursive])
  21. # Add #define PACKAGE_AUTHOR ... in config.h with a comment
  22. AC_DEFINE(PACKAGE_AUTHOR, ["Osamu Aoki"], [Define PACKAGE_AUTHOR])
  23. # Checks for programs.
  24. AC_PROG_CC
  25. # desktop file support required
  26. AM_GNU_GETTEXT_VERSION([0.19.3])
  27. AM_GNU_GETTEXT([external])
  28. # only for the recursive case
  29. AC_CONFIG_FILES([Makefile
  30. po/Makefile.in
  31. lib/Makefile
  32. man/Makefile
  33. src/Makefile])
  34. AC_OUTPUT

让我们从 po/Makevars.template 文件中创建 po/Makevars 文件。

**po/Makevars(国际化版):.**

  1. ... hack, hack, hack, ...
  2. $ diff -u po/Makevars.template po/Makevars
  3. --- po/Makevars.template 2020-07-13 00:39:17.026534688 +0900
  4. +++ po/Makevars 2020-07-13 00:39:17.102533289 +0900
  5. @@ -18,14 +18,14 @@
  6. # or entity, or to disclaim their copyright. The empty string stands for
  7. # the public domain; in this case the translators are expected to disclaim
  8. # their copyright.
  9. -COPYRIGHT_HOLDER = Free Software Foundation, Inc.
  10. +COPYRIGHT_HOLDER = Osamu Aoki <osamu@debian.org>
  11. # This tells whether or not to prepend "GNU " prefix to the package
  12. # name that gets inserted into the header of the $(DOMAIN).pot file.
  13. # Possible values are "yes", "no", or empty. If it is empty, try to
  14. # detect it automatically by scanning the files in $(top_srcdir) for
  15. # "GNU packagename" string.
  16. -PACKAGE_GNU =
  17. +PACKAGE_GNU = no
  18. # This is the email address or URL to which the translators shall report
  19. # bugs in the untranslated strings:
  20. $ rm po/Makevars.template

让我们通过用 _(…) 包裹字符串的方式来更新国际化版本的 C 语言源代码。

**src/hello.c (国际化版):.**

  1. ... hack, hack, hack, ...
  2. $ cat src/hello.c
  3. #include "config.h"
  4. #include <stdio.h>
  5. #include <sharedlib.h>
  6. #define _(string) gettext (string)
  7. int
  8. main()
  9. {
  10. printf(_("Hello, I am " PACKAGE_AUTHOR "!\n"));
  11. sharedlib();
  12. return 0;
  13. }

**lib/sharedlib.c(国际化版):.**

  1. ... hack, hack, hack, ...
  2. $ cat lib/sharedlib.c
  3. #include <stdio.h>
  4. #define _(string) gettext (string)
  5. int
  6. sharedlib()
  7. {
  8. printf(_("This is a shared library!\n"));
  9. return 0;
  10. }

新版本的 gettext(v = 0.19)可以直接处理桌面文件的国际化版本。

**data/hello.desktop.in(国际化版):.**

  1. $ fgrep -v '[ja]=' data/hello.desktop > data/hello.desktop.in
  2. $ rm data/hello.desktop
  3. $ cat data/hello.desktop.in
  4. [Desktop Entry]
  5. Name=Hello
  6. Comment=Greetings
  7. Type=Application
  8. Keywords=hello
  9. Exec=hello
  10. Terminal=true
  11. Icon=hello.png
  12. Categories=Utility;

让我们列出输入文件,以便在 po/POTFILES.in 中提取可翻译的字符串。

**po/POTFILES.in(国际化版):.**

  1. ... hack, hack, hack, ...
  2. $ cat po/POTFILES.in
  3. src/hello.c
  4. lib/sharedlib.c
  5. data/hello.desktop.in

此处是在 SUBDIRS 环境变量中添加 po 目录后更新过的根 Makefile.am 文件。

**Makefile.am (国际化版):.**

  1. $ cat Makefile.am
  2. # recursively process `Makefile.am` in SUBDIRS
  3. SUBDIRS = po lib src man
  4. ACLOCAL_AMFLAGS = -I m4
  5. EXTRA_DIST = build-aux/config.rpath m4/ChangeLog

让我们创建一个翻译模板文件 debhello.pot

**po/debhello.pot(国际化版):.**

  1. $ xgettext -f po/POTFILES.in -d debhello -o po/debhello.pot -k_
  2. $ cat po/debhello.pot
  3. # SOME DESCRIPTIVE TITLE.
  4. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
  5. # This file is distributed under the same license as the PACKAGE package.
  6. # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
  7. #
  8. #, fuzzy
  9. msgid ""
  10. msgstr ""
  11. "Project-Id-Version: PACKAGE VERSION\n"
  12. "Report-Msgid-Bugs-To: \n"
  13. "POT-Creation-Date: 2020-07-13 00:39+0900\n"
  14. "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
  15. "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
  16. "Language-Team: LANGUAGE <LL@li.org>\n"
  17. "Language: \n"
  18. "MIME-Version: 1.0\n"
  19. "Content-Type: text/plain; charset=CHARSET\n"
  20. "Content-Transfer-Encoding: 8bit\n"
  21. #: src/hello.c:8
  22. #, c-format
  23. msgid "Hello, I am "
  24. msgstr ""
  25. #: lib/sharedlib.c:6
  26. #, c-format
  27. msgid "This is a shared library!\n"
  28. msgstr ""
  29. #: data/hello.desktop.in:3
  30. msgid "Hello"
  31. msgstr ""
  32. #: data/hello.desktop.in:4
  33. msgid "Greetings"
  34. msgstr ""
  35. #: data/hello.desktop.in:6
  36. msgid "hello"
  37. msgstr ""
  38. #: data/hello.desktop.in:9
  39. msgid "hello.png"
  40. msgstr ""

让我们添加法语的翻译。

**po/LINGUASpo/fr.po(国际化版):.**

  1. $ echo 'fr' > po/LINGUAS
  2. $ cp po/debhello.pot po/fr.po
  3. $ vim po/fr.po
  4. ... hack, hack, hack, ...
  5. $ cat po/fr.po
  6. # SOME DESCRIPTIVE TITLE.
  7. # This file is put in the public domain.
  8. # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
  9. #
  10. msgid ""
  11. msgstr ""
  12. "Project-Id-Version: debhello 2.2\n"
  13. "Report-Msgid-Bugs-To: foo@example.org\n"
  14. "POT-Creation-Date: 2015-03-01 20:22+0900\n"
  15. "PO-Revision-Date: 2015-02-21 23:18+0900\n"
  16. "Last-Translator: Osamu Aoki <osamu@debian.org>\n"
  17. "Language-Team: French <LL@li.org>\n"
  18. "Language: ja\n"
  19. "MIME-Version: 1.0\n"
  20. "Content-Type: text/plain; charset=UTF-8\n"
  21. "Content-Transfer-Encoding: 8bit\n"
  22. #: src/hello.c:34
  23. #, c-format
  24. msgid "Hello, my name is %s!\n"
  25. msgstr "Bonjour, je m'appelle %s!\n"
  26. #: lib/sharedlib.c:29
  27. #, c-format
  28. msgid "This is a shared library!\n"
  29. msgstr "Ceci est une bibliothèque partagée!\n"
  30. #: data/hello.desktop.in:3
  31. msgid "Hello"
  32. msgstr ""
  33. #: data/hello.desktop.in:4
  34. msgid "Greetings"
  35. msgstr "Salutations"
  36. #: data/hello.desktop.in:6
  37. msgid "hello"
  38. msgstr ""
  39. #: data/hello.desktop.in:9
  40. msgid "hello.png"
  41. msgstr ""

打包工作与 Section 8.11, “Autotools(多个二进制软件包)” 中的近乎一致。

您可以在 Section 8.14, “细节” 中寻找更多国际化的例子:

  • 带有Makefile 的 POSIX shell 脚本(v=3.0),
  • 带有 distutils 的 Python3 脚本 (v=3.1),
  • 带有 Makefile.in + configure 的 C 语言源代码(v=3.2),
  • 带有 Autotools 的 C 语言源代码(v=3.3),以及
  • 带有 CMake 的 C 语言源代码(v=3.4)。

8.14. 细节

所示示例的实际细节及其变体可通过以下方式获得。

如何取得细节.

  1. $ apt-get source debmake-doc
  2. $ sudo apt-get install devscripts build-essentials
  3. $ cd debmake-doc*
  4. $ sudo apt-get build-dep ./
  5. $ make

-pkg[0-9] 后缀的每个目录都包含 Debian 打包示例。

  • 模拟控制台命令行活动日志:.log 文件
  • 模拟控制台命令行活动日志(缩略版):.slog 文件
  • 执行 debmake 命令后的源码树快照:debmake 目录
  • 打包后的源码树快照:packge 目录
  • 执行 debuild 命令后的源码树快照:test 目录