Capítulo 9. Mais sobre empacotamento

# Capítulo 9. Mais sobre empacotamento

Vamos explorar mais fundamentos do empacotamento Debian.

## 9.1. Personalização do pacote

Todos os dados de personalização para o pacote fonte Debian residem no directório debian/ como apresentado em “Secção 5.7, “Passo 3: Modificação dos ficheiros modelo””:

- O sistema de compilação de pacote Debian pode ser personalizado através do ficheiro debian/rules (veja “Secção 9.2, “debian/rules personalizado””).
- O caminho de instalação do pacote Debian etc. pode ser personalizado através da adição de ficheiros de configuração como pacote.install e pacote.docs no directório debian/ para os comandos dh_* do pacote debhelper (veja “Secção 6.14, “Outros ficheiros debian/*””).

Quando estes não são suficientes para fazer um bom pacote Debian, ficheiros patches -p1 de debian/patches/* são implantados para modificar a fonte do autor. Estes são aplicados uma sequência definida no ficheiro debian/patches/series antes de compilar o pacote como apresentado em “Secção 5.9, “Passo 3 (alternativos): Modificação da fonte do autor””.

Você deve endereçar a causa raiz do problema de empacotamento Debian pela maneira menos invasiva possível. Esta abordagem irá fazer o pacote gerado mais robusto para atualizações futuras.

| Nota
Se a patch que endereça a causa raiz é útil para o projeto do autor, envie-a para o maintainer do autor.

## 9.2. debian/rules personalizado

A personalização flexível do Secção 6.5, “Ficheiro debian/rules” é alcançado ao adicionar alvos override_dh_* apropriados e suas regras.

Quando uma operação especial é requerida para um certo comando dh_foo invocado pelo comando dh, a sua execução automática pode ser sobreposta ao adicionar o alvo makefile override_dh_foo no ficheiro debian/rules.

O processo de compilação pode ser personalizado via interface fornecida pelo autor como argumentos para os comandos do sistema de compilação de fonte de autor, tais como:

- configure,
- Makefile,
- “python -m build”, ou
- Build.PL.

Neste caso, você deve adicionar o alvo override_dh_auto_build com “dh_auto_build -- argumentos”. Isto assegura que os argumentos são passados para o sistema de compilação após os parâmetros predefinidos que o dh_auto_build geralmente passa.

| Dica
Evite executar os comandos crus do sistema de compilação diretamente se eles forem suportados pelo comando dh_auto_build.

Veja:

- “Secção 5.7, “Passo 3: Modificação dos ficheiros modelo”” para exemplo básico.
- “Secção 10.3, “Nota sobre sistema de compilação”” para ser lembrado do desafio que envolve o sistema de compilação subjacente.
- “Secção 10.10, “Multiarch”” para personalização multiarch.
- “Secção 10.6, “Endurecimento de compilação”” para personalização de endurecimento.

## 9.3. Variáveis para debian/rules

Algumas definições de variável úteis para personalizar o debian/rules podem ser encontradas em ficheiros sob /usr/share/dpkg/. A notar:

pkg-info.mk
  Define variáveis DEB_SOURCE, DEB_VERSION, DEB_VERSION_EPOCH_UPSTREAM, DEB_VERSION_UPSTREAM_REVISION, DEB_VERSION_UPSTREAM, e DEB_DISTRIBUTION obtidas de dpkg-parsechangelog(1). (úteis para suporte a backport etc...)
vendor.mk
  Define variáveis DEB_VENDOR e DEB_PARENT_VENDOR; e macro dpkg_vendor_derives_from obtidas de dpkg-vendor(1). (úteis para suporte a fornecedor (Debian, Ubuntu, …​).)
architecture.mk
  Veja variáveis DEB_HOST_* e DEB_BUILD_* obtidas de dpkg-architecture(1).
buildflags.mk
  Define as bandeiras de compilação CFLAGS, CPPFLAGS, CXXFLAGS, OBJCFLAGS, OBJCXXFLAGS, GCJFLAGS, FFLAGS, FCFLAGS, e LDFLAGS obtidas de dpkg-buildflags(1).

Por exemplo, você pode adicionar uma opção extra ao CONFIGURE_FLAGS para alvo linux-any de arquitecturas ao adicionar o seguinte ao debian/rules:

    DEB_HOST_ARCH_OS ?= $(shell dpkg-architecture -qDEB_HOST_ARCH_OS)
     ...
    ifeq ($(DEB_HOST_ARCH_OS),linux)
    CONFIGURE_FLAGS += --enable-wayland
    endif

Veja “Secção 10.10, “Multiarch””, dpkg-architecture(1) e dpkg-buildflags(1).

## 9.4. Novo lançamento do autor

When a new upstream release tarball debhello-newvwesion.tar.xz is released, the Debian source package can be updated by invoking commands in the old source tree as:

    [debhello-0.0] $ uscan
     ... debhello-newversion.tar.xz downloaded
    [debhello-0.0] $ uupdate -v newversion ../debhello-newversion.tar.xz

- O ficheiro debian/watch na árvore fonte antiga tem de ser um válido.
- This make symlink ../debhello_newvwesion.orig.tar.xz pointing to ../debhello-newvwesion.tar.xz.
- Files are extracted from ../debhello-newvwesion.tar.xz to ../debhello-newversion/
- Files are copied from ../debhello-oldversion/debian/ to ../debhello-newvesion/debian/ .

Após o de cima, você deve refrescar os ficheiros debian/patches/* (veja “Secção 9.5, “Gerir a lista de patch com dquilt””) e atualizar debian/changelog com o comando dch(1).

Quando “debian uupdate” é especificado no final da linha no ficheiro debian/watch, o uscan executa automaticamente uupdate(1) após descarregar o tarball.

## 9.5. Gerir a lista de patch com dquilt

Você pode adicionar, retirar, e refrescar ficheiros debian/patches/com dquilt para gerir a lista de patch.

- Adiciona uma nova patch debian/patches/nomebug.patch registando a modificação à fonte do autor no ficheiro ficheiro_buggy como:

      [debhello-0.0] $ dquilt push -a
      [debhello-0.0] $ dquilt new bugname.patch
      [debhello-0.0] $ dquilt add buggy_file
      [debhello-0.0] $ vim buggy_file
        ...
      [debhello-0.0] $ dquilt refresh
      [debhello-0.0] $ dquilt header -e
      [debhello-0.0] $ dquilt pop -a

- Drop (== desactiva) um caminho existente

  - Comenta linha pertinente em debian/patches/series
  - Apagar o próprio caminho (opcional)

- Refresca ficheiros debian/patches/* para fazer o “dpkg-source -b” funcionar como esperado após atualizar um pacote Debian para o novo lançamento do autor.

      [debhello-0.0] $ uscan; uupdate  # updating to the new upstream release
      [debhello-0.0] $ while dquilt push; do dquilt refresh ; done
      [debhello-0.0] $ dquilt pop -a

  - Se, em cima, forem encontrados conflitos com “dquilt push”, resolva-os e depois corra “dquilt refresh” manualmente para cada um deles.

## 9.6. Comandos de compilação

Aqui vamos recapitular os comandos de compilação de pacotes de baixo nível disponíveis. Existem muitas maneiras de se fazer a mesma coisa.

- dpkg-buildpackage = núcleo da ferramenta de compilação de pacote
- debuild = dpkg-buildpackage + lintian (compilação sob as variáveis de ambiente higienizadas)
- schroot = núcleo da ferramenta de ambiente chroot de Debian
- sbuild = dpkg-buildpackage em schroot personalizado (compilar na chroot)

## 9.7. Nota sobre o sbuild

O comando sbuild(1) é um script invólucro do dpkg-buildpackage o qual compila pacotes binário Debian num ambiente chroot gerido pelo comando schroot(1). Por exemplo, compilar para a suite Debian unstable pode ser feito assim:

    [debhello-0.0] $ sudo sbuild -d unstable

Em terminologia do schroot(1), isto compila um pacote Debian num limpo e efémero chroot “chroot:unstable-amd64-sbuild” começando como uma cópia do mínimo persistente limpo chroot “source:unstable-amd64-sbuild”.

Este ambiente de compilação foi configurado como descrito em “Secção 4.7, “Configuração do sbuild”” com “sbuild-debian-developer-setup -s unstable” o que essencialmente fez o seguinte:

    [~] $ sudo mkdir -p /srv/chroot/dist-amd64-sbuild
    [~] $ sudo sbuild-createchroot unstable /srv/chroot/unstable-amd64-sbuild http://deb.debian.org/debian
    [~] $ sudo usermod -a -G sbuild <your_user_name>
    [~] $ sudo shutdown -r now
     ... reboot

A configuração schroot(1) para unstable-amd64-sbuild foi gerada em /etc/schroot/chroot.d/unstable-amd64-sbuild.$suffix :

    [unstable-amd64-sbuild]
    description=Debian sid/amd64 autobuilder
    groups=root,sbuild
    root-groups=root,sbuild
    profile=sbuild
    type=directory
    directory=/srv/chroot/unstable-amd64-sbuild
    union-type=overlay

Aqui:

- O perfil definido no directório /etc/schroot/sbuild/ é usado para configurar o ambiente chroot.
- /srv/chroot/unstable-amd64-sbuild directório que contém o sistema de ficheiros da chroot.
- /etc/sbuild/unstable-amd64-sbuild é ligado por link simbólico a /srv/chroot/unstable-amd64-sbuild .

Você pode atualizar esta chroot fonte “source:unstable-amd64-sbuild” fazendo:

    [~] $ sudo sbuild-update -udcar unstable

Você pode iniciar sessão nesta chroot fonte “source:unstable-amd64-sbuild” assim:

    [~] $ sudo sbuild-shell unstable

| Dica
Se o seu sistema de ficheiros chroot fonte tem falta de pacotes como libeatmydata1, ccache, e lintian, para as suas necessidades, você pode querer instalar estes ao iniciar sessão nele.

## 9.8. Casos especiais de compilação

The orig.tar.xz file may need to be uploaded for a Debian revision other than 0 or 1 under some exceptional cases (e.g., for a security upload).

Quando um pacote essencial se torna não-essencial (ex, adduser), você precisa de remove-lo manualmente do ambiente chroot existente para o seu uso pelo piuparts.

## 9.9. Upload orig.tar.xz

When you first upload the package to the archive, you need to include the original orig.tar.xz source, too.

Se o número de revisão Debian do pacote for um de 1 ou 0, isto é a predefinição. Caso contrário, você tem de fornecer a opção do dpkg-buildpackage -sa ao comando dpkg-buildpackage.

- dpkg-buildpackage -sa
- debuild -sa
- sbuild --debbuildopts=-sa
- gbp buildpackage -sa

| Dica
On the other hand, the -sd option will force the exclusion of the original orig.tar.xz source.

| Dica
Security uploads require including the orig.tar.xz file.

## 9.10. Envios saltados

Se você criou múltiplas entradas no debian/changelog enquanto saltou envios, você tem de criar um ficheiro *_.changes apropriado que inclui todas as alterações desde o último envio. Isto pode ser feito ao especificar a opção do dpkg-buildpackage -v com a última versão enviada, ex., 1.2.

- dpkg-buildpackage -v 1.2
- debuild -v 1.2
- sbuild --debbuildopts=-v 1.2
- gbp buildpackage -v 1.2

## 9.11. Relatórios de bug

O comando reportbug(1) usado para o relatório de bug de pacote-binário pode ser personalizado pelos ficheiros em usr/share/bug/pacote-binário/.

O comando dh_bugfiles instala estes ficheiros a partir dos ficheiros modelo no directório debian/.

- debian/pacote-binário.bug-control → usr/share/bug/pacote-binário/control

  - Este ficheiro contém algumas direcções tais como redirecionar o relatório de bug para outro pacote.

- debian/pacote-binário.bug-presubj → usr/share/bug/pacote-binário/presubj

  - Este ficheiro é mostrado ao utilizador pelo comando reportbug.

- debian/pacote-binário.bug-script → usr/share/bug/pacote-binário ou usr/share/bug/pacote-binário/script

  - O comando reportbug corre este script para gerar um ficheiro modelo para o relatório de bug.

Veja dh_bugfiles(1) e “Funcionalidades do reportbug para Desenvolvedores (README.developers)”

| Dica
Se você está sempre a lembrar o relatador de bug de algo ou a pergunta sobre a sua situação, use estes ficheiros para o automatizar.

Capítulo 8. Sanitização da fonte |  | Capítulo 10. Empacotamento avançado