Como injectar um patch
From Paldo
Contents |
[edit] Como injectar patches através do upkg
written by AV in apr 2010
[edit] Abstracto
Este tutorial irá ajudá-lo a aplicar um patch a um pacote em código fonte utilizando upkg. Upkg é o gestor de pacotes e o sistema de construção utilizado no Paldo Linux distribution.
[edit] Um problema concreto
Tenho uma placa PCI TV no meu computador, com o Paldo instalado. Infelizmente, o repositório principal do Paldo, não tem nenhuma aplicação Gnome, específica para TV. (Eu não quero utilizar o MythTV apenas para assistir a programas de TV) Por este motivo, decidi construir zapping a partir do código fonte. Infelizmente, enquanto decorria o "make", surgiram os seguintes erros.
In file included from io-v4l2k.c:55:
videodev2k.h:19:46: error: linux/compiler.h: No such file or directory
make[4]: *** [io-v4l2k.lo] Error 1
make[4]: Leaving directory `/home/nicolas/temp/zvbi-0.2.19.orig/src'
make[3]: *** [all-recursive] Error 1
make[3]: Leaving directory `/home/nicolas/temp/zvbi-0.2.19.orig/src'
make[2]: *** [all] Error 2
make[2]: Leaving directory `/home/nicolas/temp/zvbi-0.2.19.orig/src'
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory `/home/nicolas/temp/zvbi-0.2.19.orig'
make: *** [all] Error 2
Uma forma simples de tornear, seria descomentar a linha que incluia linux/compiler.h. No entanto, nós gostaríamos de fazer o upload para o repositório do Paldo, dos pacotes com o código fonte originários. É por esse motivo que o upkg é capaz de aplicar um patch, no decurso de um processo de construção. Vidé a forma como pode criar-se um patch e aplicá-lo num spec file do upkg.
Leia package build howto, no caso de pretender obter uma visão geral sobre a forma como o upkg funciona.
[edit] Criar um ficheiro diff
Em primeiro lugar, fazer o download do código fonte do pacote original da aplicação, e descompactá-lo "untar/unzip". Para isso, adicione o sufixo ".orig" à pasta e faça uma cópia da totalidade da pasta, sem incluir esse sufixo. Depois disso, o seu directório ficará com o seguinte aspecto:
[nicolas@gandalf:~/temp]$ ls -la
[...]
drwxr-xr-x 9 nicolas users 4096 2006-03-29 17:01 zvbi-0.2.19
drwxr-xr-x 9 nicolas users 4096 2006-03-29 17:03 zvbi-0.2.19.orig
De seguida, vá para a pasta-de-trabalho (aquela que não tem o sufixo) e corriga o/os bugs. epois disso, esta fase fica concluída. Saia da pasta-de-trabalho e crie um ficheiro-diff, usando o comando "diff". No meu exemplo, foi necessário alterar o ficheiro videodev2k.h porque o mesmo se encontra também na pasta src da minha pasta-de-trabalho (zvbi-0.2.19/src/videodev2k.h). Agora, cria-se um ficheiro-diff, utilizando o seguinte comando:
[nicolas@gandalf:~/temp]$ diff -puNr zvbi-0.2.19.orig zvbi-0.2.19 > zvbi-0.2.19-compiler.h-1.patch
[edit] Comprimir o ficheiro
Agora, utilizar bzip2 para comprimir o(s) patche(s) obtido(s), e em seguida copie o pacote em código fonte original (upstream) e o ficheiro patch comprimido, para dentro do seu repositório. epois disso, a pasta do meu repositório ficou com o seguinte aspecto:
[nicolas@gandalf:~/]$ ls -la PaldoRepo/sources/zvbi-0.2/
[...]
-rw-r--r-- 1 nicolas users 344 2006-03-29 16:30 zvbi-0.2.19-compiler.h-1.patch.bz2
-rw-r--r-- 1 nicolas users 722143 2006-03-29 15:55 zvbi-0.2.19.tar.bz2
[edit] Notificar o upkg sobre o patch efectuado
Agora, cria-se um ficheiro spec para o upkg (conforme descrito em package build howto). A parte importante, consiste em adicionar um patch-directive entre o archive- tag (<patch name="zvbi-0.2.19-compiler.h-1"/>). Conforme pode ver-se, não é necessário adicionar-se o sufixo ".patch.bz2". Neste caso, o upkg irá procurar um ficheiro denominado zvbi-0.2.19-compiler.h-1.patch.bz2 e automaticamente, aplicá-lo-á durante o processo de construção.
<?xml version="1.0"?>
<package name="zvbi-0.2">
<description>the vertical blanking interval (VBI) library</description>
<releases>
<release version="0.2.19" revision="1" branch="testing">
<deps>
<dep name="libpng"/>
</deps>
<build>
<script>
<archive name="zvbi-$VERSION">
<patch name="zvbi-$VERSION-compiler.h-1"/>
<cmd>./configure --prefix=/usr
--infodir=/usr/share/info
--mandir=/usr/share/man
--sysconfdir=/etc</cmd>
<cmd>make -j 2</cmd>
<cmd>make install</cmd>
</archive>
</script>
</build>
</release>
</releases>
</package>
[edit] Iniciar a compilação e a instalação
Neste momento, estamos em condições para compilar e instalar a nossa aplicação. O patch, irá ser adicionado automaticamente, durante esse processo. The patch will automatically be added during this process. O seguinte comando irá invocar tudo o que irá acontecer:
[root@gandalf:~]# upkg-build zvbi-0.2
Generating script...
Writing script...
Executing script...
The following extra packages will be installed:
zvbi-0.2
The following packages will be built from source:
zvbi-0.2
Do you want to continue? [Y/n]
Building zvbi-0.2-0.2.19-1 (testing)...
[root@gandalf:~]#
Se pretender obter a visualização do texto inerente ao processo, deverá acrescentar --verbose ao upkg-build:
[root@gandalf:~]# upkg-build --verbose zvbi-0.2
[edit] Neste momento, deverá ser possível fazer correr a sua aplicação.
Ficheiros de Registo do upkg-build
Se pretender ver na totalidade, aquilo que foi feito pelo upkg, verifique o ficheiro /var/lib/upkg/logs/PACKAGE-VERSION.log.bz2. No meu caso, é aí que se encontram todos os passos seguidos pelo upkg, em /var/lib/upkg/logs/zvbi-0.2-x86-glibc-2.4-gcc-4.1-1-0.2.19-1.log.bz2

