Una mica més tard del que tenia previst, però continuo el meu apunt sobre com arreglar paquets de l’Ubuntu que no compilen amb un primer exemple pràctic (o més que exemple, amb un cas real). El paquet triat, seleccionat de la llista de paquets que no compilen, s’anomena necpp. Procedim a seguir amb els passos que vaig descriure.

1. Comprovació de l’estat

Ara no perquè ja he arreglat el paquet, però si miravem a https://launchpad.net/ubuntu/+source/necpp veiem que la última versió del paquet era l’afectada, i que no hi havia informes d’error relacionats amb el problema (recordem que, si n’hi hagués, podríem trobar-hi pistes o bé veure que algú altre ja està treballant en arreglar aquest paquet). Comprovant els informes d’error a Debian (http://bugs.debian.org/necpp) tampoc trobem res, i a http://packages.debian.org/necpp comprovem que tampoc hi ha cap versió més nova que la de l’Ubuntu on ho hagin arreglat. Així doncs, tirem endavant, i obrim un informe d’error al Launchpad per indicar que hi estem treballant (exemple).

2. Obtenció del paquet font
Baixem el paquet font:

apt-get source necpp

Si ho proveu ara, obtindreu la nova versió del paquet que ja he arreglat, però podeu baixar-vos l’anterior a fi de seguir el tutorial fent això en lloc de l’apt-get source:

dget https://launchpad.net/ubuntu/+archive/primary/+files/necpp_1.3.0+cvs20090101-1ubuntu1.dsc
dpkg-source -x necpp_1.3.0+cvs20090101-1ubuntu1.dsc

Ara, comprovem que efectivament podem reproduir el problema, intentant compilar-lo:

pbuilder-karmic build necpp_1.3.0+cvs20090101-1ubuntu1.dsc

El missatge d’error que rebem és el següent:

[...]
XGetopt.cpp: In function 'int XGetopt(int, char**, const char*)':
XGetopt.cpp:170: error: invalid conversion from 'const char*' to 'char*'
make[3]: *** [XGetopt.o] Error 1
[...]

3. Solució del problema
Arribem així a la part més difícil, ja que aquesta no és sistemàtica.

El missatge d’error ens parla d’un fitxer XGetopt.cpp, el qual podem trobar al directori str/. Si mirem a la línia que menciona, la 170, ens trobem el següent:

cp = strchr(optstring, c);

Si cerquem informació sobre la funció strchr del C++, trobem que està sobrecarregada i té dues versions:

const char * strchr (const char * str, int character);
char * strchr (char * str, int character);

Veiem que si el primer paràmetre de la funció és constant, el resultat de la funció és una constant, i sí el paràmetre no és constant, el resultat tampoc ho és. Si mirem de quin tipus és la variable optstring, a la línia 133 trobem que és constant, de manera que el resultat de la funció també ho és. Si ara mirem com és la variable cp, a la qual s’està assignant la sortida de la funció, a la línia 136 veiem:

char *cp;

És a dir, no és constant, de manera que aquí tenim el problema. Si mirem la resta del codi on existeix aquesta variable, no trobem cap lloc on es modifiqui el valor de la cadena de text a la qual apunta, així que podem convertir la variable en constant sense problema. Per fer-ho, simplement cal canviar la línia afegint-hi «const» al davant, i com que si executem l’ordre

what-patch

ens diu que el paquet no utilitza cap sistema de pegats («patchless?») podem fer el canvi modificant el fitxer directament.

Per acabar, afegim una entrada nova al fitxer debian/changelog, declarant una revisió nova del paquet i explicant els canvis que hem fet. Executem l’ordre següent:

dch -i

I ha de quedar una cosa com ara:

necpp (1.3.0+cvs20090101-1ubuntu2) karmic; urgency=low

  * src/XGetopt.cpp (LP: #447454)
     - Change the definition of the "cp" variable from type "char*" to
       "const char*", to avoid an "invalid conversion" error when the
       result of "strchr(const char*, ...)" is assigned to it.

 -- Siegfried-Angel Gevatter Pujals   Sat, 24 Oct 2009 19:58:55 +0200

És important no oblidar-nos de referenciar el número de l’informe d’error que hem obert, i explicar clarament el motiu de tots els canvis.

4. Regenerant el paquet font

debuild -S

Això ens crearà un paquet font per a la nova revisió, que podem compilar tal com hem fet abans (però utilitzant el fitxer .dsc de la nova revisió, no el d’abans):

pbuilder-karmic build necpp_1.3.0+cvs20090101-1ubuntu2.dsc

Aquest cop funcionarà, així que ara només queda generar un fitxer de diferències i comprovar que només hi ha els canvis que hem fet intencionadament.

debdiff necpp_1.3.0+cvs20090101-1ubuntu1.dsc necpp_1.3.0+cvs20090101-1ubuntu2.dsc > necpp_1.3.0+cvs20090101-1ubuntu2.debdiff

En aquest cas, el contingut del fitxer ha de ser el següent:

diff -u necpp-1.3.0+cvs20090101/debian/changelog necpp-1.3.0+cvs20090101/debian/changelog
--- necpp-1.3.0+cvs20090101/debian/changelog
+++ necpp-1.3.0+cvs20090101/debian/changelog
@@ -1,3 +1,12 @@
+necpp (1.3.0+cvs20090101-1ubuntu2) karmic; urgency=low
+
+  * src/XGetopt.cpp (LP: #447454)
+     - Change the definition of the "cp" variable from type "char*" to
+       "const char*", to avoid an "invalid conversion" error when the
+       result of "strchr(const char*, ...)" is assigned to it.
+
+ -- Siegfried-Angel Gevatter Pujals   Sat, 24 Oct 2009 19:58:55 +0200
+
 necpp (1.3.0+cvs20090101-1ubuntu1) karmic; urgency=low

   * Merge from debian unstable, remaining changes from jaunty:
only in patch2:
unchanged:
--- necpp-1.3.0+cvs20090101.orig/src/XGetopt.cpp
+++ necpp-1.3.0+cvs20090101/src/XGetopt.cpp
@@ -133,7 +133,7 @@
 int XGetopt(int argc, char *argv[], const char *optstring)
 {
 	char c;
-	char *cp;
+	const char *cp;
 	static char *next = NULL;
 	if (optind == 0)
 		next = NULL;

5. Enviant els canvis a l’Ubuntu

Ara que tenim el fitxer de diferències, l’adjuntem a l’informe d’error que hem creat al principi, i subscrivim l’equip de revisors adequat a l’informe. En aquest cas, el paquet està al dipòsit universe, com podem comprovar:

$ apt-cache madison necpp
     necpp | 1.3.0+cvs20090101-1ubuntu1 | http://mirror.pacific.net.au karmic/universe Sources

Així doncs, l’equip és l’ubuntu-universe-sponsors. Ara només queda esperar que algú revisi el paquet i el pugi a l’Ubuntu, però com que som bons ciutadans també reportarem l’error a Debian tot donant-los-en la solució.

You are reading: Com arreglar paquets de l'Ubuntu que no compilen?