Empaquetando software para Debian
Contenido |
Resumen
Creación de paquetes DEB en base a software
Introducción
Esta es una guía relativamente sencilla (Debido al gran avance que ha habido con las herramientas de parte de la gente de Debian) que sin embargo debe usarse con sumo cuidado. El enfoque a usar es debmake, debuild y quilt como herramientas para empaquetado
Procedimiento
Instalación de paquetes
Estos paquetes se refieren a las herramientas que vamos a usar para empaquetar. El software que va a instalar podría necesitar otros paquetes, así que antes de empaquetarlo, debería probar a compilarlo para resolver todas las dependencias que necesite.
apt install debmake devscripts quilt git
Preparando la mesa de trabajo
Para facilitar todo, considere usar un par de variables desde consola
nombre=paquete version=0.1
Las fuentes del software a empaquetar deben ser instaladas en un directorio que se llame <nombre_del_paquete>-<version>. Al mismo nivel que este se van a guardar todos los ficheros resultado del proceso de empaquetado, incluyendo precisamente el .deb
. Así que lo recomendado es crear un directorio antes, quizá algo con el nombre más genérico del paquete.
Es decir:
mkdir $nombre cd $nombre
Obteniendo el paquete
Lo más común es que el software a empaquetar se encuentre en github. Lo recomendable es que use el comando git para obtenerlo.
git clone https://github.com/usuario/paquete $nombre-$version
Necesitamos crear un tar.gz con el mismo nombre del directorio ya que debmake no lo hace
tar czvf $nombre-$version.tar.gz $nombre-$version
Ya que no tenemos nada parecido, vamos a crear el proyecto más simple del mundo:
mkdir $nombre-$version cat <<"MAFI">$nombre-$version/main.c #include <stdio.h> int main(){ printf("Hola Mundo\n"); return 0; } MAFI
cat <<"MAFI">$nombre-$version/Makefile salida:=saludador saludador: gcc main.c -o $(salida) install: install -m 0775 $(salida) /usr/local/bin .PHONY: clean uninstall: rm /usr/local/bin/$(salida) MAFI
Probamos que la compilación de nuestro paquete vaya bien:
cd $nombre-$version # make gcc main.c -o saludador # make install install -m 0775 saludador /usr/local/bin # saludador Hola Mundo
Ahora borramos y eliminamos todo rastro de compilación
# make uninstall rm /usr/local/bin/saludador
También creamos el tar para este pequeño proyecto
cd .. tar czvf $nombre-$version.tar.gz $nombre-$version
Debianizando el paquete
Debianizar un paquete se refiere a crear una serie de ficheros que:
- Controlan como el paquete será creado (
debian/control
por ejemplo) - Permite realizar algunos script en el proceso de instalacion (debian/postins, para realizar tareas de configuración al instalar el paquete)
- Dota al software de algunos añadidos esenciales para estar dentro del sistema (Páginas de README y MAN)
De todas las opciones posibles, usamos debmake dentro del directorio con las fuentes del software
cd paquete-0.1/ debmake -e alortiz@salud.gob.sv -f "Alexander Ortíz"
Solucionando problemas de compilación
debuild
se limita a ejecutar el proceso de compilación de la forma más sencilla posible. La construcción de este paquete va a fallar en varias maneras. La solución más sencilla (Me llevo como cuatro días darme cuenta) es la de modificar el Makefile. Como Makefile es básicamente parte del programa, es una mala idea que lo modifiquemos así nada más: La forma más correcta de hacerlo (Y tener un paquete apegado a las buenas prácticas) es la de crear un parche para nuestra aplicación. Usaremos <quilt>
# export QUILT_PATCHES=debian/patches/ # quilt new 01_construccion Patch debian/patches//01_construccion is now on top # quilt add Makefile File Makefile added to patch debian/patches//01_construccion
En este punto, ya podemos hacer las modificaciones necesarias. El archivo debe quedar de la siguiente forma:
cat <<"MAFI">Makefile salida:=saludador saludador: gcc main.c -o $(salida) install: mkdir -p $(DESTDIR)/usr/bin install -m 0775 $(salida) $(DESTDIR)/usr/bin .PHONY: clean uninstall: rm $(DESTDIR)/usr/bin/$(salida) clean: rm saludador MAFI
Los principales cambios han sido:
* Agregamos la variable $(DESTDIR) como prefijo a todas las rutas. Esta es una buena práctica que debería usarse siempre * Ahora que será un paquete más oficial, le es permitido (Y de hecho necesario) dejar de usar/usr/local/
por/usr/
* Creamos el directorio donde vamos a instalar el fichero. Lo que adquiere más sentido al construir el software dentro de este proceso de empaquetado. Este es un punto bastante medular de todo este proceso.
Antes de guardar los cambios, puede probar a compilar el paquete, y verá que sigue funcionando. Esto es porque todo lo que agregamos se consideran buenas prácticas en la elaboración de un Makefile que compile software.
Ahora guardamos los cambios y revertimos los cambios. El paquete sigue siendo una copia exacta de parte del proveedor, nuestros parches están en debian/patches, todo muy estándar
# quilt refresh Refreshed patch debian/patches//01_construccion # quilt pop -a Removing patch debian/patches//01_construccion Restoring Makefile No patches applied
Contruyendo el paquete
En este momento, habrá visto que todo es bastante más sencillo de lo que se puede creer en un principio. En este punto, bastará con correr el siguiente comando
debuild -us -uc
Y básicamente, eso es todo. Un directorio atrás de las fuentes se encuentra el paquete. Se instala con dpkg -i
# dpkg -i ../paquete_0.1-1_amd64.deb Seleccionando el paquete paquete previamente no seleccionado. (Leyendo la base de datos ... 43811 ficheros o directorios instalados actualmente.) Preparando para desempaquetar ../paquete_0.1-1_amd64.deb ... Desempaquetando paquete (0.1-1) ... Configurando paquete (0.1-1) ... # saludador Hola Mundo
En principio, debuild
puede ser corrido muchas tanta veces como se desee; en la práctica, puede presentar algunas complicaciones según el paquete.
Hasta este punto, este paquete es funcional.
Mejoras: Cumpliendo las normas de empaquetado
Hacia el final de la salida del comando hay unas lineas del tipo W: paquete
Se refieren a ciertas cosas que deben arreglar en los archivos en debian/