Product SiteDocumentation Site

Capítulo 15. Criando um Pacote Debian

15.1. Reconstruindo um Pacote a partir de suas Fontes
15.1.1. Pegando os Fontes
15.1.2. Fazendo Alterações
15.1.3. Começando a Reconstrução
15.2. Construindo seu Primeiro Pacote
15.2.1. Meta-pacotes ou Falsos Pacotes
15.2.2. Depósito Simples de Arquivos
15.3. Criando um Repositório de Pacotes para o APT
15.4. Tornando-se um Mantenedor de Pacotes
15.4.1. Aprendendo a Fazer Pacotes
15.4.2. Processo de Aceitação
É muito comum, para um administrador que vem lidando com pacotes Debian de maneira regular, sentir eventualmente a necessidade de criar o seu próprio pacote, ou modificar um pacote existente. Este capítulo tem a intenção de responder as questões mais comuns neste campo, e dar os elementos necessários para tirar vantagem da infraestrutura do Debian da melhor maneira possível. Com alguma sorte, após testar sua mão em pacotes locais, você sinta a necessidade de se aprofundar e eventualmente juntar-se até mesmo ao projeto Debian!

15.1. Reconstruindo um Pacote a partir de suas Fontes

Reconstruir um pacote binário é necessário sob diversas circunstâncias. Em alguns casos, o administrador precisa de uma funcionalidade que necessita que o programa seja compilado a partir de suas fontes, com uma opção particular de compilação; em outras, o programa empacotado na versão instalada do Debian não é suficientemente recente. Em último caso, o administrador irá usualmente construir um pacote mais recente retirado de uma versão mais recente do Debian — como Testing ou até mesmo Unstable — então este novo pacote funcionará em sua distribuição Stable; esta operação é chamada “backporting”. Como de costume, alguma cautela deve ser tomada, antes de se empreender essa tarefa, para verificar se isto já não foi feito anteriormente — uma rápida olhada na página de Rastreamento de Pacote Debian para esse pacote irá revelar essa informação.

15.1.1. Pegando os Fontes

Reconstruir um pacote Debian começa com a obtenção de seu código-fonte. A maneira mais fácil é usar o comando apt-get source nome-do-pacote-fonte. Este comando requer uma linha deb-src no arquivo /etc/apt/sources.list, e os arquivos de índice atualizados (ou seja apt-get update). Estas condições já devem estar resolvidas se você seguiu as instruções no capítulo sobre a configuração do APT (veja em Seção 6.1, “Preenchendo no arquivo sources.list Arquivo”). Note, no entanto, que você estará baixando os pacotes fonte da versão Debian mencionada na linha deb-src.
Se você precisa de uma outra versão, você pode precisar baixá-lo manualmente a partir de um dos espelho Debian ou a partir do web site. Trata-se de buscar dois ou três arquivos (com extensões *.dsc — para Debian Source Control (Controle do Fonte Debian) - *.tar.comp, e algumas vezes *.diff.gz ou *.debian.tar.compcomp tendo um valor entre gz, bz2 ou xz, dependendo da ferramenta de compressão em uso), em seguida, executando o comando dpkg-source -x arquivo.dsc. Se o arquivo *.dsc é diretamente acessível em uma determinada URL, há uma maneira ainda mais simples para buscar tudo, com o comando dget URL. Este comando (que pode ser encontrado no pacote devscripts) obtém o arquivo *.dsc no endereço fornecido, então analisa o seu conteúdo e vai buscar automaticamente o arquivo, ou arquivos, referenciados nele. Uma vez que tudo tenha sido baixado, ele verifica a integridade dos pacotes de origem baixados usando o dscverify e extrai o pacote fonte (a menos que a opção -d ou --download-only seja usada). O chaveiro Debian é necessário, a menos que a opção -u seja fornecida.

15.1.2. Fazendo Alterações

Usemos o pacote samba como exemplo.
$ apt source samba
Reading package lists... Done
NOTICE: 'samba' packaging is maintained in the 'Git' version control system at:
https://salsa.debian.org/samba-team/samba.git
Please use:
git clone https://salsa.debian.org/samba-team/samba.git
to retrieve the latest (possibly unreleased) updates to the package.
Need to get 12.3 MB of source archives.
Get:1 http://security.debian.org/debian-security bullseye-security/main samba 2:4.13.13+dfsg-1~deb11u3 (dsc) [4,514 B]
Get:2 http://security.debian.org/debian-security bullseye-security/main samba 2:4.13.13+dfsg-1~deb11u3 (tar) [11.8 MB]
Get:3 http://security.debian.org/debian-security bullseye-security/main samba 2:4.13.13+dfsg-1~deb11u3 (diff) [468 kB]
Fetched 12.3 MB in 3s (4,582 kB/s)
dpkg-source: info: extracting samba in samba-4.13.13+dfsg
dpkg-source: info: unpacking samba_4.13.13+dfsg.orig.tar.xz
dpkg-source: info: unpacking samba_4.13.13+dfsg-1~deb11u3.debian.tar.xz
dpkg-source: info: using patch list from debian/patches/series
dpkg-source: info: applying 07_private_lib
dpkg-source: info: applying bug_221618_precise-64bit-prototype.patch
dpkg-source: info: applying [...]
O fonte do pacote está agora disponível em um diretório com o nome baseado no pacote fonte e sua versão (samba-4.13.13+dfsg); este é o lugar onde nós vamos trabalhar em nossas mudanças locais.
A primeira coisa a se fazer é mudar o número de versão do pacote, para que a reconstrução possa ser diferenciada dos pacotes originais fornecidos pelo Debian. Assumindo que a versão atual é 2:4.13.13+dfsg-1~deb11u3, nós podemos criar uma versão 2:4.13.13+dfsg-1~deb11u3+falcot1, que claramente indica a origem do pacote. Isto faz com que a versão do pacote seja maior do que a provida pelo Debian, então o pacote facilmente instalará como se fosse uma atualização do pacote original. Tal alteração é melhor realizada com o comando dch (Debian CHangelog) do pacote devscripts.
$ cd 4.13.13+dfsg-1~deb11u3
$ dch --local +falcot
O último comando invoca um editor de texto (sensible-editor - este deve ser o seu editor favorito se for mencionado nas variáveis de ambiente VISUAL ou EDITOR e o editor padrão caso contrário) para permitir a documentação das diferenças trazidas por esta reconstrução. Este editor nos mostra que dch realmente mudou o arquivo debian/changelog.
Quando mudanças nas opções de construção são necessárias, as mudanças precisam ser feitas em debian/rules, que controla os passos para o processo de construção do pacote. Nos casos mais simples, as linhas relativas às configurações iniciais (./configure …) ou à construção em si ($(MAKE) … ou make … ou cmake … ou …) são fáceis de achar. Se estes comandos não são explicitamente chamados, eles provavelmente são efeitos colaterais de outro comando explícito. Em qualquer dos casos, por favor verifique a documentação para aprender mais sobre como modificar o comportamento padrão. Com pacotes usando o dh, você talvez precise adicionar um "overridde" para os comandos dh_auto_configure ou dh_auto_build (veja suas respectivas páginas de manual e debhelper(7) para explicações de como fazer isso).
Dependendo das mudanças locais nos pacotes, uma atualização talvez seja necessária no arquivo debian/control , o qual contém uma descrição dos pacotes gerados. Em particular, este arquivo contém linhas Build-Depends que controlam uma lista de dependências que devem ser satisfeitas durante a construção do pacote. Estas geralmente se referem a versões de pacotes contidos na distribuição da qual o pacote fonte veio, mas que talvez não estejam disponíveis na distribuição utilizada na reconstrução. Não há maneira automática para determinar se uma dependência é real ou apenas especificada para garantir que a construção seja apenas tentada com a última versão da biblioteca — esta é a única maneira de se forçar um autobuilder (construtor automático) a usar um dado pacote durante a construção, eis o porque dos mantenedores Debian frequentemente utilizarem versões restritas das dependências de construção.
Se você tem certeza de que estas dependências de compilação são muito rigorosas, você deve se sentir livre para relaxá-las localmente. Lendo os arquivos que documentam a forma padrão de construção do software - esses arquivos são chamados frequentemente INSTALL - irá ajudar você a descobrir as dependências apropriadas. Idealmente, todas as dependências devem ser satisfeitas a partir da distribuição utilizada para a reconstrução, se não forem, um processo recursivo começa, onde os pacotes mencionados no campo Build-Depends devem passar por um "backport" antes do pacote alvo. Alguns pacotes podem não precisar de "backport", e podem ser instalados como estão durante o processo de criação (um exemplo notável é debhelper). Note que o processo de backport pode rapidamente tornar-se complexo, se você não for cuidadoso. Portanto, backports devem ser mantidos a um mínimo o mais estrito possível.

15.1.3. Começando a Reconstrução

Quando todas as mudanças necessárias forem aplicadas aos fontes, podemos começar a gerar o verdadeiro pacote binário (arquivo .deb). Todo o processo é gerenciado pelo comando dpkg-buildpackage.

Exemplo 15.1. Reconstruindo um pacote

$ dpkg-buildpackage -us -uc
[...]
O comando anterior pode falhar se o campo Build-Depends não tiver sido atualizado, ou se os pacotes relacionados estiverem instalados. Neste caso, é possível anular esta verificação passando a opção -d para o dpkg-buildpackage. Entretanto, ignorar explicitamente essas dependências cria-se o risco do processo de construção falhar em um estágio seguinte. Pior, o pacote pode parecer corretamente construído mas não executar corretamente: alguns programas automaticamente desabilitam algumas de suas funcionalidades quando uma biblioteca necessária não está disponível em tempo de construção. A opção ainda pode ser muito útil se você deseja apenas criar um pacote fonte, que deve ser passado para ambientes de construção limpos, conforme descrito em OLHADA RÁPIDA Construindo pacotes em ambientes com chroot e virtuais.
As outras opções usadas no exemplo acima garantem que nem o arquivo .dsc do pacote fonte (-us) nem o arquivo .changes produzido (-uc) são assinados com a chave criptográfica do construtor de pacotes após uma construção bem-sucedida.
Na maioria das vezes, os desenvolvedores Debian usam um programa de alto nível como o debuild; ele executa o dpkg-buildpackage como de costume, mas também inclui uma invocação de um programa que executa diversas verificações para validar a geração dos pacotes de acordo com a política do Debian. Este script também limpa o ambiente para que variáveis locais não "poluam" a construção do pacote. O comando debuild é umas das ferramentas da suíte devscripts, que divide alguma consistência e configuração para tornar as tarefa dos mantenedores mais fácil.