Ampliando debian/rules …

debian-logo… y aprovechando mejor su potencial sin liarla en exceso.

Supongamos que estamos construyendo un paquete Debian que incluye un par de archivos de control de servicios (los típicos bajo /etc/init.d/) y otro par de configuraciones para el rotador de registros (éstos bajo /etc/logrotate.d) y que queremos hacerlo según la normativa Debian.

Si construímos el armazón de archivos bajo debian/ empleando dh_make obtendremos directamente un archivo Make de construcción del proyecto con el nombre debian/rules y que tiene el siguiente aspecto: 

#!/usr/bin/make -f

%:
        dh $@

Muy pelado, ¿ verdad ? Pues funciona de maravilla. No en vano el autor es Joey Hess, el creador del famoso ikiwiki que yo empleaba antes. Es muy buen programador y comprende bastante bien cómo funciona Debian y su sistema de empaquetado. Y hasta aquí la publicidad, ahora vamos con el caso real de antes.

El programa dh llama por orden a todos los demás para realizar la construcción y el empaquetado final, pero los llama con los parámetros predeterminados y éstos, en este caso concreto, se quedan cortos. ¿ Por qué ? Pues porque sólo están pensados para instalar un componente por vez.

Por ejemplo el instalador de servicios dh_installinit busca dentro de debian/ un archivo para el servicio y otro para los valores predeterminados. El primero debe estar nombrado como debian/paquete.init que situará en /etc/init.d/paquete mientras que el segundo tendrá como máscara debian/paquete.default e irá en /etc/default/paquete. ¿ Y si hay más ? No, no puede haber más con ese método de nombrado. Tendremos que invocar al componente debhelper directamente para afinar más.

Para estos casos el componente dh_installlogrotate acepta un parámetro llamado –name nombre que le indica que busque el servicio como debian/paquete.nombre.init y lo instale como /etc/init.d/nombre. Con los valores predeterminados otro tanto: busca debian/paquete.nombre.default y lo instala como /etc/default/nombre. Y ya que es posible llamarlo varias veces podremos resolver el problema de tener varios archivos de servicio, varias rotaciones de registros o varios lo que sea en el mismo paquete.

¿ Cómo definir en el archivo debian/rules lo que queremos hacer ? Fácil. Basta con especificar un objetivo especial que sustituya (override) la fase en la que queremos actuar.

Pongo un ejemplo porque es trivial una vez que se ve:

#!/usr/bin/make -f

%:
	dh $@ 

override_dh_installinit:
	dh_installinit --name demonio1 
	dh_installinit --name demonio2 

override_dh_installlogrotate:
	dh_installlogrotate --name demonio1 
	dh_installlogrotate --name demonio2

Sencillo y limpio. Otra cosa es que una vez instalados funcionen, pero eso, como dicen, es otra historia …