Creando Paquetes RPM: Sin Fuentes Y Sin Autotools

por | 5 octubre, 2008

Hola, vamos a continuar el tutorial sobre cómo crear paquetes RPM que empecé el otro día, si me lees te advierto que antes leas la primera parte de este tutorial si no lo hiciste antes.
Bien, en esta segunda parte trataré de explicar cómo crear un paquete rpm de un programa del cual no poseemos sus fuentes.
Recordar antes que en el mundo rpm lo de fuentes es referirnos a que el programa a empaquetar no posee el paquete en formato src-rpm, en cuyo interior se encuentra el fichero de extensión spec; lo cual nos obliga a crearlo por nuestra cuenta.
La explicación se basará mediante un ejemplo concreto, me basaré sobre el programa VerTV de nuestro coleguilla Alberto.
El primer paso será obtener el programa a empaquetar en formato comprimido, es fuertemente recomendable que esté comprimido en formato .tar.bz2, así que si no lo está lo podemos cambiar fácilmente con una simple descompresión y volviendo a comprimir en dicho formato, lo podéis realizar con un patr de clicks sin tener que aplicar ningún comando por terminal, al estilo ventanas Si queréis os podéis bajar el programa de AQUI, para hacer una práctica interactiva.
Detengámonos un suspiro en este punto para aclarar una cosa, si abrís el comprimido de VerTV notaréis que si intentamos instalarlo directamente no podemos hacerlo mediante la típica compilación del programa ya que no figuran los ficheros correspondientes. Hasta el momento yo conozco tres formas de hacer esta compilación:

1. Mediante Autotools-> Con configure y make
2. Mediante la forma cmake
3. Mediante Scons-> Es una herramienta similar a autotools

Otra forma sería que el programa fuese de codigo python y llevase un fichero instalador, pero esto ya escapa de este ámbito explicativo. Hasta aquí este pequeño inciso para aclarar a qué me refiero cuando en el título he escrito lo de “Sin Autotools”.
Bien, nuestro programa VerTV no lleva autotools y, por tanto, deberemos tenerlo muy en cuenta para crear el fichero spec que os explico en breve.
Bueno si has leido mi primera parte del tutorial recordarás quie en nuestro directorio ppal. creamos un directorio raíz llamado rpm con una serie de subdirectorios, de esos directorios hay uno que se llama SOURCES, dentro de dicho directorio debéis meter el fichero .tar.bz2 de vuestro programa, ¡sin descomprimirlo!. En nuestro ejemplo concreto se llama vertv-1.0.1.tar.bz2; ya tenemos otro paso superado
El siguiente peldaño será crear el fichero .spec, este paso es el más dificultoso e importante de todo el proceso. Os pongo primero como guía el de nuestro ejemplo y os voy explicando lo más importante. Al fichero le he llamado vertv.spec, debéis guardarlo en la ruta rpm/SPECS, y se puede escribir con gedit, kate o el que más os mole. Aquí tenéis el mio:

  1. Name: vertv
  2. Version: 1.0.1
  3. Release: 1
  4. URL: http://diariodeunlinux3ro.es/
  5. Summary: Front-end para Sopcast
  6. License: GPL
  7. Group: Internet/Remote Access
  8. Source0: vertv-1.0.1.tar.bz2
  9. BuildRoot: %{_tmppath}/%{name}-%{version}-buildroot
  10. Requires: zenity >= 2.20, totem >= 2.18, mplayer >= 0.99, vlc >= 0.8.0, libstdc++5-devel, libstdc++5, glibc, gcc, libgcc1
  11. Provides: %{name}, ld-linux.so.2(GLIBC_PRIVATE),libc.so.6(GLIBC_PRIVATE)
  12.  
  13. %description
  14. VerTV es un front-end realizado por Alberto Jimenez (http://diariodeunlinux3ro.es) mediante zenity gracias al cual podremos visualizar vídeos de Sopcast. El objetivo de este proyecto es construir una interfaz potente y bonita, aunque zenity no sea muy apropiado para ello. Sin embargo, zenity hace que sea muy intuitivo el manejo del programa.
  15.  
  16. Más información en: http://diariodeunlinux3ro.es
  17.  
  18. %prep
  19. %setup -q -a 0
  20.  
  21. %install
  22. rm -rf $RPM_BUILD_ROOT
  23. install -D -m 755 vertv.sh $RPM_BUILD_ROOT/usr/bin/vertv.sh
  24. install -D -m 755 sp-sc-auth $RPM_BUILD_ROOT/usr/bin/sp-auth/sp-sc-auth
  25. install -D -m 644 vertv.desktop $RPM_BUILD_ROOT/usr/share/applications/vertv.desktop
  26. install -D -m 644 vertv.png $RPM_BUILD_ROOT/usr/share/pixmaps/vertv.png
  27. install -D -m 755 postinst $RPM_BUILD_ROOT/usr/bin/sp-auth/postinst
  28.  
  29. %clean
  30. rm -rf $RPM_BUILD_ROOT
  31.  
  32. %post
  33. sh /usr/bin/sp-auth/postinst
  34. rm -f /usr/bin/sp-auth/postinst
  35.  
  36. %files
  37. %defattr(0755,root,root)
  38. /usr/bin/vertv.sh
  39. /usr/bin/sp-auth/sp-sc-auth
  40. /usr/share/applications/vertv.desktop
  41. /usr/share/pixmaps/vertv.png
  42. /usr/bin/sp-auth/postinst
  43.  
  44. %changelog
  45. * Mon Sep 22 2008 Cristobal Lopez <http://tobal.cymaho.com>
  46. - Modificando el fichero spec
  47. - Construir el rpm sin ser superusuario
  48. * Wed Sep 17 2008 Alejandro Sanchez <http://sinwindows.es>
  49. - Primer fichero spec
  50. - Conseguido que pregunte por la dependencia de Zenity
  51. - Contiene lo mismo que el .deb creado por Alberto

Bien, no os asustéis que no es muy difícil. Vamos con la explicación de un primer bloque:

  1. Name: vertv
  2. Version: 1.0.1
  3. Release: 1
  4. URL: http://diariodeunlinux3ro.es/
  5. Summary: Front-end para Sopcast
  6. License: GPL
  7. Group: Internet/Remote Access

En Name y Version ponemos el nombre del programa y la versión a empaquetar, en Realease ponemos el número de la versión del rpm que vamos a crear, normalmente será 1, pero si hacemos cambios en el rpm y no afectan a la versión del programa a empaquetar, el número será mayor que 1.
En URL ponemos la web de donde nos hayamos bajado el programa, en Summary ponemos en una línea de qué va el programa, ¡sin acentos!. En License ponemos la licencia del programa, en Group ponemos la sección a la que corresponde nuestro programa cuando aparezca en Rpmdrake, en el caso de Mandriva.
Pasemos a un segundo bloque:

  1. Source0: vertv-1.0.1.tar.bz2
  2. BuildRoot: %{_tmppath}/%{name}-%{version}-buildroot
  3. Requires: zenity >= 2.20, totem >= 2.18, mplayer >= 0.99, vlc >= 0.8.0, libstdc++5-devel, libstdc++5, glibc, gcc, libgcc1
  4. Provides: %{name}, ld-linux.so.2(GLIBC_PRIVATE),libc.so.6(GLIBC_PRIVATE)
  5.  
  6. %description
  7. VerTV es un front-end realizado por Alberto Jimenez (http://diariodeunlinux3ro.es) mediante zenity gracias al cual podremos visualizar vídeos de Sopcast. El objetivo de este proyecto es construir una interfaz potente y bonita, aunque zenity no sea muy apropiado para ello. Sin embargo, zenity hace que sea muy intuitivo el manejo del programa.
  8.  
  9. Más información en: http://diariodeunlinux3ro.es

En Source0 ponemos el nombre del comprimido que hemos puesto en el directorio SPECS. Si tuviésemos más ficheros en SOURCES que estuviesen relacionados con el programa añadiríamos Source1, Source2,…. hasta tenerlos todos. Aquí en los manuales que he leido recomiendan que pongáis la web, pero yo no os lo recomiendo si la web es muy larga y con símbolos raros, porque os dará error de sintaxis.
En BuidRoot os aconsejo que lo pongáis como está, su función es especificar que en /rpm/tmp se realizarán las operaciones necesarias de construcción del paquete rpm sin permisos de superusuario para no dañar nuestro sistema.
En Requires escribiremos las dependencias necesarias para que nuestro programa funcione, junto con la versión mínima de cada dependencia. Podemos añadir secciones como Suggests o Conflicts
La sección Provides se utiliza para especificar qué cosas extras provee nuestro programa, esto normalmente no deberéis ponerlo, lo que pasa es que este programa daba problemas con ciertas macros de C y se tuvo que hacer una triquiñuela, que solucionó Sin Windows.
En %description añadiremos una descripción más larga del programa y sin acentos.
Si habéis debianizado alguna vez un programa podréis discernir que hasta aquí se puede corresponder en un 99 % al fichero control de Debian. Pasemo a otro bloque:

  1. %prep
  2. %setup -q -a 0

Esto es un script en el cual lo que se hará es descomprimir el .tar.bz2 de nuestro programa en /rpm/BUILD y dejarlo todo preparado para la consrucción. Esto lo conseguimos con setup, con la opción -q nos lo descomprimirá de forma silenciosa, el 0 indica que lo haga con el Source0 que especificamos anteriormente, si tenemos más sources los especificamos aquí.

  1. %install
  2. rm -rf $RPM_BUILD_ROOT
  3. install -D -m 755 vertv.sh $RPM_BUILD_ROOT/usr/bin/vertv.sh
  4. install -D -m 755 sp-sc-auth $RPM_BUILD_ROOT/usr/bin/sp-auth/sp-sc-auth
  5. install -D -m 644 vertv.desktop $RPM_BUILD_ROOT/usr/share/applications/vertv.desktop
  6. install -D -m 644 vertv.png $RPM_BUILD_ROOT/usr/share/pixmaps/vertv.png
  7. install -D -m 755 postinst $RPM_BUILD_ROOT/usr/bin/sp-auth/postinst

En la sección install especificamos dónde se instalarán nuestros ficheros del programa a empaquetar, lo haremos con el comando install, por ejemplo:

  1. %install
  2. install -D -m 755 vertv.sh $RPM_BUILD_ROOT/usr/bin/vertv.sh

Lo que hará es indicar que el fichero vertv.sh se copiará/instalará en /usr/bin con permisos 755, de ejecución, creando los directorios que falten gracias a -D. Normalmente los permisos serán 644, y sólo pondremos permisos 755 a los que sean ejecutables. Es obligado introducir la macro $RPM_BUILD_ROOT para que sepa que será root. Podéis consultar sobre install mediante la terminal escribiendo man install.
Si no queréis hacerlo con install lo podéis hacer con mkdir y cp, pero os aconsejo hacerlo con install porque es como se hace normalmente en los ficheros make de autotools, ya que nos facilita lo de especificar los permisos.
Recalco que esto debemos hacerlo sólo en aquellos programas que no lleven autotools, en los demás veréis que es mucho más sencillo en una próxima entrega
La línea rm -rf $RPM_BUILD_ROOT es aconsejable ponerla para limpiar anteriores empaquetamientos, para ser más limpios.

  1. %clean
  2. rm -rf $RPM_BUILD_ROOT

Este código creo que esta claro lo que hace

  1. %post
  2. sh /usr/bin/sp-auth/postinst
  3. rm -f /usr/bin/sp-auth/postinst

Bien, esta sección de post no es frecuente añadirla, consiste en que cuando instalemos el rpm si hay que hacer alguna tarea posterior indicarle cuál hacer, en este caso se requiere que se ejecute el fichero postinst y luego se borre, no voy a explicar mucho más de ello, es un tema avanzado y que podéis obviar.

  1. %files
  2. %defattr(0755,root,root)
  3. /usr/bin/vertv.sh
  4. /usr/bin/sp-auth/sp-sc-auth
  5. /usr/share/applications/vertv.desktop
  6. /usr/share/pixmaps/vertv.png
  7. /usr/bin/sp-auth/postinst

Esta sección sirve para definir los atributos de nuestros ficheros del programa y hacer un listado de los ficheros que compondrán el paquete, se deben listar todos con su ruta, es bastante coñazo, nos podemos ayudar con el comando rpm -bi mipaquete.spec para un listado.

  1. %changelog
  2. * Mon Sep 22 2008 Cristobal Lopez <http://tobal.cymaho.com>
  3. - Modificando el fichero spec
  4. - Construir el rpm sin ser superusuario
  5. * Wed Sep 17 2008 Alejandro Sanchez <http://sinwindows.es>
  6. - Primer fichero spec
  7. - Conseguido que pregunte por la dependencia de Zenity
  8. - Contiene lo mismo que el .deb creado por Alberto

Esta sección no tiene nada de especial, tan sólo es una especie de diario sobre los distintos cambios realizados en el programa o paquete rpm, tan sólo debemos respetar la estructura para no tener fallos de escritura.
Con esto tenemos explicado el fichero .spec, como véis es un poco fastidioso, sobretodo cuando no lo tenemos hecho por alguien, es decir, no tenemos las fuentes, pero os aseguro que esto es la menor de las veces. Quisiera hacer notar que hay muchas formas de hacer el spec, yo he puesto un standard, no he puesto cómo añadir parches u otras cosas. Os recomiendo que os bajéis las fuentes de otros programas para aprender más del asunto.
Bueno llegamos al final del proceso, sólo nos queda crear el paquete con rpmbuild así:

  1. cd rpm
  2. cd SPECS
  3. rpmbuild -ba --clean --target noarch vertv.spec

La opción -ba especifica que construya el paquete y el paquete fuente src-rpm del programa, le hemos añadido en éste caso la opción –target noarch para aclarar que nuestro programa sirve para cualquier procesador. Si queremos firmar el paquete debemos añadir la opción –sign.
Si todo ha ido bien podéis encontrar vuestros paquetes en /rpm/RPMS y /rpm/SRPMS listos para probarlos y compartirlos.
Y hasta aquí esta segunda parte del tutorial #:-S
Fuente -> Construir RPM en la Wikipedia

Saludos :-h

4 pensamientos en “Creando Paquetes RPM: Sin Fuentes Y Sin Autotools

  1. protion9

    Mucho te veo con RPM… ¿Estás pensando en pasarte a Mandriva ahora que viene la nueva?

    El otro día la instalé en una máquina virtual y la verdad es que es una gozada. El asistente de instalación es muy intuitivo, no te instala paquetes que no necesitas. El centro de control es muy completo, me encanta. Lo malo: Konqueror no paraba de fallar y sigo viendo muy verde a KDE4 (¿Como oculto entradas en el menú principal? ¿Todavía no se puede ocultar el panel?), además tengo mis dudas con el tema de los repositorios en Mandriva. A veces te dan varias opciones a elegir con varias versiones de un paquete, eso es un poco confuso.

    Saludos.

  2. Pingback: Varios artículos interesantes 2 | YouZone!

  3. Cristobal

    Protion, el mandriva lo he puesto con Gnome, paso de KDE. Si logro que el modem me lo coja igual me paso a Mandriva.
    Alejandro tio gracias por tu ayuda y la edo abre el mensajero

Los comentarios están cerrados.