Problemas de Empaquetado
De Wiki de la Comunidad Mandriva
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ñadaBuildRequires: x11-server-xvfby 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}

