Lihuen
RSSRSS AtomAtom

Cómo crear paquetes con debhelper

El sistema de empaquetado de Debian es bastante complejo, por ello suele parecer complejo generar paquetes .deb pero realmente no es tan complejo como parece, sólo hace falta usar los asistentes de debhelper que ahorran muchísimo trabajo.

En este documento se plantea a grandes rasgos como generar un paquete, antes de leer esto el empaquetador debería leer:

Vídeo introductorio (en inglés):

Usaremos como ejemplo para este documento el procedimiento usado para crear el paquete de la herramienta Ltspconfig.

Instalando los paquetes necesarios

Además de los paquetes necesarios para compilar nuestra aplicación precisaremos:

  • build-essential
  • dh-make
  • fakeroot
apt-get install build-essential dh-make fakeroot

Creando el esqueleto del paquete

A continuación usaremos dh_make para crear la estructura básica del paquete.

Tendremos que acomodar el código fuente de nuestro futuro paquete en un directorio que tenga la forma nombre-versión, por ejemplo: ltspconfig-0.2. Es importante respetar esta convención para que todo salga bien.

Para crear el "esqueleto" del paquete usaremos dh_make pasándole como argumentos y como variables de entorno algunos datos del programa y del maintainer del mismo. Es importante destacar que mientras más datos especifiquemos en esta etapa menos trabajo manual tendremos que hacer en el futuro.

Primero especificaremos los datos del "maintainer" del paquete usando 2 variables de entorno (El maintainer es el encargado de mantener el paquete y no necesariamente sea el creador de la aplicación). Para esto contamos con:

  • DEBFULLNAME -> Nombre completo
  • DEBEMAIL -> Dirección de e-mail

En nuestro caso usamos (reemplazando el [at] por una arroba):

export DEBFULLNAME="Soporte Lihuen"
export DEBEMAIL=soportelihuen[at]linti.unlp.edu.ar

Luego debemos indicar las características de nuestro proyecto con los argumentos de dh-make, éstos están bien detallados en la ayuda de la aplicación y solo nombraremos los usados en este ejemplo, que creo son los más comunes.

-n
El paquete será "nativo", esto generará un .tar.gz con el contenido de la carpeta ltspconfig-0.2 incluyendo archivos generados con el fin de describir el paquete.
Si quisiéramos adaptar un .tar.gz existente al no indicar "-n" evitaríamos ensuciar el código fuente del upstream con los archivos del paquete.
-s
Nuestro código fuente generará un solo paquete (es posible generar múltiples paquetes desde un solo fuente).
-c
Copyright, esto generará un archivo con la licencia de nuestra aplicación, si no lo indicamos en esta etapa habrá que crearlo manualmente más tarde.

Poniendo esto en práctica nos movemos al directorio de los fuentes y ejecutamos dh_make

cd ltspconfig-0.2
dh_make -n -s -c gpl

También es posible hacer todo en una sola línea:

DEBFULLNAME='Soporte Lihuen' DEBEMAIL='soportelihuen[at]linti.unlp.edu.ar' dh_make -n -s -c gpl

Personalizando el paquete

Si nuestro paquete usa Makefile o algo parecido no hace falta mucho trabajo extra. En nuestro caso ltspconfig-0.2 usa el setup.py un método de instalación de python similar en su uso a los Makefile.

1. Primero debemos llenar los detalles en ltspconfig-0.2/debian/control, llenamos las descripciones, la sección y las dependencias de nuestro paquete. El resto ya está preconfigurado.

2. Modificamos el archivo ltspconfig-0.2/debian/rules (tiene formato de makefile) reemplazando cada invocación de $(MAKE) por una equivalente que ejecute "python setup.py", si ya usábamos un Makefile que soporte la variable $DESTDIR no hace falta nada más.

3. Creamos un menú para ltspconfig, en base a ltspconfig-0.2/debian/menu.ex

?package(ltspconfig):needs="X11" section="Applications/System/Administration"\
  title="ltspconfig" command="/usr/bin/su-to-root -X -c /usr/bin/ltspconfig"

4. Si es necesario modificamos el changelog en ltspconfig-0.2/debian/changelog

Compilando el paquete

Para compilar el paquete usamos dpkg-buildpackage estando ubicados dentro del directorio del paquete.

Otra opción es usar debuild, que luego de compilar ejecuta "lintian" para mostrar distintos warnings y errores en el paquete.

Generando nuevas versiones

Para generar nuevas versiones es necesario ir actualizando el changelog, teniendo atención a la sintáxis del mismo ya que es muy sensible a errores, y luego compilar el paquete con dpkg-builpackage.

Una forma sencilla es utilizar la herramienta debchange del paquete devscripts. Algunos ejemplos de uso son (Es importante exportar o anteponer las variables DEBFULLNAME y DEBEMAIL como se indica más arriba):

  • Editar el changelog de la versión actual:
debchange
  • Crear una nueva entrada en el changelog e incrementar la versión (por ejemplo si teniamos 0.1, crea una entrada para la versión 0.2):
debchange --increment
  • Crear una entrada con una versión "local", usando un separador (por ejemplo si teniamos 0.1, crea una entrada para 0.1-1):
debchange --local -

Esta herramienta está muy bien documentada en su página man y tiene una gran cantidad de parámetros para modificar su comportamiento, los indicados aquí son solo para ilustrar unos pocos de sus posibles usos.

El comando debchange parte del paquete devscripts.

Paquetes Python

Para paquetes Python que se puedan instalar con setup.py se puede seguir la guía: http://wiki.debian.org/Python/Packaging que presenta una herramienta que automatiza todo.

O bien , se puede poner lo siguiente en debian/rules:

#!/usr/bin/make -f
# -*- makefile -*-
# Uncomment this to turn on verbose mode.
#export DH_VERBOSE=1

%:
	dh $@

install-*:
	dh_pysupport $@

Aplicando cambios a un paquete ya existente

Existen casos en los cuales es necesario parchar determinados paquetes para adaptarlo a nuestras necesidades, pero también se complica un poco cambiar changelog + generar parches como la gran mayoria realiza cotidianamente; Hoy existen herramientas en Debian que proveen una forma mucho mas amigable de realizarlo.

ejemplo:

  Descargar un fuente con apt-get source nombrePaquete.

dentro de la carpeta nombrePaquete/debian/patches se encuentran una lista de archivos que contienen parches sobre los fuentes originales.

realizamos los cambios sobre los archivos luego antes de generar el paquete ejecutamos debchange -i completamos los datos que nos piden entonces, y luego dpkg-source --commit seguimos los pasos y por ultimo empaquetamos el paquete con dpkg-buildpackages.

Otra opción de más bajo nivel es usar Quilt

Es muy importante recordar configurar y exportar la variable QUILT_PATCHES como se indica en su documentación: http://wiki.debian.org/UsingQuilt