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 fonte-package-name
. 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.comp
-
comp tendo um valor entre
gz
,
bz2
ou
xz
, dependendo da ferramenta de compressão em uso), em seguida, executando o comando
dpkg-source-x file.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 tuod tenha sido baixado, ele extrai o pacote fonte (a menos que a opção
-d
ou
--download-only
seja usada).
15.1.2. Fazendo Alterações
O fonte de um pacote está agora disponível em um diretório nomeado após o pacote fonte e sua versão (por exemplo, samba-4.1.17+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 distinguida do pacote original provido pelo Debian. Assumindo que a versão atual é 2:4.1.17+dfsg-2
, nós podemos criar uma versão 2:4.1.17+dfsg-2falcot1
, na qual 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, com um comando dch --local falcot
. Isso chama um editor de texto (sensible-editor
— este deveria ser seu editor de textos favorito se for mencionado na variável de ambiente VISUAL
ou EDITOR
, e o editor padrão de outra forma) para permitir a documentação das diferenças trazidas por esta reconstrução. Este editor nos mostra que dch
realmente modificou o arquivo debian/changelog
.
Quando uma mudança nas opções de construção são necessárias, as mudanças precisam ser feitas em debian/rules
, o qual controla os passos para o processo de construção do pacote. Nos casos mais simples, as linhas relevantes as configurações iniciais (./configure …
) ou a construção verdadeira ($(MAKE) …
ou make …
) são fáceis de marcar. Se eles comandos são explicitamente chamados, eles provavelmente são efeitos colaterais de outro comando explícito, em cada caso 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 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 quais 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 construtor automático usar um pacote dado 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 rigorosos, 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ão ajudar você a descobrir as dependências apropriadas. Idealmente, todas dependências devem ser satisfeitas a partir da distribuição utilizada para a reconstrução, se não forem, um processo recursivo começa, segundo o qual os pacotes mencionados no campo Build-Depends
deve ser reproduzidos diante do pacote de destino. Alguns pacotes podem não precisar reproduzir, e pode ser instalado como está durante o processo de criação (um exemplo notável é debhelper). Note-se que o processo backports pode rapidamente tornar-se complexo, se você não for cuidadoso. Portanto, backports devem ser mantido a um mínimo estrito quando possível.
15.1.3. Começando a Reconstrução
Quando todas 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 os campos Build-Depends
não foram atualizados, ou se os pacotes relacionados não foram instalados. Neste caso, é possível anular esta verificação passando a opção -d
para o dpkg-buildpackage
. Entretanto, ignorando explicitamente essas dependências corre-se o risco do processo de construção falhar em um próximo estágio. Pior, o pacote pode parecer corretamente construído mas falhar ao ser executado: alguns programas automaticamente desabilitam algumas de suas funcionalidades quando uma biblioteca necessária não está disponível em tempo de construção.
Mais frequentemente do que nunca, os desenvolvedores Debian usam programas de alto nível como o debuild
; ele executa dpkg-buildpackage
como de costume, mas ele também incluí a execução de um programa que executa diversas verificações para validar a geração dos pacotes contra 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.