Alterando e recompilando pacotes no Ubuntu
Todo mundo fala da disponibilidade do código-fonte e das vantagens de se “alterar o que quiser” num programa, para que ele sirva às suas necessidades.
Qualquer pessoa que tenha um contato mais profundo com software em geral sabe que não é bem assim:
- primeiro, porque os programas bem feitos são extremamente parametrizáveis, ou seja, são flexíveis o suficiente para servirem às suas necessidades sem a menor necessidade de código-fonte.
- segundo, porque os softwares são cada dia mais complexos, e conhecer um determinado software a fundo pode ser uma tarefa de tempo integral por anos e anos.
Mas existem, entretanto, casos onde essa alteração é realmente necessária. E aí, por onde começa, e para onde vai?
Felizmente, o Ubuntu herdou do Debian suas melhores práticas em software organizado. Nenhuma outra distribuição tem um sistema tão simples e funcional de se modificar um determinado software do que aquelas baseadas em Debian e que publicam seus códigos-fonte de forma igual a este.
Vou utilizar como exemplo um software extremamente complexo e sofisticado - o Xorg. O Xorg, no Ubuntu Breezy, constitui um único arquivo-fonte que gera mais de cinquenta pacotes binários deb, que podem ser totalmente refeitos com apenas alguns comandos.
Para começar qualquer desenvolvimento de software no ubuntu, é absolutamente necessário instalar o pacote build-essential. Ele é um metapacote que instala a maior parte do que você vá precisar para compilar qualquer programa do ubuntu. Para fazê-lo, digite:
sudo apt-get install build-essential
Isso instalará um conjunto mínimo de ferramentas de desenvolvimento.
É claro que um software complexo como o Xorg não tem como dependências apenas as ferramentas básicas - uma série de outras bibliotecas é necessária para podermos compilá-lo. Para não perdermos tempo procurando como loucos este tipo de dependência, o pessoal do Debian resolveu isto de forma bastante simples. Apenas digite no terminal a linha
sudo apt-get build-dep xserver-xorg
e as dependências serão automaticamente instaladas. Agora só falta trazer o código-fonte do X!
A maioria dos computadores não tem os repositórios de código-fonte habilitados no apt-get. Mas mesmo isto é simples. Supondo que seu arquivo /etc/apt/sources.list tenha o seguinte conteúdo:
deb http://archive.ubuntu.com/ubuntu/ breezy main restricted universe multiverse
deb http://security.ubuntu.com/ubuntu/ breezy-security main restricted universe multiverse
deb http://archive.ubuntu.com/ubuntu/ breezy-updates main restricted universe multiverse
deb http://archive.ubuntu.com/ubuntu/ breezy-backports main restricted universe multiverse
Você apenas duplica estas linhas, mudando a palavra “deb” no começo das linhas para deb-src. No meu caso, o arquivo ficou assim:
deb http://archive.ubuntu.com/ubuntu/ breezy main restricted universe multiverse
deb http://security.ubuntu.com/ubuntu/ breezy-security main restricted universe multiverse
deb http://archive.ubuntu.com/ubuntu/ breezy-updates main restricted universe multiverse
deb http://archive.ubuntu.com/ubuntu/ breezy-backports main restricted universe multiverse
deb-src http://archive.ubuntu.com/ubuntu/ breezy main restricted universe multiverse
deb-src http://security.ubuntu.com/ubuntu/ breezy-security main restricted universe multiverse
deb-src http://archive.ubuntu.com/ubuntu/ breezy-updates main restricted universe multiverse
deb-src http://archive.ubuntu.com/ubuntu/ breezy-backports main restricted universe multiverse
Uma vez feito isso, é necessário atualizar a lista de pacotes disponíveis no sistema, com o comando
sudo apt-get update
Feito isso, o sistema está pronto para receber os arquivos de código-fonte do Xorg!
Baixando o fonte
O comando para baixar o código-fonte de algum pacote no Ubuntu é apt-get source. Mas, diferentemente do comando apt-get install, este irá copiar o arquivo no diretório que você estiver. Eu pessoalmente gosto de todos os arquivos no /usr/src. Portanto, vou baixá-lo lá com o comando
sudo su
cd /usr/src
apt-get source xserver-xorg
E aguardar. A velha história de ir tomar um café enquanto espera, neste caso, é verdadeira. O fonte do X tem cerca de 50 mb!
Ótimo, estou com o código-fonte, e agora?
Ao finalizar o download, você terá uma série de arquivos novos no seu diretório. No caso do Xorg do Ubuntu Breezy, são eles:
xorg_6.8.2-77.diff.gz
xorg_6.8.2-77.dsc
xorg_6.8.2.orig.tar.gz
e um diretório xorg-6.8.2
O arquivo xorg_6.8.2.orig.tar.gz é o fonte original do Xorg, como se você tivesse feito o download do mesmo diretamente do site http://x.org. O arquivo xorg_6.8.2-77.dsc é um arquivo de descrição. Ele contém as informações necessárias para garantir que este é realmente o pacote certo e quais as dependências para compilá-lo.
O arquivo xorg_6.8.2-77.diff.gz é o arquivo com as modificações feitas no código-fonte pelo empacotador, ou seja, as diferenças entre o arquivo original e o que será efetivamente compilado na sua distribuição, incluindo aí a estrutura necessária para gerar um pacote debian. Enfim, TUDO que for diferente do software assim como ele veio do site dele.
O diretório xorg_6.8.2 contém o arquivo xorg_6.8.2.orig.tar.gz descompactado, assim como as diferenças contidas no arquivo xorg_6.8.2-77.diff.gz. Note que nesse momento o software ainda não foi modificado, pois estas diferenças foram criadas todas numa pasta chamada debian/ dentro do diretório. Caso existam modificações no código-fonte, estas estarão dentro da pasta debian/patches. (Ou seja, existe um arquivo diff com vários arquivos diff dentro que serão aplicados depois. É estranho no começo, mas depois faz mais sentido).
Compilando o software e gerando os pacotes sem alterações
Uma vez que todas as peças estão no lugar certo, para compilar todo o Xorg e gerar os pacotes, entre no diretório xorg-6.8.2 e execute o comando
dpkg-buildpackage
E vá passear um pouco. Este processo é extremamente lento para um software tão complexo como o Xorg.
Ei, mas este tutorial é sobre alterar o software!
Uma vez que nos certificamos que o software já está compilando corretamente e gerando os pacotes corretamente, estamos prontos para alterá-lo.
Vou propor três alterações simples, que são:
- modificar o arquivo xorg-6.8.2/debian/control - para que ele passe a considerar a plataforma amd64 para o pacote xserver-xorg-driver-via
- modificar o arquivo xorg-6.8.2/build-tree/xc/config/cf/xorg.cf - para que ele passe a compilar o módulo da via no amd64 - afinal, não adianta eu mandar gerar o pacote se esse driver não for sequer compilado, não é mesmo?
- e por fim, a alteração mais importante - modificar o arquivo build-tree/xc/programs/Xserver/hw/xfree86/drivers/via/via_mode.c - para corrigir um bug no mesmo.
Temos aqui alterações de dois tipos diferentes. A primeira mexe apenas no diretório debian, enquanto a segunda e a terceira mexem diretamente no código-fonte do Xorg. Isso é importante.
Como mencionei antes, o sistema de geração de pacote do ubuntu trabalha com o esquema de diferenças - portanto o arquivo não será modificado até que se aplique essas diferenças.
Alterando e entendendo as diferenças
Uma vez que já sei o que vou alterar, a coisa fica fácil. Criarei cópias dos arquivos sem modificações:
cd /usr/src/xorg-6.8.2
cp -a debian debian-orig
cp build-tree/xc/config/cf/xorg.cf build-tree/xc/config/cf/xorg.cf.orig
cp build-tree/xc/programs/Xserver/hw/xfree86/drivers/via/via_mode.c build-tree/xc/programs/Xserver/hw/xfree86/drivers/via/via_mode.c.orig
Por que? Para estabelecer as diferenças entre os arquivos originais e os modificados. Agora eu modifico os arquivos.
Vou editar o primeiro arquivo, o debian/control - Ele é arquivo de controle dos pacotes deb. Se você leu até aqui, não vou lhe ensinar a usar um editor de texto. Basta dizer que adicionei a string “amd64″ no final da linha 618, ou seja, ficou assim essa parte do arquivo:
Package: xserver-xorg-driver-via
Architecture: i386 ia64 hurd-i386 amd64
Isso fará com que o dpkg-buildpackage tente gerá-lo.
Vou editar o segundo arquivo, o xorg.cf. Nele, eu altero a linha 455, adicionando a string “via”. A seção fica assim:
# define XF86CardDrivers mga glint nv tga s3 s3virge sis rendition \
neomagic tdfx savage cirrus tseng trident \
chips apm i128 ati ark cyrix siliconmotion \
vga dummy vesa i810 via \
XF86OSCardDrivers XF86ExtraCardDrivers
E vou editar o terceiro arquivo, o via_mode.c . Nele, eu modifico a linha 739, tirando o valor “0×8f” e colocando o valor “0×84″. A seção fica assim:
case VIA_KM400:
if (pVia->ChipRev Executando o comando diff e jogando a saída para os lugares certos
Devemos agora comparar as nossas alterações com os arquivos originais, e registrarmos estas alterações nos lugares corretos. Para isso:
cd /usr/src/xorg-6.8.2/build-tree
diff -ruN xc/config/cf/xorg.cf.orig xc/config/cf/xorg.cf > ../debian/patches/991_xorg_cf.diff
diff -ruN xc/programs/Xserver/hw/xfree86/drivers/via/via_mode.c.orig xc/programs/Xserver/hw/xfree86/drivers/via/via_mode.c > ../debian/patches/991_via_mode.diff
Isso gerará os seguintes arquivos: debian/991_via_mode.diff e debian/991_xorg_cf.diff.
Feito isso, a árvore de alterações está completa. Remova os diretórios temporários e reconstrua os arquivos de controle com os comandos
cd /usr/src/xorg-6.8.2
rm -rf build-tree/ stampdir/
cd ..
dpkg-source -b xorg-6.8.2
Tanta coisa, e agora?
Agora, o diretório xorg-6.8.2, que foi severamente modificado, pode ser removido, para a testarmos a coisa feita “da forma certa”.
cd /usr/src
rm -rf xorg-6.8.2
E você terá apenas os mesmos arquivos que vieram com o comando apt-get source, porém com suas alterações. Para, a partir deles, gerar os pacotes, execute os comandos
cd /usr/src
dpkg-source -x xorg_6.8.2-77.dsc
cd xorg-6.8.2
dpkg-buildpackage
E, de novo, vá tomar um café
Se você tiver feito tudo certo, e eu tiver escrito tudo certo (o que não necessariamente é verdade), em algumas horas você terá uma série de pacotes novos no /usr/src - E se você estiver num amd64, inclusive um arquivo xserver-xorg-driver-via-6.8.2-77XXX.deb
O assunto não se esgota aqui. Mas espero que seja um bom ponto de partida para quem tem vontade de colaborar com grandes projetos de software e não sabia por onde começar.
Isto, claro, não é o guia do novo mantenedor Debian, nem pretente - é um tutorial muito mais básico, mas que certamente lhe facilitará a vida. Para maiores informações, consulte o http://www.debian.org/doc/maint-guide/
Por hoje é só, pessoal!
27/Março/2006 em 2:08 pm
[...] Por Alexandre Strube em 24/03/2006 - 22:12 [...]
28/Março/2006 em 1:53 pm
Alexandre..
Parabéns pelo ótimo artigo!
+1
[]’s
27/Setembro/2007 em 10:19 am
E para o Ubuntu 7.04 32bits?
Tem como configurar a placa de Vídeo VIA?
Alguém poderia me ajudar?
MAIL-ME: maurowil [arroba] gmail [ponto] com
10/Novembro/2007 em 9:28 am
Simplesmente, muito bom.
É dos poucos tutoriais que consegui ler sem parar!
14/Dezembro/2007 em 11:52 pm
Seu artigo é excelente. Parabéns!!
Porém necessitava de mais detalhes para poder gerar um conjunto de pacotes de uma versão mais nova do openldap. Isso porque não me parece apenas alterar uns poucos arquivos antes de regerar o pacote.
Se puder fazer ou souber quem faça esse empacotamento do openldap 2.4 para Debian eu agradeço.
30/Junho/2008 em 11:52 am
Meus parabéns!!
Seu artigo é muito bom mesmo……
Eder