… 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 …