next up previous
Superior: Creación de paquetes de Anterior: Acerca de este artículo

Subsecciones

Cómo hacer un paquete Debian

Esta sección es la traducción del documento ``Debian New Maintainers Guide'' de Josip Rodin, e incluida en el paquete Debian 'maint-guide-es'


Empezando ``de la Forma Correcta''

Este documento tratará de describir cómo se construye un paquete Debian GNU/Linux para el usuario normal de Debian (y futuros desarrolladores) en un lenguaje informal, y con multitud de ejemplos. Hay un antiguo dicho romano que dice, ¡Longum iter est per preaecepta, breve et efficax per exempla! (¡Es un largo camino con las reglas, pero corto y eficiente con ejemplos!)

Una de las cosas que hace a Debian una de las distribuciones más importantes del mercado es su sistema de paquetes. Aunque hay una gran cantidad de programas disponibles en formato de paquetes de Debian, algunas veces necesitará instalar programas que no estén así. Puede preguntarse cómo hará vd. sus propios paquetes y que quizás esta sea una tarea demasiada difícil. Bueno, si es vd. un novato en Linux, sí es duro, pero si eres todo un experto, no deberías estar leyendo esto ahora mismo. :-) Necesitas saber algo sobre programación en Unix, pero desde luego no tienes que ser un maestro.


Programas que necesitas para el desarrollo

Antes de empezar nada, deberías asegurarte de instalar adecuadamente algunos paquetes con dpkg(8) (esto es, `dpkg -i paquete`, o a través de alguno de sus interfaces como dselect y apt). Este documento fue escrito mientras la 'hamm' 2.0 y 'slink' 2.1 eran las distribuciones estables oficiales de Debian, por ello los paquetes que se indicarán aquí son aquellos de 2.1.

Los siguientes paquetes vienen en una instalación estándar de Debian 2.1, así que probablemente ya los tenga. Aun así, debería comprobarlo con `dpkg -s paquete`.

De la sección 'devel' de la distribución posiblemente necesite instalar esto usted mismo:

Y de la sección 'utils' necesitará obtener estos paquetes:

Por último, estos paquetes de gran importancia están en la sección 'doc' de la distribución:

También necesitará el paquete de criptografía pgp(1) para firmar digitalmente su paquete. Esto es especialmente importante si quiere distribuir su paquete a otras personas (y hará precisamente esto cuando si su paquete se incluye en la distribución de Debian). Sin embargo, debido a las leyes de exportación de los EEUU, no puede simplemente obtenerlo de su servidor de FTP de Debian más cercano. Pero su servidor de FTP tendrá un fichero llamado README.non-us, que le indicará cómo obtener una copia de pgp (pista: ftp://nonus.debian.org/debian-non-US/).

Las breves descripciones dadas anteriormente sólo sirven para introducirle a lo que hace cada paquete. Antes de continuar, por favor lea la documentación de cada programa, al menos para su uso normal. Puede parecerle algo duro ahora, pero más adelante estará muy contento de haberla leido.


Más información

Usted puede construir dos tipos de paquetes, fuentes y binarios. Un paquete fuente contiene el código que puede compilar en un programa. Un paquete binario contiene sólo el programa terminado. ¡No mezcle los términos como fuentes de un programa y el paquete fuente de un programa! Por favor lea los otros manuales si necesita más detalles sobre terminología.

Debian usa el término 'desarrollador' para la persona que hace paquetes, 'autor' para la persona que hizo el programa, y 'desarrollador fuente' ('upstream maintainer', n. del t.) para la persona que actualmenete mantiene el programa. Generalmente el autor y el desarrollador fuente son la misma persona - y algunas veces incluso el desarrollador es el mismo. Si hace vd. un programa, y quiere incluirlo en Debian, tiene total libertad para solicitar convertirse en desarrollador.

Después de construir su paquete (o mientras lo hace), deberá convertirse en un desarrollador oficial de Debian si desea que su programa entre en la próxima distribución (si el programa es útil, ¿por qué no?). Este proceso se explica en la Referencia del Desarrollador, por favor, leala.


Primeros pasos

Mientras que la documentación en el Rincón del Desarrollador (http://www.debian.org/devel/) no está tan clara sobre dónde y cómo debería empezar un desarrollador su trabajo, este documento explicara cada pequeño (y algunas veces incluso irrelevante) detalle, para ayudarle crear ese primer paquete, y ganar alguna experiencia en la construcción de nuevas versiones de éste y quizás otros paquetes más adelante.


Elija su programa.

Porbablemente haya escogido ya el paquete que desea construir, pero aquí hay algunos punteros para los novatos:

Por supuesto, esta lista es para tomar medidas de seguridad, y con la intención de salvarle de usuarios enfurecidos is hace algo mal con algún demonio de ftp setuid...Pero cuando tenga más experiencia en empaquetar cosas, podrá hacer este tipo de paquetes, pero incluso los desarrolladores más experimentados preguntan en la lista de distribución de debian-devel cuando tienen dudas. Y la gente allí le ayudara gustosamente.

Para más ayuda sobre esto, lea la Referencia del Desarrollador


Obtenga el programa, y pruebelo.

La primera cosa a hacer es encontrar y descargar el paquete original. Supongo que ya tiene el código fuente que obtuvo de la página del autor. Las fuentes de Linux generalmente vienen en el formato tar/gzip, con extensión .tar.gz o .tgz, y generalmente contienen un subdirectorio llamado programa-versión con todas las fuentes en él. Si su programa viene en otro tipo de archivo (como por ejemplo, el fichero termina con .Z o .zip), descomprimal con las herramientas adecuadas, o pregunte en debian-mentors si no está seguro de cómo se puede desempaquetar correctamente (pista: pruebe `file archivo.extension`).

Como ejemplo, usaré el programa conocido como 'gentoo', un gestor de ficheros de X11 con GTK+.

Cree un subdirectorio bajo /usr/local/src que tenga el mismo nombre que su programa (/usr/local/src/gentoo en este caso). Y mueva a él el archivo que ha descargado, y descomprimalo de la siguiente forma: `tar -xzf gentoo-0.9.12.tar.gz`. Este proceso (algo largo) no dará ninguna salida (excepto si hay algún error, con lo que tendrá que bajarse de nuevo el archivo o comprobar que es un fichero tar/gzip), pero tendrá las fuentes desempaquetadas en un subdirectorio llamado 'gentoo-0.9.12' en /usr/local/src/gentoo.

Muevase a ese directorio y lea en profundidad la documentación que encuentre. Está generalmente en ficheros que se llaman README*, INSTALL*, *.lsm o *.html. Allí encontrará instrucciones de cómo compilar e instalar el programa (generalmente para el directorio /usr/local/bin).

El proceso varia de programas a programas, pero gran parte de los programas modernos vienen con un script 'configure' que configura las fuentes para su sistema y se asegura de que su sistema está en condiciones de compilarlo. Después de configurarlo (con `./configure`), los programas generalmente se compilan con `make`, y se instalarn en sus directorios de destino ejecutando `make install`.

Así que compile, instale y pruebe el programa, asegurese de que funciona bien y que no rompe nada más mientras está instalándose o ejecutándose.


Cosas antes de `dh_make'

Para construir correctamente el paquete, debería mover el directorio de fuentes a <nombre_de_paquete>-<versión>. Como puede ver, el programa de ejemplo no lo necesita, pero quizás su programa sí. También, ponga el nombre en minúsculas si no o está ya. Si consiste de una o más palabras, contraialas a una palabra o haga una abreviatura. Por ejemplo, el paquete del programa "el editor para X de Javi" se podría llamar javiedx o jle4x, o lo que decida, siempre y cuando no se exceda de unos límites razonables, como 15 caracteres.

También compruebe la versión exacta del programa (¡no del paquete!). Si el programa no está numerado con versiones del estilo de X.Y.Z, pero con fecha de lanzamiento, es usted libre de utilizar la fecha (si la fecha es el 19 de diciembre de 1998, utilize la abreviatura norteamericana 19981219) cmomo número de versión. Aún así habrá algunos que ni siquiera estén numerados, en cualqueir caso debe contactar con el 'desarrollador fuente' para ver si tienen algún otro sistema de seguimiento de revisiones.

Antes de empezar con el proceso dh_make, debería poner en su variable de entorno $EMAIL si dirección de correo, y lo hara haciendo algo como esto en su shell (esto es para basj).

       export EMAIL=usuario.login@algun_lugar.net


Ejecutando `dh_make'

Asegúrese que está en el directorio donde están las fuentes del programa, y ejecute lo siguiente:

       dh_make

Saldrá alguna información. Le preguntará qué tipo de paquete desea crear. Gentoo es un solo paquete de binarios - crea sólo un binario, y, por tanto, sólo un fichero .deb - así que seleccionaremos la primera opción, con la tecla 's'. Como nuevo desarrollador, está desaconsejado crear paquetes multibinarios, o librerías, como se explicó antes.

Tenga en cuenta que debería ejecutar dh_make sólo una vez, y que no se comportará correctamente si lo hace otra vez en el mismo directorio, ya ``debianizado''. Esto también significa que usuará un método distinto para crear una nueva revisión o una nueva versión de su paquete en el futuro. Lea más sobre esto más adelante en el texto.


Modificando las fuentes.

Cuando dh_make termina, y haya ajustado el Makefile del propio programa, podrá hacer `cd ..` para ver el nuevo directorio que ha creado, que se llama 'gentoo-0.9.12.orig'. Contiene el código fuente original que de ahora en adelante permanecerá intacto. El directorio 'gentoo-0.9.12' todavía existe, es allí donde hará las modificaciones.

Normalmente, los programas se instalan a sí mismos en el subdirectorio /usr/local. Pero los paquetes Debian no pueden utilizar este directorio ya que está reservado para el uso privado del administrador (o del usuario). Esto significa que tiene que mirar el Makefile the gentoo. Este es el script make(1) que usará para automatizar la creación de éste programa. Para más detalles sobre Makefiles, mire en `el fichero `rules'.' s-rules.

Tenga en cuenta que no hay espacio aquí para entrar en todos los detalles respecto a los arreglos, pero aquí hay algunos de los problemas frecuentes a los que se enfrenta uno.


El problema de $DESTDIR

       # ¿Dónde poner el binario en  'make install'?
       BIN     = /usr/local/bin
       # ¿Dónde poner los iconos en 'make install'? Nota: si cambia esto,
       # gentoo no encontrará los iconos cuando arranque. Deberá cambiar
       # el path de iconos de gentoo (en la ventana de configuración:
       # "Paths") para que funcione.
       ICONS   = /usr/local/lib/gentoo/

Antes de esto debería insertar dos nuevas líneas que dicen:

       # Editado para Debian GNU/Linux.
       DESTDIR =

porque el proceso de construcción lo necesita (explicado más tarde).

Después el Makefile menciona la localización del binario final. Sólo necesita cambiar esto:

       # ¿Dónde poner el binario en  'make install'?
       BIN     = SPMdollar;(DESTDIR)/usr/X11R6/bin

¿Pero por qué en este directorio y no en otro? Porque Debian tiene unas reglas definidias de dónde deberían estar instalados los programas. Están especificas en el Linux Filesystem Structure Standard (/usr/doc/debian-policy/fsstnd) [Estándar de Linux de la Estructura de los Sistemas de Ficheros, n. del t.]. Así, deberíamos instalar el binario en /usr/X11R6/bin en lugar de /usr/local/bin, y la página de manual (no existe aquí, pero casi todos los programas tienen una así que haremos una después) en /usr/man/man1 en lugar de /usr/local/man/man1.

Después de esto tenemos un situación un poco más complicada. Si cambia la línea a:

       ICONS   = SPMdollar;(DESTDIR)/usr/share/gentoo/

que estará dentro de la política de Debian, deberá editar algunos ficheros de fuentes reales de C. Pero, ¿dónde buscar? Puede probar a encontrarlos usando:

       grep -n usr/local/lib *.[ch]

(en cada subdirectorio que contiene ficheros .c y .h). Grep dirá el nombre del fichero y la línea, cuando encuentra una ocurrencia. Ahora edite esos ficheros y cambie en esas líneas usr/local/lib con usr/share - y ya está. Simplemetne remplaze usr/local/lib por su localización, y sea muy cuidadoso para no mezclar el resto del código, si no sabe mucho sobre cómo programas en C. :-)

Después de esto debería encontrar el objetivo 'install' (busque una línea que comienze por 'install:') y renombre todas las referencias a directorios distintos de los definidos al comienzo del Makefil. En este caso, hace esto y limpia las cosas un poco, anteriormente el objetivo install decía:

       # --------------------- Installation
     
       # ¡Debe ser superusuario para hacer esto!
       install:        gentoo-target
                       install ./gentoo SPMdollar;(BIN)
                       install icons SPMdollar;(ICONS)
                       install gentoorc-example SPMdollar;(HOME)/.gentoorc

Después de su cambio dice:

       # --------------------- Installation
     
       # You're going to have to be root to do this!
       install:        gentoo-target
                       install -d SPMdollar;(BIN) SPMdollar;(ICONS) SPMdollar;(DESTDIR)/etc
                       install ./gentoo SPMdollar;(BIN)
                       install -m644 icons/* SPMdollar;(ICONS)
                       install -m644 gentoorc-example SPMdollar;(DESTDIR)/etc/gentoorc
                       install -d SPMdollar;(DESTDIR)/usr/doc/gentoo/html
                       cp -a docs/* SPMdollar;(DESTDIR)/usr/doc/gentoo/html

Un lector atento se dará cuenta de que he cambiado 'gentoo' a 'gentoo-target' en la línea 'install:'. Esto es para arreglar un fallo en el programa. :-)

Siempre que haga cambios que no estén específicamente relacionados con el paquete Debian, asegurese de que los envía al desarrollador original para que éste los incluya en la próxima revisión del programa.


Librerias diferentes.

Hay un problema comúna: las librerías son generalmente diferentes de plataforma a plataform. Por ejemplo, un Makefile puede contener una referencia a una librería que no exista en Debian. En este caso, se necesita cambiarla a una librería que sí existe en Debian y sirve para el mismo propósito. La mejor forma es comentar (¡no borrar!) esas líneas porque puede que haber otras personas que intenten compilar en diferentes plataformas y éstas les pueden dar algunas pistas de dónde puede estar el problema.

Así, si hay una línea en el Makefil de su programa que dice algo como lo siguiente (y su programa no compila):

       LIBS = -lcurses -lsomething -lsomethingelse

Entonces cambiela a lo siguiente, y funcionará casi con seguridad:

       LIBS = -lncurses -lsomething -lsomethingelse
       #LIBS = -lcurses -lsomething -lsomethingelse


Los ficheros debian/control y debian/rules.

Ahora hay un nuevo subdirectorio en gentoo-0.9.12, que se llama 'debian'. Hay bastantes ficheros en este directorio. Empezaremos editando éstos para adaptar el comportamiento del paquete. La parte más importante es modificar los ficheros 'control' y 'rules' (reglas, n. del t.).


El fichero `control'.

Este fichero contiene varios valores que dpkg y dselect usarán para gestionar el paquete. Aquí está el fichero de control que dh_make crea para nosotros.

     1 Source: gentoo
       2 Section: unknown
       3 Priority: optional
       4 Maintainer: Josip Rodin <jrodin@jagor.srce.hr>
       5 Standards-Version: 2.4.0.0
       6
       7 Package: gentoo
       8 Architecture: any
       9 Depends: SPMdollar;{shlibs:Depends}
       10 Description: Missing
       11 Missing

(He añadido los números de línea.)

Las lineas 1 a 5 son la información de contol del paquete fuente. La línea 1 es el nombre del paquete fuente.

La línea 2 es la sección de la distribución en la que va este paquete. Como puede haber observado, Debian está divido en secciones: main (principal, n. del t.) (el software libre), non-free (el software que no es libre) y contrib (el software libre que depende del software no libre). Por debajo de éstas, hay subsecciones lógicas que describen brevemente qué paquetes tienen. Así tenemos 'admin' para programas que son sólo para los administradores, 'base' para las herramientas básicas, 'devel' para las herramientas de los programadores, 'doc' para documentación, 'libs' para librerías, 'mail' para lectores y demonios de correo, 'net' para aplicaciones de red y demonios, 'x11' para programas específicos de X11 y muchas otras.

Lo cambiaremos, pues, a x11.

La línea 3 describe cómo de importante es para el usuario la instalación de éste paquete. La sección y prioridad son actualmente sólo usadas por dselect cuando ordena paquetes y selecciona valores por defecto, y pueden ser modificadas (y generalmente lo serán) por nuestros administradores del FTP. Lea el manual de Política de Debian para una guía de qué valor deben tener estos campos.

Como es un paquete de prioridad normal, lo dejaremos con prioridad 'optional' (opccional, n. del t.).

La línea 4 es el nombre y correo electrónico del desarrollador.

La línea 5 es la versión de los estándares de la Política de Debian que sigue este paquete (dos versiones importantes del paquete debian-policy instalado).

La línea 7 es el nombre del paquete binario.

La línea 8 describe la arquitectura de CPU para la que se compiló el paquete. Podemos dejar ésta como 'any' (cualquiera, n. del. t), ya que dpkg-gencontrol(1) lo rellenará con el valor apropiado cuando se compile este paquete.

La línea 9 muestra una de las más poderosas posibilidades del sistema de paquetes de Debian. Los paquetes se pueden relacionar unos con otros de diversas formas. Aprte de 'Depends:' (depende de, n. del t.) otros campos de relación son 'Recommends:' (recomienda, n. del t.), 'Suggests:' (sugiere, n. del t.), 'Pre-depends:' (predepende de, n. del t.), 'Conflicts:' (entra en conflicto con, n. del t.), 'Provides:' (provee, n. del t.), 'Replaces:' (reemplaza a, n. del t.). Ésto es lo que significan:

Todos estos campos tienen una sintaxis uniforme. Tienen una lista de nombres de paquetes separados por comas. Estos nombres de paquetes también puede ser listas de paquetes alternativos, separados por los símbolos de barra vertical | (símbolos tubería). Los campos pueden restringir su aplicabilidad a versiones determinadas de cada paquete nombrado. Esto se hace entre paréntesis para cada nombre de paquete individual; los paréntesis deberían contener una relación de la siguiente lista seguida por un número de versión. Las relaciones permitidas son <<, <=, =, >= y >> estrictamente para anterior, anterior o igual, exáctamente igual, posterior o igual o estríctamente posterior, respectivamente.

La última funcionalidad que quiero enseñarle es $(shlibs:Depends). Ésta se sustituirá automáticamente por dh_shlibdeps(1) (ver más adelante) por los nombres de cualquier librería compartida, como libc6 o xlib6g, que use su programa, así que no necesita especificar esto vd. mismo. Habiendo dicho todo esto, puede dejar la línea 9 exáctamente como está ahora.

La línea 10 es donde va la lista de sugereencias. Aquí sólo es 'menu', porque gentoo debería estar en los menús del gestor de ventanas X11. Esto se controla también por el fichero debian/menu. Lea menufile(5), y update-menus(1).

La línea 11 es una descripción corta. La mayor parte de los monitores de la gente son de 80 columnas de ancho, así que no debería tener más de 50 caracteres. Cambiaré esto a ``A fully GUI configurable GTK+ file manager" (''La GUI a un gestor de ficheros GTL+ completamentae configurable").

La línea 12 es donde va la descripción larga del paquete. Debería ser al menos un párrafo que da más detalles del paquete. La Columna 1 de cada línea debería estar vacía. No puede haber líneas en blanco, pero puede poner un . (punto) en una columna para simularlo. También debe haber no más de una línea en blanco después de la descrición completa.

Aquí está el fichero de control actualizado:

       1  Source: gentoo
       2  Section: x11
       3  Priority: optional
       4  Maintainer: Josip Rodin <jrodin@jagor.srce.hr>
       5  Standards-Version: 2.5.0
       6
       7  Package: gentoo
       8  Architecture: any
       9  Depends: SPMdollar;{shlibs:Depends}
       10 Suggests: menu (>= 1.5)
       11 Description: A fully GUI configurable GTK+ file manager
       12 gentoo is a file manager for Linux written from scratch in pure C. It
       13 uses the GTK+ toolkit for all of its interface needs. gentoo provides
       14 100% GUI configurability; no need to edit config files by hand and re-
       15 start the program. gentoo supports identifying the type of various
       16 files (using extension, regular expressions, or the 'file' command),
       17 and can display files of different types with different colors and icons.
       18 .
       19 gentoo borrows some of its look and feel from the classic Amiga file
       20 manager "Directory OPUS" (written by Jonathan Potter).


el fichero `rules'.

Ahora volvemos al directorio 'debian' para mirar las reglas que dpkg-buildpackage(1) utilizará para crear el paquete. Este fichero es en realidad otro Makefile, ya que es ejecutado con 'make -f', pero diferente al que viene en las fuentes originales.

Cada fichero 'rules' (de reglas, n. del t.), como muchos otros Makefiles, consisten de varias reglas sobre cómo compilar las fuentes. Las reglas consisten en objetivos: ficheros o nombres de accioens que se deben llevar a cabo (por ejemplo, 'build:' o 'install:'). Las reglas que quiere ejecutar deberían llamarse como los argumentos de comandos (por ejemplo, 'rules build' o 'rules install'). Después del nombre del objetivo, puede nombrar las dependencias, programas o ficheros de los que la regla depende. Después de esto hay un cualquier número de instrucciones (¡que empiezan con <tab>!), hasta que se llega a una línea en blanco, ahí empieza otra regla. Los comentarios empiezan con almohadillas ('#'), y terminan con el fin de la línea. Puede llamar a las reglas desde otra regla o desde la línea de órdenes (esto es `debian/rules clean`).

Probablemente ya se haya perdido, pero todo quedará más claro después de ver un fichero 'rules' que dh_make pone por defecto. Debería también leer la entrada de 'make' en info para más información.

       1  #!/usr/bin/make -f
       2  # Made with the aid of dh_make, by Craig Small
       3  # Sample debian/rules that uses debhelper. GNU copyright 1997 by Joey Hess.
       4  # Some lines taken from debmake, by Christoph Lameter.
       5
       6  # Uncomment this to turn on verbose mode.
       7  #export DH_VERBOSE=1
       8
       9  build: build-stamp
       10 build-stamp:
       11       dh_testdir
       12
       13       
       14       # Add here commands to compile the package.
       15       $(MAKE)
       16
       17       touch build-stamp
       18
       19 clean:
       20       dh_testdir
       21       dh_testroot
       22       rm -f build-stamp install-stamp
       23
       24       # Add here commands to clean up after the build process.
       25       -SPMdollar;(MAKE) clean
       26
       27       dh_clean
       28
       29 install: install-stamp
       30 install-stamp: build-stamp
       31       dh_testdir
       32       dh_testroot
       33       dh_clean -k
       34       dh_installdirs
       35
       36       # Add here commands to install the package into debian/tmp.
       37       $(MAKE) install DESTDIR=`pwd`/debian/tmp
       38
       39       touch install-stamp
       40
       41 # Build architecture-independent files here.
       42 binary-indep: build install
       43 # We have nothing to do by default.
       44
       45 # Build architecture-dependent files here.
       46 binary-arch: build install
       47 #     dh_testversion
       48       dh_testdir
       49       dh_testroot
       50       dh_installdocs
       51       dh_installexamples
       52       dh_installmenu
       53 #     dh_installemacsen
       54 #     dh_installinit
       55       dh_installcron
       56       dh_installmanpages
       57 #     dh_undocumented
       58       dh_installchangelogs
       59       dh_strip
       60       dh_compress
       61       dh_fixperms
       62       dh_suidregister
       63       dh_installdeb
       64       dh_shlibdeps
       65       dh_gencontrol
       66 #     dh_makeshlibs
       67       dh_md5sums
       68       dh_builddeb
       69
       70 source diff:
       71       @echo >&2 'source and diff are obsolete - use dpkg-source -b'; false
       72
       73 binary: binary-indep binary-arch
       74 .PHONY: build clean binary-indep binary-arch binary

(N. del T.: se traduce el fichero de reglas, dh_make sólo lo ofrece en inglés)

       1  #!/usr/bin/make -f
       2  # Creado con la ayuda de dh_make, por Craig Small
       3  # Fichero de ejemplo debian/rules que usa debhelper. Copyright GNU 1997 por Joey Hess.
       4  # Algunas líneas son de debmake, por Christoph Lameter.
       5
       6  # Quitele el comentario para activar el modo verboso
       7  #export DH_VERBOSE=1
       8
       9  build: build-stamp
       10 build-stamp:
       11       dh_testdir
       12
       13       
       14       # Añada aquí los comandos para compilar el paquete.
       15       $(MAKE)
       16
       17       touch build-stamp
       18
       19 clean:
       20       dh_testdir
       21       dh_testroot
       22       rm -f build-stamp install-stamp
       23
       24       # Añada aquí los comandos para limpiar después del proceso de creación.
       25       -SPMdollar;(MAKE) clean
       26
       27       dh_clean
       28
       29 install: install-stamp
       30 install-stamp: build-stamp
       31       dh_testdir
       32       dh_testroot
       33       dh_clean -k
       34       dh_installdirs
       35
       36       # Añada aquí los comandos para instalar el paquete en debian/tmp.
       37       $(MAKE) install DESTDIR=`pwd`/debian/tmp
       38
       39       touch install-stamp
       40
       41 # Construir los ficheros independientes de arquitectura aquí
       42 binary-indep: build install
       43 # Por defecto no se hace nada.
       44
       45 # Construir los ficheros dependientes de arquitectura aquí.
       46 binary-arch: build install
       47 #     dh_testversion
       48       dh_testdir
       49       dh_testroot
       50       dh_installdocs
       51       dh_installexamples
       52       dh_installmenu
       53 #     dh_installemacsen
       54 #     dh_installinit
       55       dh_installcron
       56       dh_installmanpages
       57 #     dh_undocumented
       58       dh_installchangelogs
       59       dh_strip
       60       dh_compress
       61       dh_fixperms
       62       dh_suidregister
       63       dh_installdeb
       64       dh_shlibdeps
       65       dh_gencontrol
       66 #     dh_makeshlibs
       67       dh_md5sums
       68       dh_builddeb
       69
       70 source diff:
       71       @echo >&2 'source y diff están obsoletos - use dpkg-source -b'; false
       72
       73 binary: binary-indep binary-arch
       74 .PHONY: build clean binary-indep binary-arch binary

Probablemente esté familiarizado con líneas como la 1 de scripts hechos en shell o perl. Esto significa que el fichero debe ejecutarse con make. Las líneas vacías se ignoran. Las líneas que comienzan con '#' (almohadilla) se tratan como comentarios y pueden también ignorarse.

Las líneas 9 a la 17 describen la regla de construcción (en inglés: build, n. del t.) y su ``hijo'' 'build-stamp' que ejecuta el Makefile del propio programa para compilarlo.

Las cosas rara vez funcionan perfectamente la primera vez, así que se especifica la regla de limpieza (del inglés 'clean', n. del t.) en las líneas 18-26 que limpian cualquier resto innecesario dejado de intentos previos fallidos.

El proceso de instalación, la regla 'install', comienza en la línea 29. En la línea 34, todos los directorios necesarios se crean en el directorio 'debian'. La línea 37 llama al objetivo de instalación del Makefile de gentoo - e instala en el directorio debian/tmp - es por esto que específicamos como raíz del directorio de instalación $(DESTDIR) en el Makefile de gentoo.

Como sugiere el comentario, la regla 'binary-indep' en las líneas 41-43 se usa para construir paquetes independientes de arquitectura, pero aquí no hay nada.

Lo siguiente es la regla 'binary-arch', en las líneas 46 a 68, en la que ejecutamos varias utilidades diversas del paquete debhelper que nos permiten hacer operaciones variads en nuestro paquete para que cumpla la política de Debian.

Los nombres comienza con dh_ y a continuación se indica lo que realmente hace cada pequeña utilidad:

Cada uno de estos scripts dh_* tiene su propia página de manual, leala para más información. Hay otros scripts con la misma nomenclatura (dh_*) que no se han mencionado aquí, pero puede necesitar, lea la documentación de debhelper.

Las líneas 70 a la 74 son sólo algunas necesidades sobre las que puede leer en el mual de make. Por ahora, no es importante conocerlas.

La parte importante sobre el fichero de reglas creado por dh_make es que sólo es una sugerencia. Funcionará para paquetes simples pero para los más complicados no se asuste y modifique, borre o añada a éste para ajustarse a sus necesidades. Esto se aplica de forma especial a las secciones binary-arch, donde debería comentar las líneas que llaman a funciones que no necsita, en este caso he comentado las líneas 47, 53, 54, 57 y 66 porque gentoo no las necesita. La única cosas que no debe cambiar son los nombre de las reglas, porque es necesario que se llamen de esta forma para que todas las herramientas que las usan utilizen estos mismos nombres, esto se obliga en nuestro manual de Empaquetamiento.

Por supuesto, se necesita hacer algunos ajustes aquí: en la línea 58 añadiré 'FIXES' porque ese es nombre del fichero de cambios. Para cualquier otra opción por favor lea la página de manual del programa dh_* involucrado.


Otros ficheros en el directorio debian/.


copyright

Este fichero contiene la información de copyright del paquete. Su formato no está obligado por la Política, pero sus contenidos sí (sección 6.5). Dh_make crea uno por defecto, que tiene este aspecto:

       1  This package was debianized by Josip Rodin jrodin@jagor.srce.hr on
       2  Wed, 11 Nov 1998 21:02:14 +0100.
       3
       4  It was downloaded from <fill in ftp site>
       5
       6  Upstream Author(s): <put author(s) name and email here>
       7
       8  Copyright:
       9
       10 <Must follow here>

(N. del T.: se traduce el fichero de copyright, dh_make sólo lo ofrece en inglés)

       1  Éste paquete fue debianizado por Josip Rodin jrodin@jagor.srce.hr el
       2  Mie, 11 Nov 1998 21:02:14 +0100.
       3
       4  Se descargó de  <rellenar el servidor de ftp>
       5
       6  Autor/es Original/es: <poner el nombre/s de el/los autor/es y
       7  dirección de correo electrónico aquí>
       8  Copyright:
       9
       10 <Debe venir aquí>

Las cosas importantes a añidar a este fichero son el lugar donde se obtuvo el paquete y la nota de copyright de éste (debe incluirla entera). Si el copyright es una de las licencias de software libre populares como GNU, BSD o la licencia Artística, puede sólamente referirse al fichero apropiado en /usr/doc/copyright, que existe en todo sistema Debian. Gentoo está licenciado bajo la Licencia Pública General GNU, así que cambiaremos el fichero a esto:

       1  This package was debianized by Josip Rodin <jrodin@jagor.srce.hr> on
       2  Wed, 11 Nov 1998 21:02:14 +0100.
       3
       4  It was downloaded from: ftp://ftp.obsession.se/gentoo/
       5
       6  Upstream Author: Emil Brink <emil@obsession.se>
       7
       8  This software is copyright (c) 1998-99 by Emil Brink, Obsession
       9  Development.
       10
       11 You are free to distribute this software under the terms of
       12 the GNU General Public License.
       13 On Debian GNU/Linux systems, the complete text of the GNU General
       14 Public License can be found in /usr/doc/copyright/GPL file.


README.debian (LEEME.debian, n. del t.)

Cualquier detalle extra en discrepancias entre el programa original y su versión debianizada debería estar documentada aquí. Dh_make crea una por defecto, y éste es su aspecto:

       gentoo for DEBIAN
       -----------
     
       Comments regarding the Package
     
       Josip Rodin <jrodin@jagor.srce.hr>, Wed, 11 Nov 1998 21:02:14 +0100

Dado que no tenemos que poner nada aquí - está permitido borrarla. Por cierto, sí, puede renombrar el fichero a README.Debian :-)


changelog

Este es un fichero necesario, tiene un formato especial descrito en el Manual de Empaquetamiento (sección 3.2.3). Este formato es usado por dpkg y otros programas para obtener el número de versión, revisión, distribución y uregncia de su paquete.

Para usted, es también importante, ya que es bueno tener documentados los cambios que haya hecho. También ayudará a la gente que se descarge su paquete para ver si hay algunos temas sin resolver con el paquete que deberían saber. Se salvará como /usr/doc/gentoo/changelog.Debian.gz en el paquete binario.

Dh_make crea uno por defecto, y tiene este aspecto:

       1  gentoo (0.9.12-1) unstable; urgency=low
       2
       3   * Initial Release.
       4
       5  - Josip Rodin <jrodin@jagor.srce.hr> Wed, 11 Nov 1998 21:02:14 +0100
       6
       7  Local variables:
       8  mode: debian-changelog
       9  add-log-mailing-address: "jrodin@jagor.srce.hr"
       10 End:

La línea 1 es el nombre del paquete, versión, distribución, y urgencia. El nombre debe coincidir con el del paquete fuente, por ahora, la distribución debería ser 'unstable' (inestable, n. del t.) o 'experimental', y la urgencia no debería cambiarse a nada distinto a 'low' (baja, n. del t.). :->

Las líneas 3 a 5 son una entrada de registro, donde documenta los cambios hechos en esta revisión del paquete (nos los cambios en las fuentes hechas por los autores originales - hay un fichero especial para este propósito, creado por los autores, y que se instala en /usr/doc/gentoo/changelog.gz). Las nuevas líneas deben insertarse justo después de la primera línea que empieza con un asterisco ('*'). Puede hacer esto con dch, emacs (las líneas 7 a 10 son información de modo para el editor Emacs), o cualquier editor de texto que desee. Acabará con algo así:

       1  gentoo (0.9.12-1) unstable; urgency=low
       2
       3   * Initial Release.
       4   * This is my first Debian package.
       5
       6  - Josip Rodin <jrodin@jagor.srce.hr> Wed, 11 Nov 1998 21:02:14 +0100
       7
       8  Local variables:
       9  mode: debian-changelog
       10  add-log-mailing-address: "jrodin@jagor.srce.hr"
       11 End:

Cuando distribuya una nueva versión, debe incrementar el número de versión del paquete. Puede hacer esto con `dch -v <versión>-<revisión>` y después insertar los comentarios con su editor preferido. Pisa: ¿cómo puede obtener rápidamente la fecha en el formato requerido? Utilize el comando `822-date` o `date -R`.

Se añade información sobre la nueva versión al principio del fichero 'changelog'. Tendrá este aspecto después:

       1  gentoo (0.9.12-2) unstable; urgency=low
       2
       3   * Comments about the second revision
       4
       5  - Josip Rodin <jrodin@jagor.srce.hr> Wed, 11 Nov 1998 22:15:39 +0100
       6
       7  gentoo (0.9.12-1) unstable; urgency=low
       8
       9   * Initial Release.
       10  * This is my first Debian package.
       11
       12 - Josip Rodin <jrodin@jagor.srce.hr> Wed, 11 Nov 1998 21:02:14 +0100
       13
       14 Local variables:
       15 mode: debian-changelog
       16  add-log-mailing-address: "jrodin@jagor.srce.hr"
       17 End:


conffiles

Una de las cosas más molestas de los programas es cuando pasas mucho tiempo y esfuerzo adaptando un programa y una actualización destroza todos tus cambios. Debian arregla este problema marcando los ficheros de configuración de forma que cuando actualizas un paquete no se le pregunta si desea mantener la nueva configuración o no. Lo consigue poniendo la ruta completa a cada fichero de configuración (se encuentran generalmente en /etc) una por línea, en un fichero llamado 'conffiles'.

Gentoo tiene un fichero de configuración, /etc/gentoorc, y meteremos éste en el fichero 'conffiles'. No es necesario tener este último fichero si su programa no tiene ningún fichero de configuración.


dirs

Este fichero especifíca los directorios que se necesitan pero que no crea un proceso de instalación normal (make install). Por defecto, tiene éste aspecto:

       1 usr/bin
       2 usr/sbin

Observe que la barra precedente no está incluida. Normalmente lo cambiaríamos para gentools a algo así:

       1 usr/X11R6/bin
       2 usr/X11R6/man/man1

pero estos directorios ya se crean en el Makefile, así que no necesitaremos este fichero y lo podremos borrar.


postinst, preinst, postrm, prerm

Estos ficheros se llaman scripts de gestión, y debería intentar evitarlos si puede porque son demasiados complejos. Para más información lea el Manual de Empaquetamiento.


manpage.1.ex

Los ficheros que terminan en *.ex son ejemplos de cómo añadir ese tipo de soporte en el paquete. Si usa uno de ellos, editelo y elimine la extensión .ex.

Su programa debería tener una página de manual. Si no la tiene, éste es un esqueleto que puede rellenar. Lea las páginas de manual para man(7) para una breve descripción de cómo crear una página de manual. Asegúrese de renombrar este fichero al nombre del programa y modificar la extensión para indicar la sección a la que debería ir. Aquí hay una corta lista:

       Section |     Description        |     Notes
          1     Comandos de Usuario       Programas ejecutables o scripts.
          2     Llamadas al Sistema       Funciones dadas por el kernel.
          3     Llamadas a Librerías      Funciones dadas por las librerías del sistema.
          4     Ficheros Especiales      Generalmente se encuentra en /dev
          5     Formatos de Fichero      Por ejemplo, el formato del /etc/passwd
          6     Juegos                   U otros programas frívolos.
          7     Paquetes de Macros       Como las macros de man.
          8     Administración del Sist. Programas que sólo ejecuta el superusuario.
          9     Routinas del Kernel      Llamadas al sistema no estándar.

Así que la página de manual de gentoo debería llamarse gentoo.1, o gentoo.1x porque es un programa de X11. Cómo no había página de manual en las fuentes originales la escribí del ejemplo.


menu.ex

Los usuarios de X Windows tendrán un gestor de ventanas con menus que pueden adaptarse para lanzar programas. Si tienen instalado el paquete de menu de Debian, se creará un conjunto de menus para cada programa del sistema para ellos. No se exige en la política de Debian, pero los usuarios seguramente lo apreciarán. Podemos añadir a Gentoo a los menus editando este fichero. Aquí está el fichero que dh_make crea por defecto:

       ?package(gentoo):needs=X11|text|vc|wm section=Apps/see-menu-manual\(\backslash\)
         title="gentoo" command="/usr/bin/gentoo"

El primer campo especifica qué tipo de interfaz necesita el programa (esto es, texto o X11). La siguiente es el menu y submenu dónde debería aparecer. La lista actual de secciones está en /usr/doc/menu/html/ch2.html#s2.2 El tercero es el nombre del programa. El cuarto es el icono para el programa o nada si no hay ninguno. El quinto es el texto que aparecerá en el menu. El sexto es la orden que ejecuta el programa. will appear in the menu. The sixth is the command that runs the program.

Ahora cambiaremos la entrada de menu a ésta:

       ?package(gentoo):needs=X11 section=Apps/Misc \(\backslash\)
         title="gentoo" command="/usr/X11R6/bin/gentoo"


watch.ex

Puede usar este fichero, junto con los programas uscan(1) y uupdate(1) (en el paquete devscripts) para vigilar el servidor de donde obtuvo las fuentes originales. Vea las páginas de manuales para más detalles. Gentoo no puede usar esta función así que borraremos el fichero.

Ahora estamos preparados para construir el paquete.


Pasos Finales


Construir el paquete.

Entre en el directorio principal de Gentoo's (/usr/local/src/gentoo/gentoo-0.9.12/) y ejecute el siguiente comando:

       dpkg-buildpackage -rfakeroot

Esto hará todo por usted, sólo tendrá que dar su clave secreta PGP, dos veces. Una vez haya hecho esto, verá cuatro nuevos ficheros en el directorio /usr/local/gentoo:


Comprobar su paquete para encontrar errores.

Ejecute lintian(1) sobre su fichero de cambios .changes; éste programa comprobará muchos errores comunes al empaquetar. El comando es:

       lintian -i gentoo_0.9.12-1_i386.changes

Si parece que hay algunos errores (líneas que comienzan por E:), lea la explicación (líneas N:), corriga errores, y reconstruya con dpkg-buildpackage. Si hay líneas que comienzan con W:, son sólo avisos (warnings, n. del t.), así que puede estar seguro de que su paquete está bien (pero seguramente necesita algún ajuste fino).

Mire dentro del paquete usando un gestor de ficheros como mc(1), o descomprimalo en algún punto temporal usando dpkg-deb(1).

Instale el paquete para probarlo usted mismo. Intente instalarlo en otroas máquinas distintas de la suye y mire bien para detectar errores o avisos.

Más tarde, cuando construya una nueva versión, debería hacer lo siguiente para asegurar la actualización básica del paquete:


Enviando su paquete.

Ahora que ha probado su nuevo paquete en profundidad, necesitará enviar estos ficheros a master.debian.org, usando dupload(1). Primero debe editar el fichero de configuración de dupload. Copie los valores por defecto del /etc a su directorio personal:

       cp /etc/dupload.conf ~/.dupload.conf

Después edite ese fichero (~/.dupload.conf), y encuentre la parte que empieza por '$cfg{master}' y cambie estas líneas (no necesariamente en éste orden):

               login => getlogin() || SPMdollar;ENV{USER} || SPMdollar;ENV{LOGNAME},
               visibleuser => getlogin() || SPMdollar;ENV{USER} || SPMdollar;ENV{LOGNAME},
               visiblename => "",
               fullname => "",

a valores equivalentes a estos (cambien mis valores por los suyos):

               login => "joy",
               visibleuser => "jrodin",
               visiblename => "jagor.srce.hr",
               fullname => "Josip Rodin",

El primero es su login en master.debian.org (es usted ahora un desarrollador oficial de Debian ¿o no? Si no lo es, lea la Referencia del Desarrollador), el segundo y el tercero son partes de su dirección de contacto antes y después de la arroba ('@'), y el cuarto es su nombre completo.

Entonces conecte con su proveedor de Internet, asegurese una vez mas de que está en el directorio /usr/local/src/gentoo, y ejecute la orden:

       dupload -to master gentoo_0.9.12-1_i386.changes

Dupload le preguntará su password en master.debian.org, envíe sus paquetes, y envíe un pequeño anuncio sobre su envío en <debian-devel-changes@lists.debian.org>.

Si vive en Europa, puede usar otras colas de envío en lugar de master. Para más detalles mire lea dupload(1), dupload(5) y la Referencia del Desarrollador.


Dónde pedir ayuda.

Antes de que decida preguntar en lugares públicos, por favor simplemente RTFM (``Lea el Jodido Manual'', n. del t.). Esto incluye documentación en /usr/doc/dpkg, /usr/doc/debian, /usr/doc/debhelper y las páginas de man/info para todos los programas mencionados en este artículo. Cuando reciva un aviso de fallo (bug report, n. del t.) (sí, avisos de fallos ¡de verdad!) sabrá que es el momento de indagar en el Sistema de Seguimiento de Fallos de Debian (http://www.debian.org/Bugs/) y leer la documentación allí.

Si se une a la lista de distribución de Mentores de Debian en <debian-mentors@lists.debian.org> puede unirse con desarrolladores de Debian con experiencia que le ayudarán con las preguntas que pueda tener. Puede subscribirse a ella enviando un correo electrónico a <debian-mentors-request@lists.debian.org> con la palabra 'subscribe' en el tema del mensaje.

Si aún tiene preguntas, hagalas en la lista de distribución de Desarrolladores de Debian en <debian-devel@lists.debian.org>. Puede subscribirse a ella enviando un correo electrónico a <debian-devel-request@lists.debian.org> con la palabra 'subscribe' en el tema del mensaje. Si ya es un desarrollador de Debian debería estar suscrito a ella de todas formas.

Aunque todo funcionara bien, es el momento de empezar a rezar. ¿Por qué? Por que en sólo unas horas (o días) usuarios de todo el mundo empezarán a usar su paquete, y si cometió algún error crítico será bombardeado por correos de centenares de usuarios furiosos de Debian.... Sólo bromeaba :-)

Relájese y prepárse para recibir reportes de fallos, porque hay mucho más trabajo que hacer antes de seguir completamente las políticas de Debian (una vez más lea la documentación real para detalles). ¡Buena suerte!


next up previous
Superior: Creación de paquetes de Anterior: Acerca de este artículo

Download this document: [src.tar.gz][ps.gz][html.tar.gz][dvi.gz]

Congreso HispaLinux 2000