Solucionando: Creación de metapaquetes Debian

10 03 2010

Hará desde fin del año pasado que estoy metido con la gente de GNUtn, un grupo de usuarios de software libre de la UTN. Junto con gente de otras regionales de esa universidad (nosotros perteneceríamos/representaríamos a la FRBA) está la idea de sacar adelante una distribución de GNU/Linux que incluya todo el software necesario para todas las materias de la cursada en la facu.

Para esto, pensamos basarnos en un Ubuntu (por el soporte y su user-friendlydad), y, por tanto, pensamos resolver el tema de la instalación del software mediante muchos metapaquetes.

Como no tengo ni idea de cómo hacerlos (buen, sí… pensaba bajar un metapaquete X y modificar uno por uno sus archivos – se pueden abrir con file-roller o cualquier manejador de archivadores), googleé un poco, y llegué a este post de Ernesto Crespo Avila, donde explica la creación de estos metapaquetes con dos comandos del mismo programa: equivs-control y equivs-build, ambos incluidos en el paquete equivs.

La cuestión es simple. Primer paso: instalar el programa.
$ sudo aptitude install equivs

Segundo paso: crear la plantilla del archivo control. Para esto usamos equivs-control:
$ equivs-control NOMBRE-DEL-ARCHIVO

Esto nos creará un archivo llamado NOMBRE-DEL-ARCHIVO en la carpeta actual con una plantilla de archivo control. El NOMBRE-DEL-ARCHIVO puede ser arbitrario ya que sólo es para que equivs sepa con qué datos trabajar, pero no necesariamente debe coincidir con el nombre del paquete (aunque es una buena idea hacerlo ‘descriptivo’).

Para ilustrar con ejemplos, voy a usar un archivo MiEjemplo.control, pero el nombre y la extensión son COMPLETAMENTE arbitrarios: equivs-control MiEjemplo.control

Teniendo la plantilla generada, vamos a editarla.
$ NOMBRE-DE-TU-EDITOR-FAVORITO NOMBRE-DEL-ARCHIVO

En mi caso, soy básico y ejecuto gedit MiEjemplo.control.

Ahora bien, miremos qué tiene este archivo que nos creó. Debería parecer algo así:
### Commented entries have reasonable defaults.
### Uncomment to edit them.
Section: misc
Priority: optional
Standards-Version: 3.6.2
 
Package: <package name; defaults to equivs-dummy>
# Version: <enter version here; defaults to 1.0>
# Maintainer: Your Name <yourname@example.com>
# Pre-Depends: <comma-separated list of packages>
# Depends: <comma-separated list of packages>
# Recommends: <comma-separated list of packages>
# Suggests: <comma-separated list of packages>
# Provides: <comma-separated list of packages>
# Replaces: <comma-separated list of packages>
# Architecture: all
# Copyright: <copyright file; defaults to GPL2>
# Changelog: <changelog file; defaults to a generic changelog>
# Readme: <README.Debian file; defaults to a generic one>
# Extra-Files: <comma-separated list of additional files for the doc directory>
Description: <short description; defaults to some wise words>
 long description and info
 .
 second paragraph

El archivo se auto-describe bastante bien. Las líneas que comienzan con uno o más # son comentarios, por lo que serán ignoradas al crear el paquete.

Intentaré hacer una breve descripción de los campos que se para qué sirven:

  • Standards-Version: versión de la Debian policy que implementa el paquete
  • Package: nombre del paquete (sin número de versión ni nada… algo estilo nombre-del-paquete, por lo general – probablemente la Debian policy diga algo al respecto, pero no tengo idea)
  • Version: versión del paquete
  • Mainteiner: nombre del mantenedor del paquete (probablemente seas vos) en formato Nombre Del Mantenedor <email@dominio.com>
  • Depends: lista de los paquetes de los que depende nuestro metapaquete, separados por comas. También vale usar operadores como | para decir que puede elegirse uno de entre varios paquetes (por ejemplo, un paquete puede que necesite instalar el paquete A y el paquete B, o el paquete A y el paquete C… para eso, decimos que depende de A, (B|C))
  • Architecture: arquitectura de hardware para la que está diseñada el paquete. Hay altas probabilidades de que nos interese que sea ‘all’ (es decir, todas las plataformas)
  • Copyrigth: path al archivo de texto plano que contiene la licencia de nuestro programa. De no especificar, se usa la GPLv2 (acá está la GPLv3 en txt)
  • Changelog: path a un archivo con el changelog del paquete (registro de cambios). Si no se especifica, se crea uno genérico
  • Readme: path a un archivo con el texto del README.Debian del paquete (no tengo idea de qué es). También existe la chance de no especificarlo y usar uno genérico
  • Extra-files: lista separada por comas de archivos adicionales a incluir en la carpeta doc del paquete
  • Description: descripción corta del paquete, resumen del mismo
  • Abajo de esto podemos ver dos lineas que dicen ‘long description and info’ y ‘second paragraph’. Después de la linea ‘Description’ podemos agregar la descripción larga del paquete, donde se explica con más detalle qué hace, para qué sirve y qué contiene el paquete. Para esto, tenemos que agregar, después de la linea del campo Description, las lineas de descripción larga que queremos, teniendo en cuenta que antes del texto hay que agregar un espacio. Es decir, si queremos decir ‘este paquete es excelente’, tenemos que escribir ‘ este paquete es excelente’. Además, para separar párrafos hay que dejar una línea que únicamente contenga ‘ .’ (es decir, un espacio y un punto).

    A modo de ejemplo, yo estuve creando el metapaquete para instalar el software de la carrera de Ingeniería en Sistemas de la FRBA. Este es el archivo MiEjemplo.control modificado:
    Section: utn
    Priority: optional
    Standards-Version: 3.6.2
     
    Package: sistemas-frba
    Version: 2010.03.10.1
    Maintainer: Desert69 <desert69@gmail.com>
    Depends: sistemas-frba-1, sistemas-frba-2, sistemas-frba-3, sistemas-frba-4, sistemas-frba-5
    # Recommends: <comma-separated list of packages>
    # Suggests: <comma-separated list of packages>
    # Provides: <comma-separated list of packages>
    # Replaces: <comma-separated list of packages>
    Architecture: all
    Copyright: gplv3.txt
    # Changelog: <changelog file; defaults to a generic changelog>
    # Readme: <README.Debian file; defaults to a generic one>
    # Extra-Files: <comma-separated list of additional files for the doc directory>
    Description: Metapaquete de Ingeniería en Sistemas de la FRBA
     Este es un metapaquete para instalar todo el software necesario para cursar los 5 años de la carrera de Ingeniería en Sistemas de Información en la Facultad Regional Buenos Aires de la Universidad Tecnologica Nacional
     .
     sistemas-frba es un paquete proveido por UTNcillo para facilitar la instalación del software necesario para cursar la carrera. Este paquete está mantenido por Desert69.

    Como se puede ver, cambié la Section a utn, algo que no se si funcionará o no (no tengo idea, ya preguntaré a alguien que sepa). El paquete se llama sistemas-frba, y como versión decidí usar la fecha en que se crea el paquete, tampoco se bien por qué. El manteiner soy yo, con mi mail. Y como dependencias están los metapaquetes que tendré que crear para cada uno de los 5 años de la carrera de Sistemas. Mi paquete soportará todas las arquitecturas (porque, al ser metapaquete, delego el problema de la arquitectura a los paquetes que contienen el software real), y como licencia puse la GPLv3 que comenté hace un rato, que está guardada en un archivo ‘gplv3.txt’ en el directorio en que estoy trabajando. Obvié Changelog, Readme y Extra-files, y puse una bonita descripción del paquete.

    Una vez que tenemos el archivo listo, último paso: equivs-build, para crear el paquete.
    $ equivs-build NOMBRE-DEL-ARCHIVO

    Si todo funciona bien, al terminar la ejecución de ese comando tendremos en el directorio en que estamos trabajando un nuevo archivo llamado <Package>-<Version>_<Architecture>.deb

    En mi caso, la orden fue equivs-build MiEjemplo.control, y el programa contestó:
    dh_testdir
    dh_testroot
    dh_clean -k
    dh_testdir
    dh_testroot
    dh_install
    dh_installdocs
    dh_installchangelogs
    dh_compress
    dh_fixperms
    dh_installdeb
    dh_gencontrol
    dh_md5sums
    dh_builddeb
    dpkg-deb: construyendo el paquete `sistemas-frba' en `../sistemas-frba_2010.03.10.1_all.deb'.

    The package has been created.
    Attention, the package has been created in the current directory,
    not in ".." as indicated by the message above!

    Todo en orden, así que tengo un hermoso sistemas-frba_2010.03.10.1_all.deb listo para usarse.

    Errores

    Si al ejecutar equivs-build hay algo en el archivo que está mal, el programa contestará con algo como syntax error in control file: [TODA-LA-LINEA-QUE-TIENE-ERROR] y no creará el paquete. En caso de que la linea del error sea alguna de las lineas de la descripción larga, lo más probable es que nos hayamos olvidado que la línea TIENE que empezar con un espacio en blanco como prefijo, algo que en muchas otras páginas no se nota, porque el espacio en blanco no se mostraba en la web (y la principal motivación para escribir este artículo).

    Así que buen… ¡happy hacking! (???)


Acciones

Information

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s