Capítulo 5. Empacotamento simples

# Capítulo 5. Empacotamento simples

Existe um velho ditado Latino que diz: “Longum iter est per praecepta, breve et efficax per exempla” (“É um longo caminho pelas regras, mas curto e eficiente com exemplos”).

## 5.1. Empacotar o tarball

Aqui está um exemplo de criar um pacote Debian simples a partir duma fonte C simples usando o Makefile como seu sistema de compilação.

Let’s assume this upstream tarball to be debhello-0.0.tar.xz.

Este tipo de fonte destina-se a ser instalado como ficheiro não-sistema como:

Bases para a instalação a partir do tarball do autor.

    [base_dir] $ tar --xz -xmf debhello-0.0.tar.xz
    [base_dir] $ cd debhello-0.0
    [debhello-0.0] $ make
    [debhello-0.0] $ make install

O empacotamento Debian requer alterar este processo “make install” para instalar ficheiros na localização imagem do sistema alvo em vez de na localização normal sob /usr/local.

| Nota
Exemplos de criar um pacote Debian a partir de outros sistemas de compilação complicados estão descritos em “Capítulo 14, Mais Exemplos”.

## 5.2. O grande panorama

The big picture for building a single non-native Debian package from the upstream tarball debhello-0.0.tar.xz can be summarized as:

- The maintainer obtains the upstream tarball debhello-0.0.tar.xz and untars its contents to the debhello-0.0 directory.

- O comando debmake debianiza a árvore fonte do autor ao adicionar ficheiros modelo apenas no directório debian.

  - The debhello_0.0.orig.tar.xz symlink is created pointing to the debhello-0.0.tar.xz file.
  - O maintainer personaliza os ficheiros modelo.

- O comando debuild compila o pacote binário a partir da árvore fonte debianizada.

  - É criado debhello-0.0-1.debian.tar.xz contendo o directório debian.

O grande panorama de compilação de pacote.

    [base_dir] $ tar --xz -xmf debhello-0.0.tar.xz
    [base_dir] $ cd debhello-0.0
    [debhello-0.0] $ debmake
    I: debmake (version: 5.1.4)
    I: Copyright © 2014-2026 Osamu Aoki <osamu@debian.org>
       ...
    [debhello-0.0] $ ... manual customization of debian/* files
    [debhello-0.0] $ debuild
       ...

| Dica
O comando debuild neste e nos exemplos seguintes pode ser substituído por comandos equivalentes tais como o comando sbuild.

| Dica
If the upstream tarball in the .tar.xz format is available, use it instead of the one in the .tar.gz and .tar.bz2 formats. The xz compression format offers the better compression than the gzip and bzip2 compressions.

## 5.3. O que é debmake?

| Nota
As atividades de empacotamento actuais são muitas vezes executadas manualmente sem se usar o debmake enquanto se referencia apenas pacotes existentes semelhantes e o “Manual de Política Debian”.

O comando debmake é o script de ajuda para o empacotamento Debian. (“Capítulo 15, manual do debmake(1)”)

- Cria bons ficheiros modelo para os pacotes Debian.
- Ele sempre define a maioria dos estados de opção e valores óbvios para predefinições razoáveis.
- Ele gera o tarball do autor e o seu link simbólico necessário se estes estiverem em falta.
- Ele não sobrescreve os ficheiros de configuração existentes no directório debian/.
- Ele suporta o pacote multiarch.
- It provides short extracted license texts as debian/copyright using licensecheck to help license review.

Estas funcionalidades tornam o empacotamento Debian com debmake simples e moderno.

Em retrospetiva, Eu criei o debmake para simplificar esta documentação. Eu considero o debmake sendo mais ou menos um gerador de sessão de demonstração para objectivos de tutorial.

O comando debmake não é o único script ajudante para criar um pacote Debian. Se você está interessado em ferramentas de ajuda de empacotamento alternativas, por favor veja:

- Debian wiki: “AutomaticPackagingTools”— Comparação extensiva de scripts de ajuda no empacotamento
- Debian wiki: “CopyrightReviewTools”— Comparação extensiva de scripts de ajuda de revisão de copyright

## 5.4. O que é debuild?

Aqui está um sumário de comandos semelhantes ao comando debuild.

- O ficheiro debian/rules define como o pacote binário Debian é compilado.

- O comando dpkg-buildpackage é o comando oficial para compilar o pacote binário Debian. Para compilação binária normal, ele executa aproximadamente:

  - “dpkg-source --before-build” (aplica as patches Debian, a menos que estejam já aplicadas)
  - “fakeroot debian/rules clean”
  - “dpkg-source --build” (compila o pacote fonte Debian)
  - “fakeroot debian/rules build”
  - “fakeroot debian/rules binary”
  - “dpkg-genbuildinfo” (gera um ficheiro *.buildinfo)
  - “dpkg-genchanges” (gera um ficheiro *.changes)
  - “fakeroot debian/rules clean”
  - “dpkg-source --after-build” (retira as patches Debian, se elas foram aplicadas durante --before-build)

  - “debsign” (assina os ficheiros *.dsc e *.changes)

    - Se você seguiu “Secção 4.6, “Configuração do devscripts”” para definir as opções -us e -uc, este passo é saltado e você tem de correr o comando debsign manualmente.
- O comando debuild é um script invólucro do comando dpkg-buildpackage para compilar o pacote binário Debian sob as variáveis de ambiente apropriadas.
- O comando sbuild é um script invólucro para compilar o pacote binário Debian sob o ambiente chroot apropriado e com as variáveis de ambiente apropriadas.

| Nota
Veja dpkg-buildpackage(1) para detalhes exactos.

## 5.5. Passo 1: Obter a fonte do autor

Vamos obter a fonte do autor.

Download debhello-0.0.tar.xz.

    [base_dir] $ wget http://www.example.org/download/debhello-0.0.tar.xz
     ...
    [base_dir] $ tar --xz -xmf debhello-0.0.tar.xz
    [base_dir] $ tree
    .
    ├── debhello-0.0
    │   ├── Makefile
    │   ├── README.md
    │   └── src
    │       └── hello.c
    └── debhello-0.0.tar.xz

    3 directories, 4 files

Aqui, a fonte C hello.c é uma muito simples.

hello.c.

    [base_dir] $ cat debhello-0.0/src/hello.c
    #include <stdio.h>
    int
    main()
    {
            printf("Hello, world!\n");
            return 0;
    }

Aqui, o Makefile suporta “GNU Coding Standards” e “FHS”. Notavelmente:

- compila binários honrando $(CPPFLAGS), $(CFLAGS), $(LDFLAGS), etc.
- instala ficheiros com $(DESTDIR) definida para a imagem de sistema alvo
- instala ficheiros com $(prefix) definido, os quais podem ser sobrepostos para ser /usr

Makefile.

    [base_dir] $ 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

| Nota
O echo da variável $(CFLAGS) é usado para verificar a definição apropriada da bandeira de compilação no exemplo seguinte:

## 5.6. Passo 2: Gerar ficheiros modelo com o debmake

Os resultados do comando debmake é muito detalhado e explica o que faz como se segue.

The output from the debmake command with -x1 option.

    [base_dir] $ cd debhello-0.0
    [debhello-0.0] $ debmake -x1
    I: debmake (version: 5.1.4)
    I: Copyright © 2014-2026 Osamu Aoki <osamu@debian.org>
    I: [debhello-0.0] $ cd ..
    I: Non-native Debian package pkg="debhello", ver="0.0", rev="1" method="dir_d...
    I: already in the package-version form: "debhello-0.0"
    I: [base_dir] $ ln -sf debhello-0.0.tar.xz debhello_0.0.orig.tar.xz
    I: [base_dir] $ cd debhello-0.0
    I: parsing option -b ""
    I: binary package=debhello Type=bin / Arch=any M-A=foreign
    I: build_type = make
    I: ext_type = c                       1 files
    I: ext_type = md                      1 files
    I: creating debian/* files with "-x 1" option
    I: [debhello-0.0] $ licensecheck --recursive --copyright --deb-machine  . > d...
    I: creating debian/copyright by licensecheck.
    I: creating debian/control from control.py
    I: creating debian/control by control.py
    I: creating debian/changelog from extra0_changelog
    I: creating debian/rules from extra0_rules
    I: creating debian/source/format from extra0source_format
    I: creating debian/README.Debian from extra1_README.Debian
    I: creating debian/README.source from extra1_README.source
    I: creating debian/clean from extra1_clean
    I: creating debian/dirs from extra1_dirs
    I: creating debian/docs from extra1_docs
    I: creating debian/examples from extra1_examples
    I: creating debian/gbp.conf from extra1_gbp.conf
    I: creating debian/links from extra1_links
    I: creating debian/manpages from extra1_manpages
    I: creating debian/salsa-ci.yml from extra1_salsa-ci.yml
    I: creating debian/watch from extra1nn_watch
    I: creating debian/tests/control from extra1tests_control
    I: creating debian/upstream/metadata from extra1upstream_metadata
    I: creating debian/patches/series from extra1patches_series
    I: creating debian/install from extra1bin_install
    I: [debhello-0.0] $ wrap-and-sort -ast
    I: debian/* may have a blank line at the top.

O comando debmake gera todos estes ficheiros modelo baseado nas opções da linha de comandos. Como nenhuma opção é especificada, o comando debmake escolhe valores predefinidos razoáveis por si:

- O nome do pacote fonte: debhello
- A versão do autor: 0.0
- O nome do pacote binário: debhello
- A revisão Debian: 1
- O tipo de pacote: bin (o pacote binário executável ELF)
- A opção -x: -x1 (sem suportes para simplicidade de script de maintainer)

| Nota
Here, the debmake command is invoked with the -x1 option to keep this tutorial simple. Use of default -x2 or more extensive -x3 option is highly recommended.

Vamos inspecionar os ficheiros modelo gerados.

A árvore fonte após a execução básica do debmake.

    [debhello-0.0] $ cd ..
    [base_dir] $ tree
    .
    ├── debhello-0.0
    │   ├── Makefile
    │   ├── README.md
    │   ├── debian
    │   │   ├── README.Debian
    │   │   ├── README.source
    │   │   ├── changelog
    │   │   ├── clean
    │   │   ├── control
    │   │   ├── copyright
    │   │   ├── dirs
    │   │   ├── docs
    │   │   ├── examples
    │   │   ├── gbp.conf
    │   │   ├── install
    │   │   ├── links
    │   │   ├── manpages
    │   │   ├── patches
    │   │   │   └── series
    │   │   ├── rules
    │   │   ├── salsa-ci.yml
    │   │   ├── source
    │   │   │   └── format
    │   │   ├── tests
    │   │   │   └── control
    │   │   ├── upstream
    │   │   │   └── metadata
    │   │   └── watch
    │   └── src
    │       └── hello.c
    ├── debhello-0.0.tar.xz
    └── debhello_0.0.orig.tar.xz -> debhello-0.0.tar.xz

    8 directories, 25 files

O ficheiro debian/rules é o script de compilação fornecido pelo maintainer do pacote. Aqui está o seu ficheiro modelo gerado pelo comando debmake.

debian/rules (ficheiro modelo):

    [base_dir] $ cd debhello-0.0
    [debhello-0.0] $ cat debian/rules
    #!/usr/bin/make -f
    # You must remove unused comment lines for the released package.
    # See debhelper(7) (un-comment to enable)
    # This is an autogenerated template for debian/rules.
    #
    # Output every command that modifies files on the build system.
    #export DH_VERBOSE = 1
    #
    # Copy some variable definitions from pkg-info.mk and vendor.mk
    # under /usr/share/dpkg/ to here if they are useful.
    #
    # See FEATURE AREAS/ENVIRONMENT in dpkg-buildflags(1)
    # Apply all hardening options
    #export DEB_BUILD_MAINT_OPTIONS = hardening=+all
    # Package maintainers to append CFLAGS
    #export DEB_CFLAGS_MAINT_APPEND  = -Wall -pedantic
    # Package maintainers to append LDFLAGS
    #export DEB_LDFLAGS_MAINT_APPEND = -Wl,-O1
    #
    # With debhelper version 9 or newer, the dh command exports
    # all buildflags.  So there is no need to include the
    # /usr/share/dpkg/buildflags.mk file here if compat is 9 or newer.
    #
    # These are rarely used code. (START)
    #
    # The following include for *.mk magically sets miscellaneous
    # variables while honoring existing values of pertinent
    # environment variables:
    #
    # Architecture-related variables such as DEB_TARGET_MULTIARCH:
    #include /usr/share/dpkg/architecture.mk
    # Vendor-related variables such as DEB_VENDOR:
    #include /usr/share/dpkg/vendor.mk
    # Package-related variables such as DEB_DISTRIBUTION
    #include /usr/share/dpkg/pkg-info.mk
    #
    # You may alternatively set them susing a simple script such as:
    # DEB_VENDOR ?= $(shell dpkg-vendor --query  Vendor)
    #
    # These are rarely used code. (END)
    #

    ### main packaging script based on post dh7 syntax
    %:
            dh $@

    # debmake generated override targets
    # Use "make prefix=/usr" (override prefix=/usr/local in Makefile)
    #override_dh_auto_install:
    #       dh_auto_install -- prefix=/usr

    # Do not install python .pyc .pyo if they exist
    #override_dh_install:
    #       dh_install --list-missing -X.pyc -X.pyo

    # Multiarch package requires library files to be installed to
    # /usr/lib/<triplet>/ .  If the build system does not support
    # $(DEB_HOST_MULTIARCH), you may need to override some targets such as
    # dh_auto_configure or dh_auto_install to use $(DEB_HOST_MULTIARCH) .

Isto é essencialmente o ficheiro debian/rules standard com o comando dh. (Existem alguns conteúdos comentados para você personalizar.)

O ficheiro debian/control fornece os meta-dados principais para o pacote Debian. Aqui está o seu ficheiro modelo gerado pelo comando debmake.

debian/control (ficheiro modelo):

    [debhello-0.0] $ cat debian/control
    Source: debhello
    Section: unknown
    Priority: optional
    Maintainer: "Osamu Aoki" <osamu@debian.org>
    Build-Depends:
     debhelper-compat (= 13),
    Standards-Version: 4.7.3
    Homepage: <insert the upstream URL, if relevant>
    Rules-Requires-Root: no
    #Vcs-Git: https://salsa.debian.org/debian/debhello.git
    #Vcs-Browser: https://salsa.debian.org/debian/<project_site>

    Package: debhello
    Section: unknown
    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.
     .
     ===== This comes from the unmodified template file =====
     .
     Please edit this template file (debian/control) and other package files
     (debian/*) to make them meet all the requirements of the Debian Policy
     before uploading this package to the Debian archive.
     .
     See
      * https://www.debian.org/doc/manuals/developers-reference/best-pkging-pract...
      * https://www.debian.org/doc/manuals/debmake-doc/ch05.en.html#control
     .
     The synopsis description at the top should be about 60 characters and
     written as a phrase.  No extra capital letters or a final period.  No
     articles — "a", "an", or "the".
     .
     The package description for general-purpose applications should be
     written for a less technical user.  This means that we should avoid
     jargon.  GNOME or KDE is fine but GTK+ is probably not.
     .
     Use the canonical forms of words:
      * Use X Window System, X11, or X; not X Windows, X-Windows, or X Window.
      * Use GTK+, not GTK or gtk.
      * Use GNOME, not Gnome.
      * Use PostScript, not Postscript or postscript.

| Atenção
Se você deixar “Section: unknown” no ficheiro modelo debian/control não modificado, o erro do lintian pode fazer a compilação falhar.

Como este é o pacote executável binário ELF, o comando debmake define “Architecture: any” e “Multi-Arch: foreign”. Também, define parâmetros requeridos substvar como “Depends: ${shlibs:Depends}, ${misc:Depends}”. Estes estão explicados em “Capítulo 6, Bases para empacotamento”.

| Nota
Por favor note que este ficheiro debian/control usa o estilo RFC-822 como documentado em “5.2 Ficheiros de controle de pacote fonte — debian/control” do “manual de Política Debian”. O uso da linha vazia e do espaço inicial tem significado.

The debian/copyright file provides the copyright summary data of the Debian package using the licensecheck command.

debian/copyright (ficheiro modelo):

    [debhello-0.0] $ cat debian/copyright
    Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
    Upstream-Name: FIXME
    Upstream-Contact: FIXME
    Source: FIXME
    Disclaimer: Autogenerated by licensecheck

    Files: ./Makefile
     ./README.md
     ./src/hello.c
    Copyright: NONE
    License: UNKNOWN
     FIXME

## 5.7. Passo 3: Modificação dos ficheiros modelo

É requerida alguma modificação manual para fazer o pacote Debian apropriado como um maintainer.

De modo a instalar ficheiros como parte dos ficheiros do sistema, o valor $(prefix) de /usr/local em Makefile deve ser sobreposto para ser /usr. Isto pode ser acomodado no ficheiro debian/rules com o alvo override_dh_auto_install a definir “prefix=/usr”.

debian/rules (versão do maintainer):

    [base_dir] $ cd debhello-0.0
    [debhello-0.0] $ vim debian/rules
     ... hack, hack, hack, ...
    [debhello-0.0] $ 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 $@

    override_dh_auto_install:
            dh_auto_install -- prefix=/usr

Exportar a variável de ambiente DH_VERBOSE no ficheiro debian/rules como em cima força a ferramenta debhelper a fazer um relatório de compilação afinado.

Exportar DEB_BUILD_MAINT_OPTION como em cima define as opções de endurecimento descritas em “AREAS DE FUNCIONALIDADE/AMBIENTE” em dpkg-buildflags(1). [9]

Exportar DEB_CFLAGS_MAINT_APPEND como em cima força o compilador C a emitir todos os avisos.

Exportar DEB_LDFLAGS_MAINT_APPEND como em cima força o vinculador a vincular apenas quando a biblioteca é mesmo necessária. [10]

O comando dh_auto_install para o sistema de compilação baseado no Makefile essencialmente corre “$(MAKE) install DESTDIR=debian/debhello”. A criação deste alvo override_dh_auto_install muda o seu comportamento para “$(MAKE) install DESTDIR=debian/debhello prefix=/usr”.

Aqui estão as versões de maintainer dos ficheiros debian/control e debian/copyright.

debian/control (versão de maintainer):

    [debhello-0.0] $ vim debian/control
     ... hack, hack, hack, ...
    [debhello-0.0] $ cat debian/control
    Source: debhello
    Section: devel
    Priority: optional
    Maintainer: Osamu Aoki <osamu@debian.org>
    Build-Depends:
     debhelper-compat (= 13),
    Standards-Version: 4.7.3
    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 (versão de maintainer):

    [debhello-0.0] $ vim debian/copyright
     ... hack, hack, hack, ...
    [debhello-0.0] $ cat debian/copyright
    Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
    Upstream-Name: debhello
    Upstream-Contact: Osamu Aoki <osamu@debian.org>
    Source: https://salsa.debian.org/debian/debmake-doc

    Files:     *
    Copyright: 2015-2021 Osamu Aoki <osamu@debian.org>
    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.

Vamos remover os ficheiros modelo não usados e editar os restantes ficheiros modelo:

- debian/README.source
- debian/patches/series (Nenhuma patch do autor)
- clean
- dirs
- install
- links

Ficheiros modelo sob debian/. (v=0.0):

    [debhello-0.0] $ rm -f debian/clean debian/dirs debian/install debian/links
    [debhello-0.0] $ rm -f debian/README.source debian/source/*.ex
    [debhello-0.0] $ rm -rf debian/patches
    [debhello-0.0] $ tree -F debian
    debian/
    ├── README.Debian
    ├── changelog
    ├── control
    ├── copyright
    ├── docs
    ├── examples
    ├── gbp.conf
    ├── manpages
    ├── rules*
    ├── salsa-ci.yml
    ├── source/
    │   └── format
    ├── tests/
    │   └── control
    ├── upstream/
    │   └── metadata
    └── watch

    4 directories, 14 files

| Dica
Os ficheiros de configuração usados pelos comandos dh_* do pacote debhelper geralmente tratam # como o inicio de uma linha comentário.

## 5.8. Passo 4: Compilar pacote com debuild

Você pode criar um pacote Debian não-nativo usando o comando debuild ou os seus equivalentes (veja “Secção 5.4, “O que é debuild?””) nesta árvore fonte. O texto resultante do comando é muito detalhado e explica o que ele faz como se segue.

Compilando pacote com debuild.

    [base_dir] $ cd debhello-0.0
    [debhello-0.0] $ debuild
     dpkg-buildpackage -us -uc -ui -i
    dpkg-buildpackage: info: source package debhello
    dpkg-buildpackage: info: source version 0.0-1
    dpkg-buildpackage: info: source distribution unstable
    dpkg-buildpackage: info: source changed by Osamu Aoki <osamu@debian.org>
     dpkg-source -i --before-build .
    dpkg-buildpackage: info: host architecture amd64
     debian/rules clean
    dh clean
       dh_auto_clean
            make -j12 distclean
     ...
     debian/rules binary
    dh binary
       dh_update_autotools_config
       dh_autoreconf
       dh_auto_configure
       dh_auto_build
            make -j12 INSTALL="install --strip-program=true"
    make[1]: Entering directory '/path/to/base_dir/debhello-0.0'
    # CFLAGS=-g -O2 -Werror=implicit-function-declaration
     ...
    Finished running lintian.

Você pode verificar que CFLAGS é atualizado apropriadamente com -Wall e -pedantic pela variável DEB_CFLAGS_MAINT_APPEND.

O manual deve ser adicionado ao pacote como reportado pelo pacote lintian, como mostrado em exemplos posteriores (veja “Capítulo 14, Mais Exemplos”). Vamos seguir por agora.

Vamos inspecionar o resultado.

Os ficheiros gerados de debhello versão 0.0 pelo comando debuild:

    [debhello-0.0] $ cd ..
    [base_dir] $ tree -FL 1
    ./
    ├── debhello-0.0/
    ├── debhello-0.0.tar.xz
    ├── 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.xz -> debhello-0.0.tar.xz

    2 directories, 9 files

Você vê todos os ficheiros gerados.

- The debhello_0.0.orig.tar.xz is a symlink to the upstream tarball.
- O debhello_0.0-1.debian.tar.xz contém os conteúdos gerados pelo maintainer.
- O debhello_0.0-1.dsc é o ficheiro de meta-dados para o pacote fonte Debian.
- O debhello_0.0-1_amd64.deb é o pacote binário Debian.
- O debhello-dbgsym_0.0-1_amd64.deb é o pacote binário de símbolos de depuração Debian. Veja “Secção 10.21, “Pacote -dbgsym””.
- O ficheiro debhello_0.0-1_amd64.build é o ficheiro de relatório de compilação.
- O ficheiro debhello_0.0-1_amd64.buildinfo é o ficheiro de meta-dados gerado pelo dpkg-genbuildinfo(1).
- O debhello_0.0-1_amd64.changes é o ficheiro de meta-dados para o pacote binário Debian.

O debhello_0.0-1.debian.tar.xz contém as alterações Debian feitas à fonte do autor como se segue.

O conteúdo do arquivo comprimido de debhello_0.0-1.debian.tar.xz:

    [base_dir] $ tar --xz -tf debhello-0.0.tar.xz
    debhello-0.0/
    debhello-0.0/src/
    debhello-0.0/src/hello.c
    debhello-0.0/Makefile
    debhello-0.0/README.md
    [base_dir] $ tar --xz -tf debhello_0.0-1.debian.tar.xz
    debian/
    debian/README.Debian
    debian/changelog
    debian/control
    debian/copyright
    debian/docs
    debian/examples
    debian/gbp.conf
    debian/manpages
    debian/rules
    debian/salsa-ci.yml
    debian/source/
    debian/source/format
    debian/tests/
    debian/tests/control
    debian/upstream/
    debian/upstream/metadata
    debian/watch

O debhello_0.0-1_amd64.deb contém os ficheiros binário a serem instalados no sistema alvo.

O debhello-dbgsym_0.0-1_amd64.deb contém os ficheiros de símbolos de depuração a serem instalados no sistema alvo.

O conteúdo de pacote binário de todos os pacotes binário:

    [base_dir] $ 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/93/
    -rw-r--r-- root/root ...  ./usr/lib/debug/.build-id/93/155268941cd6daee505048...
    drwxr-xr-x root/root ...  ./usr/share/
    drwxr-xr-x root/root ...  ./usr/share/doc/
    lrwxrwxrwx root/root ...  ./usr/share/doc/debhello-dbgsym -> debhello
    [base_dir] $ 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

A lista de dependências gerada de todos os pacotes binário.

A lista de dependências gerada de todos os pacotes binários (v=0.0):

    [debhello-0.0] $ dpkg -f debhello-dbgsym_0.0-1_amd64.deb pre-depends \
                depends recommends conflicts breaks
    Depends: debhello (= 0.0-1)
    [debhello-0.0] $ dpkg -f debhello_0.0-1_amd64.deb pre-depends \
                depends recommends conflicts breaks
    Depends: libc6 (>= 2.34)

| Cuidado
Muitos mais detalhes precisam ser observados antes de se enviar o pacote para o arquivo Debian.

| Nota
Se forem saltados ajustes manuais nos ficheiros de configuração auto-gerados pelo comando debmake, o pacote binário gerado pode ficar com falta duma descrição de pacote significativa e alguns dos requerimentos de política podem ficar a faltar. Este pacote desleixado vai funcionar bem sob o comando dpkg, e pode ser suficiente bom para a sua implantação local.

## 5.9. Passo 3 (alternativos): Modificação da fonte do autor

O exemplo de cima não tocou na fonte do autor para criar o próprio pacote Debian. Uma abordagem alternativa como maintainer é modificar os ficheiros na fonte do autor. Por exemplo, o Makefile pode ser modificado para definir o valor $(prefix) para /usr.

| Nota
O “Secção 5.7, “Passo 3: Modificação dos ficheiros modelo”” em cima usando o ficheiro debian/rules é a melhor abordagem para empacotamento para este exemplo. Mas vamos continuar com estas abordagens alternativas como inclinação à experiência.

No seguinte, vamos considerar 3 variantes simples desta abordagem alternativa para gerar ficheiros debian/patches/* representando modificações à fonte do autor no formato fonte Debian “3.0 (quilt)”. Estas substituem “Secção 5.7, “Passo 3: Modificação dos ficheiros modelo”” no exemplo passo-a-passo em cima:

- “Secção 5.10, “Patch por abordagem “diff -u”””
- “Secção 5.11, “Patch por abordagem dquilt””
- “Secção 5.12, “Patch por abordagem “dpkg-source --auto-commit”””

Por favor note que o ficheiro debian/rules usado para estes exemplos não tem o alvo override_dh_auto_install como se segue:

debian/rules (versão alternativa de maintainer):

    [base_dir] $ cd debhello-0.0
    [debhello-0.0] $ vim debian/rules
     ... hack, hack, hack, ...
    [debhello-0.0] $ 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 $@

## 5.10. Patch por abordagem “diff -u”

Aqui, o ficheiro patch 000-prefix-usr.patch é criado usando o comando diff.

Patch por “diff -u”.

    [base_dir] $ cp -a debhello-0.0 debhello-0.0.orig
    [debhello-0.0] $ vim debhello-0.0/Makefile
     ... hack, hack, hack, ...
    [base_dir] $ diff -Nru debhello-0.0.orig debhello-0.0 >000-prefix-usr.patch
    [base_dir] $ cat 000-prefix-usr.patch
    diff -Nru debhello-0.0.orig/Makefile debhello-0.0/Makefile
    --- debhello-0.0.orig/Makefile  2026-02-11 09:50:54.416710230 +0000
    +++ debhello-0.0/Makefile       2026-02-11 09:50:54.498291151 +0000
    @@ -1,4 +1,4 @@
    -prefix = /usr/local
    +prefix = /usr

     all: src/hello

    [base_dir] $ rm -rf debhello-0.0
    [base_dir] $ mv -f debhello-0.0.orig debhello-0.0

Por favor note que a árvore fonte do autor é restaurada ao seu estado original após de gerar um ficheiro patch 000-prefix-usr.patch.

Este 000-prefix-usr.patch é editado para estar em conformidade com DEP-3 e movido para a localização correta como em baixo.

000-prefix-usr.patch (DEP-3):

    [debhello-0.0] $ echo '000-prefix-usr.patch' >debian/patches/series
    [debhello-0.0] $ vim ../000-prefix-usr.patch
     ... hack, hack, hack, ...
    [debhello-0.0] $ mv -f ../000-prefix-usr.patch debian/patches/000-prefix-usr....
    [debhello-0.0] $ cat debian/patches/000-prefix-usr.patch
    From: Osamu Aoki <osamu@debian.org>
    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

| Nota
Quando se gera o pacote fonte Debian por dpkg-source via dpkg-buildpackage no passo seguinte de “Secção 5.8, “Passo 4: Compilar pacote com debuild””, o comando dpkg-source assume que nenhuma patch foi aplicada à fonte do autor, pois o .pc/applied-patches está em falta.

## 5.11. Patch por abordagem dquilt

Aqui, o ficheiro patch 000-prefix-usr.patch é criado usando o comando dquilt.

dquilt é um invólucro simples do programa quilt. A sintaxe e função do comando dquilt é a mesma que do comando quilt(1), excepto para o facto que a patch gerada é guardada no directório debian/patches/.

Patch por dquilt.

    [debhello-0.0] $ dquilt new 000-prefix-usr.patch
    Patch debian/patches/000-prefix-usr.patch is now on top
    [debhello-0.0] $ dquilt add Makefile
    File Makefile added to patch debian/patches/000-prefix-usr.patch
     ... hack, hack, hack, ...
    [debhello-0.0] $ head -1 Makefile
    prefix = /usr
    [debhello-0.0] $ dquilt refresh
    Refreshed patch debian/patches/000-prefix-usr.patch
    [debhello-0.0] $ dquilt header -e --dep3
     ... edit the DEP-3 patch header with editor
    [debhello-0.0] $ tree -a
    .
    ├── .pc
    │   ├── .quilt_patches
    │   ├── .quilt_series
    │   ├── .version
    │   ├── 000-prefix-usr.patch
    │   │   ├── .timestamp
    │   │   └── Makefile
    │   └── applied-patches
    ├── Makefile
    ├── README.md
    ├── debian
    │   ├── README.Debian
    │   ├── README.source
    │   ├── changelog
    │   ├── clean
    │   ├── control
    │   ├── copyright
    │   ├── dirs
    │   ├── docs
    │   ├── examples
    │   ├── gbp.conf
    │   ├── install
    │   ├── links
    │   ├── manpages
    │   ├── patches
    │   │   ├── 000-prefix-usr.patch
    │   │   └── series
    │   ├── rules
    │   ├── salsa-ci.yml
    │   ├── source
    │   │   └── format
    │   ├── tests
    │   │   └── control
    │   ├── upstream
    │   │   └── metadata
    │   └── watch
    └── src
        └── hello.c

    9 directories, 30 files
    [debhello-0.0] $ cat debian/patches/series
    000-prefix-usr.patch
    [debhello-0.0] $ cat debian/patches/000-prefix-usr.patch
    Description: set prefix=/usr patch
    Author: Osamu Aoki <osamu@debian.org>
    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

Aqui, Makefile na árvore fonte do autor não precisa de ser restaurada para o estado original para o empacotamento.

| Nota
Quando se gera o pacote fonte Debian por dpkg-source via dpkg-buildpackage no passo seguinte de “Secção 5.8, “Passo 4: Compilar pacote com debuild””, o comando dpkg-source assume que patches foram aplicadas à fonte do autor, pois o .pc/applied-patches existe.

A árvore fonte do autor pode ser restaurada para o estado original para o empacotamento.

A árvore fonte do autor (restaurada):

    [debhello-0.0] $ dquilt pop -a
    Removing patch debian/patches/000-prefix-usr.patch
    Restoring Makefile

    No patches applied
    [debhello-0.0] $ head -1 Makefile
    prefix = /usr/local
    [debhello-0.0] $ tree -a .pc
    .pc
    ├── .quilt_patches
    ├── .quilt_series
    └── .version

    1 directory, 3 files

Aqui, Makefile é restaurado e o .pc/applied-patches está em falta.

## 5.12. Patch por abordagem “dpkg-source --auto-commit”

Aqui, o ficheiro patch não é criado neste passo mas os ficheiros fonte estão configurados para criar ficheiros debian/patches/* no passo seguinte de “Secção 5.8, “Passo 4: Compilar pacote com debuild””.

For this, debmake must be invoked without -x1 option to generate normal template files using default -x2 option, instead.

O resultado do comando debmake.

    [base_dir] $ cd debhello-0.0
    [debhello-0.0] $ debmake
    I: debmake (version: 5.1.4)
    I: Copyright © 2014-2026 Osamu Aoki <osamu@debian.org>
    ...

Vamos editar a fonte do autor.

Makefile modificado.

    [debhello-0.0] $ vim Makefile
     ... hack, hack, hack, ...
    [debhello-0.0] $ head -n1 Makefile
    prefix = /usr

Let’s edit debian/source/options:

debian/source/options for auto-commit.

    [debhello-0.0] $ mv debian/source/options.ex debian/source/options
    [debhello-0.0] $ vim debian/source/options
     ... hack, hack, hack, ...
    [debhello-0.0] $ cat debian/source/options
    # == Patch applied strategy (merge) ==
    #
    # The source outside of debian/ directory is modified by maintainer and
    # different from the upstream one:
    #   * Workflow using dpkg-source commit (commit all to VCS after dpkg-source ...
    #       https://www.debian.org/doc/manuals/debmake-doc/ch04.en.html#dpkg-sour...
    #   * Workflow described in dgit-maint-merge(7)
    #
    single-debian-patch
    auto-commit

Let’s edit debian/source/patch-header:

debian/source/patch-header for auto-commit.

    [debhello-0.0] $ mv debian/source/patch-header.ex debian/source/patch-header
    [debhello-0.0] $ vim debian/source/patch-header
     ... hack, hack, hack, ...
    [debhello-0.0] $ cat debian/source/patch-header
    Description: debian-changes
    Author: Osamu Aoki <osamu@debian.org>

Vamos remover ficheiros debian/patches/* e outros ficheiros modelo não usados

Remove ficheiros modelo não utilizados.

    [debhello-0.0] $ rm -f debian/clean debian/dirs debian/install debian/links
    [debhello-0.0] $ rm -f debian/README.source debian/*.ex debian/source/*.ex
    [debhello-0.0] $ rm -rf debian/patches
    [debhello-0.0] $ tree debian
    debian
    ├── README.Debian
    ├── changelog
    ├── control
    ├── copyright
    ├── docs
    ├── examples
    ├── gbp.conf
    ├── manpages
    ├── rules
    ├── salsa-ci.yml
    ├── source
    │   ├── format
    │   ├── options
    │   └── patch-header
    ├── tests
    │   └── control
    ├── upstream
    │   └── metadata
    └── watch

    4 directories, 16 files

Não existem ficheiros debian/patches/* no final deste passo.

| Nota
When generating the Debian source package by dpkg-source via dpkg-buildpackage in the following step of “Secção 5.8, “Passo 4: Compilar pacote com debuild””, the dpkg-source command uses options specified in debian/source/options to auto-commit modification applied to the upstream source as patches/debian-changes.

Vamos inspecionar o pacote fonte Debian gerado após o passo seguinte “Secção 5.8, “Passo 4: Compilar pacote com debuild”” e extrair os ficheiros de debhello-0.0.debian.tar.xz.

Inspecione debhello-0.0.debian.tar.xz após debuild.

    [base_dir] $ tar --xz -xvf debhello_0.0-1.debian.tar.xz
    debian/
    debian/README.Debian
    debian/changelog
    debian/control
    debian/copyright
    debian/docs
    debian/examples
    debian/gbp.conf
    debian/manpages
    debian/patches/
    debian/patches/debian-changes
    debian/patches/series
    debian/rules
    debian/salsa-ci.yml
    debian/source/
    debian/source/format
    debian/source/options
    debian/source/patch-header
    debian/tests/
    debian/tests/control
    debian/upstream/
    debian/upstream/metadata
    debian/watch

Vamos verificar os ficheiros gerados debian/patches/*.

Inspecione debian/patches/* após debuild.

    [base_dir] $ cat debian/patches/series
    debian-changes
    [base_dir] $ cat debian/patches/debian-changes
    Description: debian-changes
    Author: Osamu Aoki <osamu@debian.org>

    --- debhello-0.0.orig/Makefile
    +++ debhello-0.0/Makefile
    @@ -1,4 +1,4 @@
    -prefix = /usr/local
    +prefix = /usr

     all: src/hello

Confirma-se que o pacote fonte Debian debhello-0.0.debian.tar.xz é gerado apropriadamente com ficheiros debian/patches/* para a modificação Debian.

[9] Isto é um cliché para forçar uma ligação de re-alocação só-leitura para o endurecimento e para prevenir o aviso do lintian “W: debhello: hardening-no-relro usr/bin/hello”. Isto não é realmente preciso para este exemplo mas deve ser inofensivo. A ferramenta lintian parece produzir um aviso de falso positivo para este caso que não tem biblioteca vinculada.

[10] Isto é um cliché para prevenir a sobre-vinculação para casos de dependências complexas de biblioteca como os programas de Gnome. Isto não é realmente preciso para este exemplo simples mas deve ser inofensivo.

Capítulo 4. Configurações de Ferramenta |  | Capítulo 6. Bases para empacotamento