Table of Contents
Есть старая латинская поговорка: «Longum iter est per praecepta, breve et efficax per exempla» («Долог путь поучений, короток и успешен путь примеров»).
Ниже приведён пример создания простого пакета Debian из простого исходного кода на языке C, использующего в качестве системы сборки Makefile.
Допустим, имя tar-архива из основной ветки разработки будет debhello-0.0.tar.gz.
Предполагается, что этот тип исходного кода будет установлен как несистемный файл:
$ tar -xzmf debhello-0.0.tar.gz $ cd debhello-0.0 $ make $ make install
При создании пакетов Debian требуется изменить процесс установки файлов с помощью «make install» так, чтобы установка производилось в системный каталог, а не в обычный каталог в /usr/local.
Note | |
---|---|
Примеры создания пакета Debian из других более сложных систем сборки описаны в Chapter 8, Дополнительные примеры. |
Общая картина сборки простого неродного пакета Debian из tar-архива основной ветки разработки debhello-0.0.tar.gz может быть представлена следующим образом:
Команда debmake добавляет шаблонные файлы исключительно в каталог debian.
Команда debuild собирает двоичный пакет из подготовленного дерева исходного кода.
Общая картина сборки пакета.
$ tar -xzmf debhello-0.0.tar.gz $ cd debhello-0.0 $ debmake ... manual customization $ debuild ...
Tip | |
---|---|
The debuild command in this and following examples may be substituted by equivalent commands such as the sbuild command. |
Tip | |
---|---|
Если доступен tar-архив основной ветки разработки в формате .tar.xz, то используйте его вместо архивов в формате .tar.gz или .tar.bz2. Утилита xz предлагает более высокую степень сжатия, чем gzip и bzip2. |
Команда debmake является вспомогательным сценарием для создания и изменения пакетов Debian.
Эти возможности делают работу с пакетами Debian с помощью debmake простой и современной.
In retrospective, I created debmake to simplify this documentation. I consider debmake to be more-or-less a demonstration session generator for tutorial purpose.
Note | |
---|---|
Many packages are packaged using only a text editor while imitating how other similar packages are packaged and consulting how the Debian policy requires us to do. This seems to me the most popular method for the real-life packaging activity. |
The debmake command isn’t the only helper script to make a Debian package. If you are interested alternative packaging helper tools, please see:
Ниже приведён обзор команд, похожих на команду debuild.
dpkg-buildpackage — официальная команда для сборки двоичного пакета Debian. Для обычной двоичной сборки она, грубо говоря, выполняет следующую последовательность команд:
«debsign» (подписывание файлов *.dsc и *.changes)
Note | |
---|---|
Подробную информацию см. в dpkg-buildpackage(1). |
Получим исходный код основной ветки разработки.
Скачаем файл debhello-0.0.tar.gz.
$ wget http://www.example.org/download/debhello-0.0.tar.gz ... $ tar -xzf debhello-0.0.tar.gz $ tree . ├── debhello-0.0 │ ├── LICENSE │ ├── Makefile │ └── src │ └── hello.c └── debhello-0.0.tar.gz 2 directories, 4 files
В нём содержится исходный код на языке C, hello.c, довольно простой.
hello.c.
$ cat debhello-0.0/src/hello.c #include <stdio.h> int main() { printf("Hello, world!\n"); return 0; }
Итак, Makefile соответствует Стандартам написания кода GNU и Стандарту иерархии файловой системы. А именно:
Makefile.
$ cat debhello-0.0/Makefile prefix = /usr/local all: src/hello src/hello: src/hello.c @echo "CFLAGS=$(CFLAGS)" | \ fold -s -w 70 | \ sed -e 's/^/# /' $(CC) $(CPPFLAGS) $(CFLAGS) $(LDCFLAGS) -o $@ $^ install: src/hello install -D src/hello \ $(DESTDIR)$(prefix)/bin/hello clean: -rm -f src/hello distclean: clean uninstall: -rm -f $(DESTDIR)$(prefix)/bin/hello .PHONY: all install clean distclean uninstall
Note | |
---|---|
В приведённом ниже примере применение команды echo к $(CFLAGS) используется для проверки настройки сборочных флагов. |
Tip | |
---|---|
Если команда debmake вызвана с опцией -T, то в шаблонные файлы будут добавлены более подробные комментарии. |
Вывод команды debmake довольно подробен, в нём объяснены выполняемые действия, например, как это указано ниже.
$ cd debhello-0.0 $ debmake I: set parameters I: ================================================================= I: package_dir = /usr/lib/python3/dist-packages I: base_path = /usr I: base_lib_path = /usr/lib/debmake I: base_share_path = /usr/share/debmake I: ================================================================= I: sanity check of parameters I: pkg="debhello", ver="0.0", rev="1" I: *** start packaging in "debhello-0.0". *** I: provide debhello_0.0.orig.tar.gz for non-native Debian package I: pwd = "/path/to" I: $ ln -sf debhello-0.0.tar.gz debhello_0.0.orig.tar.gz I: pwd = "/path/to/debhello-0.0" I: parse binary package settings: I: binary package=debhello Type=bin / Arch=any M-A=foreign I: analyze the source tree I: build_type = make I: scan source for copyright+license text and file extensions I: 100 %, ext = c I: check_all_licenses I: .. I: check_all_licenses completed for 2 files. I: bunch_all_licenses I: format_all_licenses I: make debian/* template files I: single binary package I: debmake -x "1" ... I: creating => debian/control I: creating => debian/copyright I: substituting => /usr/share/debmake/extra0/changelog I: creating => debian/changelog I: substituting => /usr/share/debmake/extra0/rules I: creating => debian/rules I: substituting => /usr/share/debmake/extra1/README.Debian I: creating => debian/README.Debian I: substituting => /usr/share/debmake/extra1/watch I: creating => debian/watch I: substituting => /usr/share/debmake/extra1source/format I: creating => debian/source/format I: substituting => /usr/share/debmake/extra1tests/control I: creating => debian/source/control I: substituting => /usr/share/debmake/extra1upstream/metadata I: creating => debian/upstream/metadata I: substituting => /usr/share/debmake/extra1tests/control I: creating => debian/tests/control I: substituting => /usr/share/debmake/extra1patches/series I: creating => debian/patches/series I: substituting => /usr/share/debmake/extra1sourcex/local-options I: creating => debian/source/local-options I: substituting => /usr/share/debmake/extra1sourcex/options I: creating => debian/source/options I: substituting => /usr/share/debmake/extra1sourcex/patch-header I: creating => debian/source/patch-header I: run "debmake -x2" to get more template files I: $ wrap-and-sort
Команда debmake создаёт все шаблонные файлы на основе опций командной строки. Поскольку никакие опции не были переданы, команда debmake выбирает для вас разумные значения по умолчанию:
Проверим созданные шаблонные файлы.
Дерево исходного кода после простого выполнения debmake.
$ cd .. $ tree . ├── debhello-0.0 │ ├── LICENSE │ ├── Makefile │ ├── debian │ │ ├── README.Debian │ │ ├── changelog │ │ ├── control │ │ ├── copyright │ │ ├── patches │ │ │ └── series │ │ ├── rules │ │ ├── source │ │ │ ├── control │ │ │ ├── format │ │ │ ├── local-options │ │ │ ├── options │ │ │ └── patch-header │ │ ├── tests │ │ │ └── control │ │ ├── upstream │ │ │ └── metadata │ │ └── watch │ └── src │ └── hello.c ├── debhello-0.0.tar.gz └── debhello_0.0.orig.tar.gz -> debhello-0.0.tar.gz 7 directories, 19 files
Файл debian/rules является сборочным сценарием, предоставляемым сопровождающим пакета. Ниже приводится его шаблонный файл, созданный командой debmake.
debian/rules (шаблонный файл):
$ cat debhello-0.0/debian/rules #!/usr/bin/make -f # You must remove unused comment lines for the released package. #export DH_VERBOSE = 1 #export DEB_BUILD_MAINT_OPTIONS = hardening=+all #export DEB_CFLAGS_MAINT_APPEND = -Wall -pedantic #export DEB_LDFLAGS_MAINT_APPEND = -Wl,--as-needed %: dh $@ #override_dh_auto_install: # dh_auto_install -- prefix=/usr #override_dh_install: # dh_install --list-missing -X.pyc -X.pyo
По сути, это стандартный файл debian/rules с командой dh. (Для удобства настройки в нём содержится несколько закомментированных строк.)
Файл debian/control предоставляет основные метаданные пакета Debian. Ниже приведён шаблонный файл, созданный командой debmake.
debian/control (шаблонный файл):
$ cat debhello-0.0/debian/control Source: debhello Section: unknown Priority: optional Maintainer: "Firstname Lastname" <[email protected]> Build-Depends: debhelper-compat (= 13) Standards-Version: 4.5.1 Homepage: <insert the upstream URL, if relevant> Rules-Requires-Root: no Package: debhello Architecture: any Multi-Arch: foreign Depends: ${misc:Depends}, ${shlibs:Depends} Description: auto-generated package by debmake This Debian binary package was auto-generated by the debmake(1) command provided by the debmake package.
Warning | |
---|---|
Если вы оставите «Section: unknown» в шаблонном файле debian/control без изменений, то ошибка lintian может прервать сборку. |
Поскольку это пакет с двоичными исполняемыми файлами в формате ELF, команда debmake устанавливает «Architecture: any» и «Multi-Arch: foreign». Кроме того, она устанавливает требуемые параметры переменных подстановки следующим образом: «Depends: ${shlibs:Depends}, ${misc:Depends}». Для объяснения см. Chapter 5, Основы.
Note | |
---|---|
Please note this debian/control file uses the RFC-822 style as documented in 5.2 Source package control files — debian/control of the “Debian Policy Manual”. The use of the empty line and the leading space are significant. |
Файл debian/copyright предоставляет данные об авторском праве на пакет Debian. Ниже приведён шаблонный файл, созданный командой debmake.
debian/copyright (шаблонный файл):
$ cat debhello-0.0/debian/copyright Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ Upstream-Name: debhello Upstream-Contact: <preferred name and address to reach the upstream project> Source: <url://example.com> # # Please double check copyright with the licensecheck(1) command. Files: Makefile src/hello.c Copyright: __NO_COPYRIGHT_NOR_LICENSE__ License: __NO_COPYRIGHT_NOR_LICENSE__ #----------------------------------------------------------------------------... # Files marked as NO_LICENSE_TEXT_FOUND may be covered by the following # license/copyright files. #----------------------------------------------------------------------------... # License file: LICENSE License: . All files in this archive are licensed under the MIT License as below. . Copyright 2015 Osamu Aoki <[email protected]> . Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: . The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. . THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
От сопровождающего требуется вручную внести некоторые изменения шаблонных файлов.
Для того, чтобы установить файлы в качестве части системных файлов, текущее значение $(prefix), /usr/local, в Makefile должно быть заменено на /usr. Это можно сделать в файле debian/rules с помощью цели override_dh_auto_install, передав значение «prefix=/usr».
debian/rules (версия сопровождающего):
$ vim debhello-0.0/debian/rules ... hack, hack, hack, ... $ cat debhello-0.0/debian/rules #!/usr/bin/make -f export DH_VERBOSE = 1 export DEB_BUILD_MAINT_OPTIONS = hardening=+all export DEB_CFLAGS_MAINT_APPEND = -Wall -pedantic export DEB_LDFLAGS_MAINT_APPEND = -Wl,--as-needed %: dh $@ override_dh_auto_install: dh_auto_install -- prefix=/usr
Экспортирование переменой окружения DH_VERBOSE в файле debian/rules, как это сделано выше, приводит к тому, что инструмент debhelper создаёт более подробный отчёт о сборке.
Exporting DEB_BUILD_MAINT_OPTION as above sets the hardening options as described in the “FEATURE AREAS/ENVIRONMENT” in dpkg-buildflags(1). [9]
Exporting DEB_CFLAGS_MAINT_APPEND as above forces the C compiler to emit all the warnings.
Exporting DEB_LDFLAGS_MAINT_APPEND as above forces the linker to link only when the library is actually needed. [10]
The dh_auto_install command for the Makefile based build system essentially runs “$(MAKE) install DESTDIR=debian/debhello”. The creation of this override_dh_auto_install target changes its behavior to “$(MAKE) install DESTDIR=debian/debhello prefix=/usr”.
Here are the maintainer versions of the debian/control and debian/copyright files.
debian/control (версия сопровождающего):
$ vim debhello-0.0/debian/control ... hack, hack, hack, ... $ cat debhello-0.0/debian/control Source: debhello Section: devel Priority: optional Maintainer: Osamu Aoki <[email protected]> Build-Depends: debhelper-compat (= 13) Standards-Version: 4.5.1 Homepage: https://salsa.debian.org/debian/debmake-doc Rules-Requires-Root: no Package: debhello Architecture: any Multi-Arch: foreign Depends: ${misc:Depends}, ${shlibs:Depends} Description: Simple packaging example for debmake This Debian binary package is an example package. (This is an example only)
debian/copyright (версия сопровождающего):
$ vim debhello-0.0/debian/copyright ... hack, hack, hack, ... $ cat debhello-0.0/debian/copyright Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ Upstream-Name: debhello Upstream-Contact: Osamu Aoki <[email protected]> Source: https://salsa.debian.org/debian/debmake-doc Files: * Copyright: 2015-2021 Osamu Aoki <[email protected]> License: Expat Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: . The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. . THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
В каталоге debian/ имеются и другие шаблонные файлы. Их также следует обновить.
Шаблонные файлы в debian/. (v=0.0):
$ tree debhello-0.0/debian debhello-0.0/debian ├── README.Debian ├── changelog ├── control ├── copyright ├── patches │ └── series ├── rules ├── source │ ├── control │ ├── format │ ├── local-options │ ├── options │ └── patch-header ├── tests │ └── control ├── upstream │ └── metadata └── watch 4 directories, 14 files
Tip | |
---|---|
Configuration files used by the dh_* commands from the debhelper package usually treat # as the start of a comment line. |
В данном дереве исходного кода вы можете создать неродной пакет Debian с помощью команды debuild или эквивалентных ей команд (см. Section 4.4, “Что такое debuild?”). Вывод команды очень подробен, выполняемые действия объясняются в нём следующим образом.
$ cd debhello-0.0 $ debuild dpkg-buildpackage -us -uc -ui -i -i ... debian/rules clean dh clean ... debian/rules binary dh binary dh_update_autotools_config dh_autoreconf dh_auto_configure install -d /path/to/debhello-0.0/debian/.debhelper/generated/_source/... dh_auto_build make -j12 "INSTALL=install --strip-program=true" make[1]: Entering directory '/path/to/debhello-0.0' # CFLAGS=-g -O2 # -ffile-prefix-map=/home/osamu/src/public/debmake-doc/debmake-doc/examp ... Now running lintian -i -I --show-overrides debhello_0.0-1_amd64.changes ... ... N: Renamed from: binary-without-manpage N: W: debhello: readme-debian-contains-debmake-template N: ...
You can verify that CFLAGS is updated properly with -Wall and -pedantic by the DEB_CFLAGS_MAINT_APPEND variable.
The manpage should be added to the package as reported by the lintian package, as shown in later examples (see Chapter 8, Дополнительные примеры). Let’s move on for now.
Проверим результат сборки.
Файлы debhello версии 0.0, созданные с помощью команды debuild:
$ cd .. $ tree -FL 1 . ├── debhello-0.0/ ├── debhello-0.0.tar.gz ├── debhello-dbgsym_0.0-1_amd64.deb ├── debhello_0.0-1.debian.tar.xz ├── debhello_0.0-1.dsc ├── debhello_0.0-1_amd64.build ├── debhello_0.0-1_amd64.buildinfo ├── debhello_0.0-1_amd64.changes ├── debhello_0.0-1_amd64.deb └── debhello_0.0.orig.tar.gz -> debhello-0.0.tar.gz 1 directory, 9 files
Вы видите все созданные файлы.
debhello_0.0-1.debian.tar.xz содержит изменения Debian, внесённые в исходный код основной ветки разработки. Содержимое этого файла приведено ниже.
Содержимое архива debhello_0.0-1.debian.tar.xz:
$ tar -tzf debhello-0.0.tar.gz debhello-0.0/ debhello-0.0/src/ debhello-0.0/src/hello.c debhello-0.0/LICENSE debhello-0.0/Makefile $ tar --xz -tf debhello_0.0-1.debian.tar.xz debian/ debian/README.Debian debian/changelog debian/control debian/copyright debian/patches/ debian/patches/series debian/rules debian/source/ debian/source/control debian/source/format debian/source/options debian/source/patch-header debian/tests/ debian/tests/control debian/upstream/ debian/upstream/metadata debian/watch
The debhello_0.0-1_amd64.deb contains the binary files to be installed to the target system.
The debhello-debsym_0.0-1_amd64.deb contains the debug symbol files to be installed to the target system..
The binary package contents of all binary packages:
$ dpkg -c debhello-dbgsym_0.0-1_amd64.deb drwxr-xr-x root/root ... ./ drwxr-xr-x root/root ... ./usr/ drwxr-xr-x root/root ... ./usr/lib/ drwxr-xr-x root/root ... ./usr/lib/debug/ drwxr-xr-x root/root ... ./usr/lib/debug/.build-id/ drwxr-xr-x root/root ... ./usr/lib/debug/.build-id/be/ -rw-r--r-- root/root ... ./usr/lib/debug/.build-id/be/11292eded3fc22396a0b62... drwxr-xr-x root/root ... ./usr/share/ drwxr-xr-x root/root ... ./usr/share/doc/ lrwxrwxrwx root/root ... ./usr/share/doc/debhello-dbgsym -> debhello $ dpkg -c debhello_0.0-1_amd64.deb drwxr-xr-x root/root ... ./ drwxr-xr-x root/root ... ./usr/ drwxr-xr-x root/root ... ./usr/bin/ -rwxr-xr-x root/root ... ./usr/bin/hello drwxr-xr-x root/root ... ./usr/share/ drwxr-xr-x root/root ... ./usr/share/doc/ drwxr-xr-x root/root ... ./usr/share/doc/debhello/ -rw-r--r-- root/root ... ./usr/share/doc/debhello/README.Debian -rw-r--r-- root/root ... ./usr/share/doc/debhello/changelog.Debian.gz -rw-r--r-- root/root ... ./usr/share/doc/debhello/copyright
The generated dependency list of all binary packages.
The generated dependency list of all binary packages (v=0.0):
$ dpkg -f debhello-dbgsym_0.0-1_amd64.deb pre-depends \ depends recommends conflicts breaks Depends: debhello (= 0.0-1) $ dpkg -f debhello_0.0-1_amd64.deb pre-depends \ depends recommends conflicts breaks Depends: libc6 (>= 2.2.5)
Caution | |
---|---|
Many more details need to be addressed before uploading the package to the Debian archive. |
Note | |
---|---|
Если вы пропустили ручную настройку автоматически созданных командой debmake файлов настройки, то у созданного двоичного пакета может отсутствовать понятное другим описание пакета, а также пакет может несоответствовать некоторым требованиям политики. Такой сырой пакет вполне хорошо работает, если передать его команде dpkg, и может оказаться вполне достаточным для его локального развёртывания. |
В примере выше при создании пакета Debian исходный код основной ветки разработки не был изменён.
Альтернативный подход состоит в том, что сопровождающий изменяет исходный код основной ветки, меняя файл Makefile так, чтобы значением $(prefix) было /usr.
Фактически процесс создания пакета в этом случае совпадает с тем, что описан выше в Section 4.7, “Шаг 3: изменение шаблонных файлов” за исключением двух моментов:
Store the maintainer modifications to the upstream source as the corresponding patch files in the debian/patches/ directory and list their filenames in the debian/patches/series file as indicated in Section 5.10, “debian/patches/*”. There are several ways to generate patch files. A few examples are given in these sections:
В изменениях, внесённых сопровождающим в файл debian/rules, отсутствует цель override_dh_auto_install, то есть:
debian/rules (альтернативная версия сопровождающего):
$ cd debhello-0.0 $ vim debian/rules ... hack, hack, hack, ... $ cat debian/rules #!/usr/bin/make -f export DH_VERBOSE = 1 export DEB_BUILD_MAINT_OPTIONS = hardening=+all export DEB_CFLAGS_MAINT_APPEND = -Wall -pedantic export DEB_LDFLAGS_MAINT_APPEND = -Wl,--as-needed %: dh $@
This alternative approach to Debian packaging using a series of patch files may be less robust for future upstream changes but more flexible coping with the difficult upstream source. (See Section 7.13, “Формат исходного кода 3.0”.)
Note | |
---|---|
Для этого конкретного случая приведённый выше Section 4.7, “Шаг 3: изменение шаблонных файлов”, использующий файл debian/rules, является более подходящим. Тем не менее, продолжим работу с текущим подходом с целью обучения. |
Tip | |
---|---|
В случае более сложных пакетов требуется использовать оба подхода, и Section 4.7, “Шаг 3: изменение шаблонных файлов”, и Section 4.9, “Шаг 3 (альтернативный): изменение исходного кода основной ветки разработки”. |
Ниже приводится пример создания 000-prefix-usr.patch с помощью команды diff.
$ cp -a debhello-0.0 debhello-0.0.orig $ vim debhello-0.0/Makefile ... hack, hack, hack, ... $ diff -Nru debhello-0.0.orig debhello-0.0 >000-prefix-usr.patch $ cat 000-prefix-usr.patch diff -Nru debhello-0.0.orig/Makefile debhello-0.0/Makefile --- debhello-0.0.orig/Makefile 2021-07-02 16:26:38.734722687 +0900 +++ debhello-0.0/Makefile 2021-07-02 16:26:38.802723496 +0900 @@ -1,4 +1,4 @@ -prefix = /usr/local +prefix = /usr all: src/hello $ rm -rf debhello-0.0 $ mv -f debhello-0.0.orig debhello-0.0
Заметьте, что дерево исходного кода основной ветки разработки восстанавливается к изначальному состоянию, а файл заплаты доступен как 000-prefix-usr.patch.
Этот 000-prefix-usr.patch редактируется так, чтобы он соответствовал DEP-3, а также перемещается в соответствующий каталог, как это указано ниже.
$ cd debhello-0.0 $ echo '000-prefix-usr.patch' >debian/patches/series $ vim ../000-prefix-usr.patch ... hack, hack, hack, ... $ mv -f ../000-prefix-usr.patch debian/patches/000-prefix-usr.patch $ cat debian/patches/000-prefix-usr.patch From: Osamu Aoki <[email protected]> Description: set prefix=/usr patch diff -Nru debhello-0.0.orig/Makefile debhello-0.0/Makefile --- debhello-0.0.orig/Makefile +++ debhello-0.0/Makefile @@ -1,4 +1,4 @@ -prefix = /usr/local +prefix = /usr all: src/hello
Ниже приводится пример создания 000-prefix-usr.patch с помощью команды dquilt, которая является простой обёрткой для программы quilt. Синтаксис и функции команды dquilt совпадают с синтаксисом и функциями команды quilt(1) за тем лишь исключением, что заплата сохраняется в каталог debian/patches/.
$ cd debhello-0.0 $ dquilt new 000-prefix-usr.patch Patch debian/patches/000-prefix-usr.patch is now on top $ dquilt add Makefile File Makefile added to patch debian/patches/000-prefix-usr.patch ... hack, hack, hack, ... $ head -1 Makefile prefix = /usr $ dquilt refresh Refreshed patch debian/patches/000-prefix-usr.patch $ dquilt header -e --dep3 ... edit the DEP-3 patch header with editor $ tree -a . ├── .pc │ ├── .quilt_patches │ ├── .quilt_series │ ├── .version │ ├── 000-prefix-usr.patch │ │ ├── .timestamp │ │ └── Makefile │ └── applied-patches ├── LICENSE ├── Makefile ├── debian │ ├── README.Debian │ ├── changelog │ ├── control │ ├── copyright │ ├── patches │ │ ├── 000-prefix-usr.patch │ │ └── series │ ├── rules │ ├── source │ │ ├── control │ │ ├── format │ │ ├── local-options │ │ ├── options │ │ └── patch-header │ ├── tests │ │ └── control │ ├── upstream │ │ └── metadata │ └── watch └── src └── hello.c 8 directories, 24 files $ cat debian/patches/series 000-prefix-usr.patch $ cat debian/patches/000-prefix-usr.patch Description: set prefix=/usr patch Author: Osamu Aoki <[email protected]> Index: debhello-0.0/Makefile =================================================================== --- debhello-0.0.orig/Makefile +++ debhello-0.0/Makefile @@ -1,4 +1,4 @@ -prefix = /usr/local +prefix = /usr all: src/hello
Here, Makefile in the upstream source tree doesn’t need to be restored to the original state. The dpkg-source command invoked by the Debian packaging procedure in Section 4.8, “Шаг 4: сборка пакета с помощью debuild”, understands the patch application state recorded by the dquilt program in the .pc/ directory. As long as all the changes are committed by the dquilt command, the Debian source package can be built from the modified source tree.
Note | |
---|---|
If the .pc/ directory is missing, the dpkg-source command assumes that no patch was applied. That’s why the more primitive patch generation methods like in Section 4.9.1, “Создание заплаты с помощью diff -u” without generating the .pc/ directory require the upstream source tree to be restored. |
Ниже приводится пример создания 000-prefix-usr.patch с помощью команды «dpkg-source --commit».
Отредактируем исходный код основной ветки разработки.
$ cd debhello-0.0 $ vim Makefile ... hack, hack, hack, ... $ head -n1 Makefile prefix = /usr
Сохраним изменения в файл заплаты.
$ dpkg-source --commit . 000-prefix-usr.patch ... editor to edit the DEP-3 patch header ...
Посмотрим результат.
$ cat debian/patches/series 000-prefix-usr.patch $ cat debian/patches/000-prefix-usr.patch Description: set prefix=/usr patch Author: Osamu Aoki <[email protected]> Index: debhello-0.0/Makefile --- debhello-0.0.orig/Makefile +++ debhello-0.0/Makefile @@ -1,4 +1,4 @@ -prefix = /usr/local +prefix = /usr all: src/hello $ tree -a . ├── .pc │ ├── .quilt_patches │ ├── .quilt_series │ ├── .version │ ├── 000-prefix-usr.patch │ │ ├── .timestamp │ │ └── Makefile │ └── applied-patches ├── LICENSE ├── Makefile ├── debian │ ├── README.Debian │ ├── changelog │ ├── control │ ├── copyright │ ├── patches │ │ ├── 000-prefix-usr.patch │ │ └── series │ ├── rules │ ├── source │ │ ├── control │ │ ├── format │ │ ├── local-options │ │ ├── options │ │ └── patch-header │ ├── tests │ │ └── control │ ├── upstream │ │ └── metadata │ └── watch └── src └── hello.c 8 directories, 24 files
Итак, команда dpkg-source выполняет в точности то же, что и было выполнено командой dquilt в Section 4.9.2, “Создание заплаты с помощью dquilt”.
[9] This is a cliché to force a read-only relocation link for the hardening and to prevent the lintian warning “W: debhello: hardening-no-relro usr/bin/hello”. This is not really needed for this example but should be harmless. The lintian tool seems to produce a false positive warning for this case which has no linked library.
[10] This is a cliché to prevent overlinking for the complex library dependency case such as Gnome programs. This is not really needed for this simple example but should be harmless.