Como crear un paquete de debian sin software de ayuda - Descripcion del archivo "rules"

6 - Descripcion del archivo "rules"

[editar]
Tutorial creado por Miriam Ruiz. Extraido de: http://www.mononeurona.org/index.php?idp=242
28 de Octubre de 2005
DEFINICIONES INICIALES

Antes de nada, añadiremos una linea para que el sistema sepa que se trata de un script de "make" en caso de que sea ejecutado directamente:

#!/usr/bin/make -f

Ahora definiremos en una veriable el nombre del paquete para simplificar la gestion del archivo "debian/rules":

# Nombre del paquete package=roaddemo

En algun momento de la ejecucion deberemos asegurarnos de que estamos en el directorio correcto y que estamos ejecutando el scrito como "root" (o mediante el comando "fakeroot>"), por lo que definiremos un par de funciones:

# Funcion para comprobar que estamos en el directorio correcto define checkdir @test -f debian/rules -a -f roaddemo.cc || \ (echo Not in correct source directory; exit 1) endef # Funcion para comprobar si somos root define checkroot @test $$(id -u) = 0 || (echo necesitas privilegios de root; exit 1) endef

"checkdir" comprueba que exista un archivo "debian/rules", asi como que tambien exista otro con el nombre "roaddemo.cc" en el directorio actial. "checkroot" comprueba que seamos "root". Estas funciones han sido tomadas tal cual del sistema de construccion de paquetes de from Manoj Srivastava y pueden ser usadas bajo licencia GNU GPL.

A continuacion definimos nuestros directorios de trabajo:

# Directorio superior del codigo fuente (gracias Manoj) SRCTOP := $(shell if [ "$$PWD" != "" ]; then echo $$PWD; else pwd; fi) # Directorio destino donde se instalaran los archivos DESTDIR = $(SRCTOP)/debian/$(package)

"SRCTOP" ses el directorio superior de nuestro codigo fuente, y "DESTDIR" es el lugar en el que el paquete sera instalado temporalmente, es decir, el directorio "debian/roaddemo/".

Definiremos algunos otros directorios que nos simplificaran el trabajo mas tarde:

# Definicion de directorios BIN_DIR = $(DESTDIR)/usr/bin GAMES_DIR = $(DESTDIR)/usr/games SHARE_DIR = $(DESTDIR)/usr/share/roaddemo DOCS_DIR = $(DESTDIR)/usr/share/doc/roaddemo MAN_DIR = $(DESTDIR)/usr/share/man/man1 MAN_GAMES_DIR = $(DESTDIR)/usr/share/man/man6 MENU_DIR = $(DESTDIR)/usr/lib/menu PIXMAPS_DIR = $(DESTDIR)/usr/share/pixmaps

"BIN_DIR" y "GAMES_DIR" es donde deberan ir los archivos ejecutables para los programas convencionales y los juegos respectivamente. "SHARE_DIR" es donde estaran instalados los archivos independientes de la plataforma. "DOCS_DIR" es para la documentacion, "MAN_DIR" y "MAN_GAMES_DIR" son para las paginas de manual (man), "MENU_DIR" es donde pondremos lor archivos de gestion del menu y "PIXMAPS_DIR" es donde deberan ir los iconos de los programas.

REGLAS

Vamos ahora a continuar con la implementacion de los comandos. Puedes mirar en http://www.debian.org/doc/debian-policy/ch-source.html#s-debianrules para ver que reglas es necesario implementar:

# Reglas con marcas temporales (Stamp Rules) configure-stamp: $(checkdir) ./configure --host=$(DEB_HOST_GNU_TYPE) --build=$(DEB_BUILD_GNU_TYPE) --prefix=/usr --mandir=\$${prefix}/share/man --infodir=\$${prefix}/share/info touch configure-stamp build-stamp: configure-stamp $(checkdir) -rm -f build-stamp $(MAKE) touch build-stamp # Reglas para Debian build: build-stamp clean: stamp-configure $(checkdir) -rm -f *-stamp $(MAKE) distclean -rm -rf debian/$(package) -rm -f debian/files -rm -f debian/substvars binary-indep: build # Definiciones para la instalacion INST_OWN = -o root -g root MAKE_DIR = install -p -d $(INST_OWN) -m 755 INST_FILE = install -c $(INST_OWN) -m 644 INST_PROG = install -c $(INST_OWN) -m 755 -s INST_SCRIPT = install -c $(INST_OWN) -m 755 binary-arch: build $(checkdir) $(checkroot) # Instalacion del programa $(MAKE) install DESTDIR=$(DESTDIR) LIBTOOL=libtool # Instalacion de los recursos del programa $(MAKE_DIR) $(SHARE_DIR) $(INST_FILE) road.bmp $(SHARE_DIR) $(MAKE_DIR) $(DESTDIR)/DEBIAN # Instalacion de la documentacion $(MAKE_DIR) $(DOCS_DIR) $(INST_FILE) debian/copyright $(DOCS_DIR)/copyright $(INST_FILE) debian/changelog $(DOCS_DIR)/changelog.Debian $(INST_FILE) README $(DOCS_DIR)/README # Instalacion de las paginas de manual (man) #$(MAKE_DIR) $(MAN_GAMES_DIR) #$(INST_FILE) roaddemo.6 $(MAN_GAMES_DIR) # Instalacion de menus e iconos #$(MAKE_DIR) $(MENU_DIR) #$(INST_FILE) debian/menu $(MENU_DIR)/roaddemo #$(MAKE_DIR) $(PIXMAPS_DIR) #$(INST_FILE) debian/roaddemo.xpm $(PIXMAPS_DIR) # Instalacion de los scripts de gestion del paquete #$(INST_SCRIPT) debian/postinst $(DESTDIR)/DEBIAN #$(INST_SCRIPT) debian/postrm $(DESTDIR)/DEBIAN # Compresion de la documentacion (gracias Helen) gzip -9 $(DOCS_DIR)/changelog.Debian #gzip -9 $(MAN_GAMES_DIR)/roaddemo.6 # Eliminacion de los simbolos de los ejecutables ("strip") (gracias Helen) strip -R .comment $(BIN_DIR)/roaddemo # Averiguar las dependencias de librerias/bibliotecas compartidas (gracias Helen) dpkg-shlibdeps $(package) # Generacion del archivo de control (gracias Helen) dpkg-gencontrol -isp -P$(DESTDIR) # Creacion del archivo DEBIAN/md5sums (gracias Helen) cd $(DESTDIR) && find . -type f ! -regex '.DEBIAN/.' -printf '%P\0' | xargs -r0 md5sum > DEBIAN/md5sums # Creacion del paquete .deb (gracias Helen) dpkg-deb -b $(DESTDIR) ../

Acabaremos con una parte bastante generica:

# Debajo de aqui hay una parte bastante generica binary: binary-indep binary-arch .PHONY: binary binary-arch binary-indep clean build

Las reglas "phony" son aquellas que no producen como resultado un archivo con el mismo nombre que la regla -- por ejemplo si escribes "make foo", y no se genera un archivo o directorio con el nombre "foo", en ese caso se trata de una regla "phony" (gracias, daf).

EXPLICACION

Ahora vamos con la explicacion de cada una de las partes:

"stamp-configure" comprueba que estamos en el directorio correcto y realiza las operaciones de conficuracion iniciales.

El proposito de las etiquetas *-stamp es evitar repetir las mismas operaciones varias veces. Cuando "make" necesita decidir que hacer, mira la hora de modificacion de los ficheros en cuestion. Como es obvio, esto no funciona cuando una regla no crea un archivo. Si ejecutas "./debian/rules build", y posteriormente "./debian/rules binary", "make" no sabra la segunda vez lo que ya has ejecutado la primera. Si, por el contrario, creas una regla "build-stamp", y haces que "build" dependa de ella, y realizas la operacion "touch build-stamp" cuando hayas terminado de compilar, "make" dispone con ello de una forma de averiguar si la compilacion ya se ha realizado (gracias de nuevo, daf).

"build" depende de que "stamp-configure" sea ejecutado antes. Si no lo ha sido, el sistema llama a esa regla automaticamente antes de compilar ("info make" para mas informacion). Tras ello, realiza la compilacion.

"clean" limpia los directorios de los restos de compilaciones previas. Puesto que se usa "make distclean" fpara ello, la regla ha de depender de que "stamp-configure" halla sido llamada antes. Tras ejecutar "make distclean", aun tenemos que eliminar alguno de los archivos temporales que el sistema de creacion de paquetes crea dentro del directorio "./debian" directory, esto es, el directorio de instalacion temporal "debian/roaddemo/" completo y los archivos "debian/files" y "debian/substvars".

"binary" crea, instala y construye todos los paquetes. Depende de "binary-indep" y de "binary-arch".

"binary-indep" crea, intala y construye los paquetes que son independientes de la platforma, como los scripts en perl o python, que no necesitan ser compilados para cada una de las plataformas. No necesitamos realizar ninguna operacion dentro de esta regla en nuestro caso.

"binary-arch" crea, intala y construye los paquetes que son dependientes de la platforma, como los programas compilados como es nuestro caso. En primer lugar comprobamos que estamos en el directorio adecuado y que somos "root" (o que estemos usando "fakeroot"). A continuacion ejecutamos "make install" para instalar el programa. Puesto que el sistema original de instalacion ignora el fichero "road.bmp", lo movemos a mano hasta su directorio destino: "/usr/share/roaddemo/". Recuerda que hemos modificado el codigo fuente con anterioridad para que lo vaya a abrir a esa direccion.

La parte de control del paquete ha de ir en un directorio llamado "debian/roaddemo/DEBIAN", asi que lo creamos. A continuacion copiamos los ficheros de documentacion al directorio "/usr/share/doc/roaddemo", incluyendo "debian/copyright" y "debian/changelog" (este ultimo renombrado a "changelog.Debian", por si acaso existe un fichero llamado "changelog" del autor original).

En caso de que tuvieramos paginas de manual (man), las instalariamos. De igual forma tambien instalariamos los scripts del sistema de gestion de menues y los iconos si disponemos de ellos. Una nota sobre los iconos: no hay ningun problema en añadir un nuevo archivo de tipo .xpm, ya que es un formato de tipo texto. El sistema de empaquetamiento de Debian no soporta la creacion de nuevos archivos en formato binario de forma directa, como pueden ser los .bmp, .png o .ico por ejemplo. Si necesitas añadirlos, deberas usar los comandos "uuencode" y "uudecode" de la forma apropiada.

A continuacion añadimos los scripts de gestion de la instalacion/eliminacion del paquete, En caso de que hayamos añadido un elemento del menu, necesitaremos al menos de las lineas necesarias en "postinst" y "postrm" para actualizar el sistema de menues. Si no estamos añadiendo elementos al menu, para instalar nuestro programa no los necesitaremos.

Ahora vamos con la parte finel. Comprimimos "changelog.Debian", asi como las paginas de manual (si tenemos alguna), eliminamos ("strip") los simbolos de depuracion de los binarios ejecutables, averiguamos las dependencias de librerias/bibliotecas compartidas (con "dpkg-shlibdeps") y generar el archivo de control (con "dpkg-gencontrol"). Tras ello creamos un archivo "debian/roaddemo/DEBIAN/md5sums" con las sumas "md5sum" de cada uno de los ficheros del paquete (para poder comprobarlos posteriormente), y finalmente creamos el paquete .deb en el directorio "../".

Recuerda que "debian/rules" debe ser ejecutable, por lo que no te olvides de hacer:

$ chmod +x debian/rules

ADICION DEL MENU

Si deseas que tu programa sea añadido automaticamente al sistema de menues de Debian, necesitaras crear un archivo "debian/menu", que debera ser algo parecido a:

?package(roaddemo):needs="x11" section="Games/Toy" \
title="Road Demo" command="roaddemo" \
icon="/usr/share/pixmaps/roaddemo.xpm"

O, si no quieres asignarle ningun icono:

?package(roaddemo):needs="x11" section="Games/Toy" \
title="Road Demo" command="roaddemo"

Si añades un menu, ten en cuenta que tambien tienes que añadir en los scripts de gestion del paquete "debian/postinst" y "debian/postrm" los comandos necesarios para actualizar el sistema de menues:

Archivo "debian/postinst":

#!/bin/sh
set -e
if [ "$1" = "configure" ] && [ -x /usr/bin/update-menus ]; then update-menus ; fi

Archivo "debian/postrm":
#!/bin/sh
set -e
if [ "$1" = "configure" ] && [ -x /usr/bin/update-menus ]; then update-menus ; fi
Tienes informacion adicional sobre el sistema de menues en "/usr/share/doc/menu/html/index.html", dentro de los archivos de tu sistema Debian. Alli encontraras tambien la lista de posibles secciones que puedes usar.
[editar]

Sé el primero en opinar


Tutoriales relacionados con 'Como crear un paquete de debian sin software de ayuda'

Este documento esta dirigido a aquellas personas que quieren comprender el proceso de creacion de... Más »
Debian es el nombre de una organización dedicada al desarrollo y mantenimiento de sistemas operativos... Más »
Rpm
Este documento describe el uso del formato de paquetes de instalación que se ha convertido... Más »
Este documento describe los pasos y el software necesarios para crear un servidor de IRC... Más »
Ppp
Este documento muestra cómo conectar su PC Linux a un servidor PPP, cómo usar PPP... Más »

Autor y licencia de 'Como crear un paquete de debian sin software de ayuda'


Tutorial de Miriam Ruiz. Extraido de: http://www.mononeurona.org/index.php?idp=242 CopyLeft
Este trabajo está licenciado bajo la Creative Commons License. 1999-2005 © :: MonoNeurona.org ::
Este contenido ha sido recopilado por el equipo de Wikilearning. Todo el contenido recopilado se ha obtenido respetando y comunicando en nuestro site la licencia de cada fuente.
Wikilearning tiene permiso expreso por escrito de los autores para publicar los contenidos que ha extraído de otras webs, incluyendo su uso comercial.