Uncategorized

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 “0x8f” e colocando o valor “0x84”. 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!

Advertisements
Standard

7 thoughts on “Alterando e recompilando pacotes no Ubuntu

  1. Pingback: Miranda » Blog Archive » Alterando e recompilando pacotes no Ubuntu

  2. Jarbas says:

    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.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s