Problemas de Empaquetado

De Wiki de la Comunidad Mandriva

Contenido


Errores de construcción

unrecognized option --tag=CXX' Try libtool --help' for more information

La macro libtoolize es parte de la macro %configure (verifíquelo ejecutando rpm --eval %configure ), y debido a una incompatibilidad de versiones las cosas no funcionan. Mandriva Linux utiliza libtool-1.4, mientra que KDE utiliza libtool-1.5 (o 1.4a?). La versión 1.4 no entiende la opción --tag=CXX', por lo que se produce este fallo.

En la parte superior de su archivo spec, puede definir esto:

%define __libtoolize    /bin/true

Cuando añade esto, libtoolize no es ejecutado, y todo deberá funcionar bien.

¡Los binarios tienen un extraño prefijo i586-mandrake-linux!

añada --program-prefix= (nota: después del signo igual no hay nada) a la llamada de %configure;

alternativamente, añada transform="" a la llamada %makeinstall.

También puede intentar usar autoconf2.5, llamando a %configure2.5x

A las librerías les falta el "so" (libfoo.0.0.0 en lugar de libfoo.so.0.0.0)

También está relacionado con libtool

La solución es

%define __libtoolize    /bin/true

No X display available

Algunos paquetes requieren que estemos en un entorno gráfico al ser construidos. Si no es necesaria alguna interacción, esto se puede resolver con Xvfb: solo añada
BuildRequires: x11-server-xvfb
y ejecute el comando con xvfb-run, p.ej.
xvfb-run make check

undefined reference to `xxx'

Desde Mayo de 2008, los paquetes se construyen con --no-undefined para evitar el underlinking de las librerias compartidas.

gcc -shared foo.o -ldl /usr/lib/libglib-2.0.so /usr/lib/libXext.so ... -Wl,--no-undefined -o .libs/libkeymouselistener.so
.libs/keymouselistener.o: In function `parse_line':
.../gdm-2.20.6/gui/modules/keymouselistener.c:410: undefined reference to `XKeysymToKeycode'
collect2: ld returned 1 exit status

Lea underlinking para comprender como corregir esto.

Missing %files for subpackage xxx

Desde junio de 2008, subpackage xxx with no %files xxx devuelve un error fatal. Esto ayuda a detectar subpaquetes muertos o errores en el fichero .spec

También puede ocurrir en ficheros spec válidos, cuando "%files xxx" aparece dentro de un %if %ccc ... %endif. La solución consiste en poner la sección entera del %package xxx dentro de un %if %ccc ... %endif.

format not a string literal and no format arguments

Desde diciembre de 2008, cosas como printf(error_message) en vez de printf("%s", error_message) son detectados por -Werror=format-security, que se usa por defecto. La razón de que aperezca este error se describe en la siguiente página de Wikipedia: format string attack

Ejemplo de error:

fud.c:72: error: format not a string literal and no format arguments

arreglos sencillos

El arreglo puede ser algo como lo que sigue:

-      printf(xkblayouttext);
+      printf("%s", xkblayouttext);
-      syslog(LOG_ERR, error_message(r));
+      syslog(LOG_ERR, "%s", error_message(r));
-   snprintf(id_resp_command, MAXIDVALUELEN, *argv);
+   snprintf(id_resp_command, MAXIDVALUELEN, "%s", *argv);

(otro ejemplo: nautilus fix)

C++ code

Cuidado con los objetos de C++:

  QCString msgText = substitute(outputFormat, "$file", fileSubst) + '\n';
  fprintf(warnFile, msgText);

simplemente haciendo fprintf(warnFile, "%s", msgText) debería introducir un crash, como alerta gcc:

message.cpp:150: warning: cannot pass objects of non-POD type 'class QCString' through '...'; call will abort at runtime
message.cpp:150: warning: format '%s' expects type 'char*', but argument 3 has type 'int'

Has de hacer explícitamente (const char *):

fprintf(warnFile, "%s", (const char *) msgText);

o de forma más sencilla:

fputs(msgText, warnFile);

code doing % escaping by hand

Tenga cuidado con código raro como este (proveniente de doxygen):

  QCString msgText = substitute(substitute(outputFormat, "$file", fileSubst),
                                "%", "%%") + '\n';
  fprintf(warnFile, msgText);

Lo siguiente: fputs(msgText, warnFile) modifica el entorno del programa debido a que %se mostrara como %% ya que % es ignorado en msgText. La solución correcta es deshacerse de %s ignorándolo también:

  QCString msgText = substitute(outputFormat, "$file", fileSubst) + '\n';
  fputs(msgText, warnFile);

Pero también puede quitar la advertencia (warning) (lea más abajo) y mantener intacto el código, ya que es valido (aun si es horrible).

quitando la advertencia

Si el codigo es valido, puede desactivar la revisión usando %define Werror_cflags %nil

El uso de -Werror=format-security esta inspirado en Debian Hardening y Ubuntu CompilerFlags que utilizan -Wformat-security para detectar estos casos. Pero las advertencias no son suficientes (especialmente por que Mandriva no mantiene registros(log) de compilación), así que Mandriva eligio forzar el cumplimiento haciendo estas advertencias fatales.

advertencias en la construcción

overlinking

Para disminuir el overlinking, el rpm puede mostrar algunas advertencias:

Warning: unused libraries in /usr/bin/xdm: /usr/lib/libXext.so.6 /usr/lib/libXt.so.6 /usr/lib/libSM.so.6 /usr/lib/libXpm.so.4 /usr/lib/libxcb-xlib.so.0 /usr/lib/libxcb.so.1

Lea esto para entender como se arregla.

underlinking

Para disminuir el underlinking, el rpm puede mostrar alguna advertencias:

Warning: undefined symbols in /usr/lib/libgmodule-1.2.so.0.0.10: g_free g_thread_functions_for_glib_use g_threads_got_initialized ...

Lea esto para entender como se arregla.

check errors

Rpmlint errors

script-without-shebang

Lea esto para comprender que es el shebang.

Este error aparece cuando un script no tiene el shebang adecuado. Si el script no esta destinado a ser directamente ejecutado (p.ej. una definición de subrutina de perl que sera llamada desde el script perl principal) quite el atributo de ejecución al archivo correspondiente en la sección %file del archivo spec (ponga los permisos 0644).

no-signature

El paquete no fue firmado con una llave gpg. Necesita utilizar rpm --sign package.rpm después de haber construido el paquete. Esto no es un problema si planea enviar el rpm a los contribuidores o a otro proyecto de empaquetamiento, ya que ellos usualmente firman el paquete con la llave del proyecto. Puede ignorarlo en la configuración de rpmlint.

binary-or-shlib-defines-rpath

'The binary or shared library defines the PATH'. Usualmente esto es un mal síntoma porque ancla la ruta para buscar bibliotecas, haciendo difícil mudarlas. Lo más seguro es que en el fichero Makefile haya una línea de la siguiente guisa: gcc test.o -o test -Wl,--rpath.

Si el programa usa ./configure, probablemente pueda añadir --disable-rpath (comprobar con ./configure --help para ver si la opción está disponible).

Puede mirar en el wiki de Debian para más información.

Si no puede cambiar eso fácilmente, puede usar chrpath -d en el fichero dado al final de %build. En ese caso, no olvide añadir BuildRequires2: chrpath a su spec.

configure-without-libdir-spec

Esto suele pasar cuando usa el macro %configure o %configure2_5x para llamar al script configure. Ellos ejecutan configure con opciones predefinidas por defecto, de manera que los ficheros se instalen en su lugar correcto. Puede ignorar el error si las fuentes contienen un script configure que no fue generado por autoconf.

explicit-lib-dependency

No incluyas dependencias del tipo "Requires: libdvdread3" en tu fichero spec. Las dependencias de bibliotecas se manejan automáticamente, así que si tu programa necesita libdvdread.so.3, el paquete libdvdread3 será una dependencia automáticas. Además, esto no se porta a arquitecturas como amd64, donde el paquete se llama lib64dvdread3. Si de verdad necesita una dependencia de cierta biblioteca, por ejemplo, para forzar una actualización a una nueva versión, use el nombre virtual indicado por el paquete, que en este ejemplo es "Requires: libdvdread".

invalid-directory-reference

No incluya ficheros en /tmp ni en /home en su paquete.

lib-package-without-%mklibname

Si rompe o desgrana paquetes de bibliotecas, debería usar el macro %mklibname para generar el mismo nombre del paquete de la biblioteca. Más información acerca del uso de %mklibname se encuentra en la sección library policy.

no-prereq-on

Ejemplo de error: no-prereq-on rpm-helper

Solución: Añadir "Requires(pre): rpm-helper", "Requires(preun): rpm-helper" requerido por el paquete.

prereq-use

Ejemplo de error: prereq-use rpm-helper

Solución: prereq-use ya no se usa, y en su lugar hay que usar Requires(stage) con stage en {pre,post,preun,postun}. Por ejemplo: Requires(post): rpm-helper

no-signature

Los paquetes se firman durante el proceso de subida, así que puede ignorarlo o bien añadir addFilter("E: .* no-signature") en el fichero ~/.rpmlintrc.

Advertencias Rpmlint

spurious-executable-perm

FIXME

De un empaquetado inexperto:

Puede suceder, por ejemplo, para ficheros doc (README, COPYING, etc...) que tienen permiso de ejecución en el tarball fuente. Para solucionarlo, ha de arreglar los permisos, por ejemplo en la sección %build.

dangling-relative-symlink

El enlace simbólico no apunta a ningún sitio. Si está seguro de que el fichero al que se apunta debe estar ahí (por ejemplo, requiriendo el paquete que lo contiene) puede ignorarlo sin más. De lo contrario, arréglelo :-)

invalid-packager

La etiqueta del empaquetador es incorrecta. Necesita ser la misma que la opción Packager. Por defecto, rpmlint usa un regexp: '@mandrakesoft.com|@linux-mandrake.com|@mandrake.org|https?://qa.mandrakesoft.com|http://www.mandrakeexpert.com', que se encuentra en TagsCheck.py ( search DEFAULT_PACKAGER ). Esto no es un problema si se manda el paquete a contribs, ya que la etiqueta del empaquetador debería ser reemplazada cuando el paquete se reconstruye, a menos que la añadiera en el fichero spec.

incoherent-init-script-name

El nombre del init script ha de ser igual al del nombre del paquete en minúsculas.

no-default-runlevel

El runlevel por defecto no está especificado en el init script. Ha de añadir una línea como la siguiente en el cabecero del init script:

# chkconfig: 2345 04 70

2345 son los runlevels por defecto. Cuando se instale, el paquete será lanzado en los runlevel 2, 3, 4 y 5, y parado en los 1 y 6. Los número 04 y 70 indican el orden de inicio y de parada. Véase Initscript Howto para más información.

postin-without-ghost-file-creation

Etiquetaste un fichero con %ghost pero no lo creaste ni en %postin ni en %prein.

Errores al subir

No ha construido un paquete con los cambios del paquete previo

paquetes de depuración

Los paquetes de depuración Debug se construyen por defecto en Cooker, pero a veces esto no es así, así que necesita una manera de activar y desactivarlo. Para ello, añada estas dos líneas en el archivo spec para desactivar paquetes debug:

%define ''enable''debug_packages %{nil}
%define debug_package          %{nil}
Herramientas personales
Otros idiomas
Looking for a job?