Como fazer um backport de um pacote para o Ubuntu

Vezes ou outras precisamos usar programas cujas versões adiantadas não estão em nosso repositório. A alternativa mais atualizada pode estar em código fonte, repositório de terceiros ou em repositórios oficiais de versões futuras do Ubuntu ou Debian. Compilar a partir do código fonte é uma excelente alternativa…para nerds ! Se existe um repositório – que seja confiável – e que ainda por cima forneça o código fonte… então usemos !

A alternativa de usar um pacote de uma versão posterior à sua distro é chamada de backport, por exemplo, o pacote dia-gnome ( Editor de Diagramas) está na versão 0.96 no Ubuntu Jaunty 9.04. Mas se olharmos a próxima versão do Ubuntu, a Karmic, veremos que lá a versão encontra-se na 0.97. Não é apenas uma questão de pegar o pacote .deb da Karmic e instalarmos no Jaunty, pois pode haver dependências que impeçam a sua instalação, ou pior, que você consiga instalar, mas quebre o sistema de pacotes. Em poucas palavras só podemos instalar pacotes que foram previamente adaptados a nossa distribuição e versão.

Quando queremos fazer uso de um pacote que está em versões futuras de nossa distribuição Ubuntu, precisamos fazer o que é chamado de ‘backport’. Que corresponde a compilar os fontes e gerar novos pacotes para a versão de distribuição que estou usando, claro que de uma forma automatizada, tão automatizada que não precisa ser feita por programadores. Esse recurso de ‘backport’ não é exclusividade do Ubuntu, na realidade ele existe e funciona para qualquer distribuição baseada em debian e é muito simples.

Como exemplo, vamos usar o próprio pacote ‘dia-gnome’. O ‘dia-gnome’ versão 0.97, não existe nos repositórios atuais, porém existe nos repositórios futuros. A primeira etapa é saber qual é o nome da próxima versão do Ubuntu, qual ? KARMIC KOALA ! Mas todo repositório tem um nome forte, qual seria o nome forte para Karmic Koala ? Uma boa dica é listar o endereço do repositório, isto é :

http://archive.ubuntu.com/ubuntu/dists/

Assim, notaremos que o nome forte usado pelos repositórios para Karmic Koala é ‘karmic’, assim, dê um ALT+F2 e execute :

"gksu gedit /etc/apt/sources.list.d/backport.list"

e cole o seguinte conteúdo :

deb-src http://archive.ubuntu.com/ubuntu/ karmic main restricted universe multiverse

Perceba que iniciando a linha com deb-src voce está se referindo apenas a repositório de código fonte de programas, e não para binários que geralmente estão prontos para instalação.
Você notou que usamos o nome karmic ? Sim, este é o novo nome da próxima versão do Ubuntu.
Depois de colado o texto, salve o arquivo e feche o editor.
Vá até o prompt (Aplicativos->Acessórios->Terminal) e execute :

sudo apt-get update

Assim você atualizará a lista de repositórios, incluindo o indice de repositório para código fonte de programas, quando estiver concluído, a ferramenta APT saberá que pacotes você poderá compilar diretamente em seu sistema e o melhor : de forma automatizada.
O próximo comando é avisar ao sistema que você pretende compilar o pacote 'dia-gnome' e que é para instalar as dependências necessárias para compila-lo :

sudo apt-get build-dep dia-gnome

O comando acima verifica e instala todas as dependências necessárias para compilar o pacote dia-gnome.
O próximo passo é descarregar o código fonte do programa dia-gnome, então temos de criar um diretório para receber o código fonte, execute o comando :

mkdir -p ~/dia
cd ~/dia

O sinal de '~' é um atalho para /home/fulano que é seu diretório pessoal. Em geral, eu criaria uma pasta em /usr/src, mas isso requiriria usar outros comandos, mas o processo de backport é tão simples que não vale esse esforço a menos que você seja um exímio programador e queira depositar também suas alterações pessoais e mantê-las.
O próximo comando será :

sudo apt-get -b source dia-gnome

Esse comando automaticamente descarrega os fontes, compila e gera os pacotes binários .deb, cada programa será compilado para a plataforma que estiver usando, em algumas oportunidades poderá ganhar performance. O intuito desse artigo é apenas mostrar o básico, mas há variáveis de compilação que se trocadas podem dar uma turbinada no aplicativo que pretende recompilar, o pacote 'mplayer' por exemplo é um dos programas que podem ser otimizados.
A compilação e geração dos binários pode demorar, eu não aconselho por exemplo fazer backport de programas como Mozilla Firefox ou OpenOffice, eles demoram muito e no geral repositórios PPA (repositórios pessoais de terceiros) já o possuem.
Quando tiver terminado a compilação e geração de pacotes o seguinte aviso será fornecido :

(...)
dpkg-deb: construindo pacote 'dia-libs' em '../dia-libs_0.97-2_i386.deb'.
dpkg-deb: construindo pacote 'dia' em '../dia_0.97-2_i386.deb'.
dpkg-deb: construindo pacote 'dia-gnome' em '../dia-gnome_0.97-2_i386.deb'.
dpkg-genchanges -b >../dia_0.97-2_i386.changes
dpkg-genchanges: somente-binário upload - não inclui alguns codigo fonte
dpkg-buildpackage: enviar apenas binários (fontes não inclusas)

Isso indica que os pacotes foram criados, veja :

ls -l *.deb
-rw-r--r-- 1 root root 194976 2009-08-11 09:16 dia_0.97-2_i386.deb
-rw-r--r-- 1 root root 5726802 2009-08-11 09:15 dia-common_0.97-2_all.deb
-rw-r--r-- 1 root root 195336 2009-08-11 09:16 dia-gnome_0.97-2_i386.deb
-rw-r--r-- 1 root root 834492 2009-08-11 09:16 dia-libs_0.97-2_i386.deb

A vantagem de compilar usando o sistema de backport em detrimento do tradicional './configure;make;make install' é TOTAL. Compilando de maneira tradicional os fontes você tem que se habituar a saber quais bibliotecas são necessárias, alterar prefix dos programas, se preocupar com que os binários gerados não interfiram em outros programas, etc... Com o backport você mantém o gerenciamento de pacotes intacto, transporta os arquivos *.deb para onde quiser.

Uma preocupação que você deve ter antes de instalar novos os pacotes provenientes de backports em seu sistema acima é saber se precisará remover os atuais que já estiverem instalados. Quase sempre a atualização é substitutiva e não há nada com que se preocupar. Eu tenho um esquisito comportamento de sempre que eu ver um pacote "-common.deb" de remover o programa inteiro antes de instalar o novo, desculpa, mas isso é uma autodefesa adquirida de experiências passadas, assim ao ver o pacote "dia-common_0.97-2_all.deb" na relação é quase automático eu executar também :

sudo apt-get remove dia*

Raramente acontecem problemas, mas ao instalar o novo 'dia', o APT interrompeu a instalação porque um arquivo de outro pacote (imagination) iria também ser substituído, veja :

(...)dpkg: erro processando dia-common_0.97-2_all.deb (--install):
tentando sobrescrever '/usr/share/icons/hicolor/icon-theme.cache', que também está no pacote imagination

Que chato ! O arquivo '/usr/share/icons/hicolor/icon-theme.cache' existem nos dois pacotes, que coincidência incrível, o que fazer ?
No caso de substituição de arquivos sem importância eu posso usar o parâmetro --force-all no dpkg, ou então remover o pacote supracitado.
Eu prefero usar --force-all nessa situação :

sudo dpkg -i --force-all *.deb
Selecionando pacote previamente não selecionado dia.
(Lendo banco de dados ... 257148 arquivos e diretórios atualmente instalados).
Desempacotando dia (de dia_0.97-2_i386.deb) ...
Preparando para substituir dia-common 0.96.1-7.1 (usando dia-common_0.97-2_all.deb) ...
Desempacotando substituto dia-common ...
Selecionando pacote previamente não selecionado dia-gnome.
Desempacotando dia-gnome (de dia-gnome_0.97-2_i386.deb) ...
Preparando para substituir dia-libs 0.97-2 (usando dia-libs_0.97-2_i386.deb) ...
Desempacotando substituto dia-libs ...
Configurando dia-common (0.97-2) ...
Configurando dia-libs (0.97-2) ...
Processando gatilhos para doc-base ...
Processing 1 changed doc-base file(s)...
Registering documents with scrollkeeper...
Configurando dia (0.97-2) ...
Configurando dia-gnome (0.97-2) ...
Processando gatilhos para man-db ...
Processando gatilhos para menu ...

Para ter certeza de que nenhum programa merecido ficou de fora :

sudo apt-get install -f

Agora usufrua o fruto do seu labor :

dia-gnome --integrated

Nova interface do programa dia.

O programa 'dia' foi apenas um exemplo para a realização do backport, escolhi-o propositalmente porque com ele possuiria conflito de arquivos e pacotes "comuns" (pacote-common.deb), assim o 'dia' seria um exemplo mais complexo do que seria com outros pacotes. Com isso em mente, você pode repetir a mesma ideia para qualquer outro pacote. Os procedimentos são praticamente os mesmos para qualquer distro baseada em Debian, apenas muda a linha deb-src no arquivo sources.list de sua distribuição.

Se precisar instalar a nova versão do 'dia' para outro computador, não precisa repetir todo esse artigo, apenas leve os arquivos *.deb para a outra máquina e instale-os.

Por enquanto é só, vida longa e próspera a todos.