Capítulo 6. Construcción del paquete

# Capítulo 6. Construcción del paquete

The rewrite of this tutorial document with updated contents and more practical examples is available as Guide for Debian Maintainers. Please use this new tutorial as the primary tutorial document.

Ahora deberíamos estar preparados para construir el paquete.

## 6.1. (Re)construcción completa

Para realizar correctamente la (re)compilación completa de un paquete, debes asegurarte que tienes instalados:

- el paquete `build-essential`.

- los paquetes listados en el campo `Build-Depends` del archivo «control» (Sección 4.1, “El archivo `control`” ), y

- los paquetes listados en el campo `Build-Depends-indep` (también del archivo «control», Sección 4.1, “El archivo `control`”).

Después ejecuta la siguiente orden en el directorio raíz del código fuente del programa:

    $ dpkg-buildpackage -us -uc

Esto hará todo lo necesario para construir los paquetes binarios y de fuentes para ti. Para ello:

- limpia el árbol del código fuente («`debian/rules clean`»)

- construye el paquete de código («`dpkg-source -b`»)

- construye el programa («`debian/rules build`»)

- construye el paquete binario (`fakeroot debian/rules binary`)

- genera el fichero `.dsc`

- genera el fichero `.changes`, utilizando dpkg-genchanges

If the build result is satisfactory, sign the `.dsc` and `.changes` files with your private GPG key using the debsign command. You need to enter your secret pass phrase, twice. [62]

Para los paquetes no nativos Debian, p.ej, `gentoo`, podrás ver los siguientes archivos en el directorio padre (`~/gentoo`) después de construir el paquete:

- `gentoo_0.9.12.orig.tar.gz`

  This is the original upstream source code tarball, merely renamed to the above so that it adheres to the Debian standard. Note that this was created initially by the command `dh_make -f ../gentoo-0.9.12.tar.gz`.

- `gentoo_0.9.12-1.dsc`

  Este es un sumario de los contenidos del código fuente. Este fichero se genera a partir del fichero de `control` y se usa cuando se descomprimen las fuentes con dpkg-source(1).

- `gentoo_0.9.12-1.debian.tar.gz`

  Este fichero comprimido contiene el directorio `debian` completo. Todas las modificaciones de las fuentes originales se conservan en los archivos de parches quilt en el directorio `debian/patches`.

  Si alguien quiere volver a construir tu paquete desde cero, puede hacerlo fácilmente usando los tres ficheros de arriba. El proceso de extracción es trivial: sólo se debe copiar los tres ficheros en algún lado y ejecutar `dpkg-source -x gentoo_0.9.12-1.dsc` [63].

- `gentoo_0.9.12-1_i386.deb`

  Este es el paquete binario completo. Puedes usar dpkg para instalar o eliminar tanto este paquete como cualquier otro.

- `gentoo_0.9.12-1_i386.changes`

  Este fichero describe todos los cambios hechos en la revisión actual del paquete, y lo utilizan los programas de mantenimiento del archivo FTP de Debian para instalar los paquetes binarios y fuentes. Se genera parcialmente a partir del fichero `changelog` y el fichero `.dsc`.

  Mientras sigues trabajando en el paquete, éste cambiará su comportamiento y se le añadirán nuevas funciones. Las personas que descarguen tu paquete pueden leer este fichero y ver qué ha cambiado. Los programas de mantenimiento del archivo de Debian, también enviarán el contenido de este fichero a la lista de correo debian-changes-announce@lists.debian.org.

The `gentoo_0.9.12-1.dsc` and `gentoo_0.9.12-1_i386.changes` files must be signed using the debsign command with your private GPG key in the `~/.gnupg/` directory, before uploading them to the Debian FTP archive. The GPG signature provides the proof that these files are really yours, using your public GPG key.

The debsign command can be made to sign with your specified secret GPG key ID (good for sponsoring packages) with the following in the `~/.devscripts` file:

    DEBSIGN_KEYID=Tu_GPG_keyID

Las largas listas de números en los ficheros `.dsc` y `.changes` son las sumas MD5/SHA1/SHA256 de los ficheros incluidos en el paquete. Las personas que descarguen estos ficheros pueden comprobarlos con md5sum(1), sha1sum(1) o sha256sum(1) y si los números no coinciden, sabrán que el fichero está corrupto o ha sido modificado.

## 6.2. Autobuilder

Debian mantiene diversas adaptaciones «ports» con la red de servidores de compilación automática que ejecuta demonios buildd en ordenadores con diferentes arquitecturas. Aunque no deberás hacer todo esto tú mismo, debes conocer el proceso al que se verá sometido tu paquete. Veamos cómo se procesa el paquete para compilarlo en diversas arquitecturas [64].

Los paquetes del tipo `Architecture: any`, son construidos por el sistema de compilación automática. El sistema garantiza la instalación de:

- el paquete `build-essential`, y

- los paquetes listados en el campo `Build-Depends` (véase Sección 4.1, “El archivo `control`” ).

A continuación se ejecuta la siguiente orden en el directorio de las fuentes:

    $ dpkg-buildpackage -B

De esta manera, se ejecuta todo lo necesario para construir el paquete binario dependiente de la arquitectura en cada arquitectura. Hace lo siguiente:

- limpia el árbol del código fuente («`debian/rules clean`»)

- construye el programa («`debian/rules build`»)

- construye el paquete binario para la arquitectura (`fakeroot debian/rules binary-arch`)

- firma el fichero fuente `.dsc`, usando gpg

- genera y firma el fichero de envío `.changes`, usando dpkg-genchanges y gpg

Esta es la razón por la que el paquete estará disponible para otras arquitecturas.

Aunque es necesario instalar los paquetes listados en el campo `Build-Depends-indep` para el empaquetamiento normal (véase Sección 6.1, “(Re)construcción completa” ), el sistema automático de construcción no lo requiere puesto que solo construye paquetes binarios dependientes de la arquitectura [65]. Estas diferencias entre el empaquetamiento normal y el automático determinan si los paquetes requeridos para la compilación se deben listar en el campo `Build-Depends` o bien en el campo `Build-Depends-indep` del archivo `debian/control` (véase Sección 4.1, “El archivo `control`” ).

## 6.3. La orden debuild

Puedes automatizar aún más el proceso de construcción de paquetes de la orden dpkg-buildpackage con la orden debuild. Véase debuild(1).

The debuild command executes the lintian command to make a static check after building the Debian package. The lintian command can be customized with the following in the `~/.devscripts` file:

    DEBUILD_DPKG_BUILDPACKAGE_OPTS="-us -uc -I -i"
    DEBUILD_LINTIAN_OPTS="-i -I --show-overrides"

Por ejemplo, limpiar el código y reconstruir el paquete desde una cuenta de usuario es tan simple como:

    $ debuild

Puedes eliminar los archivos generados en la compilación ejecutando:

    $ debuild -- clean

## 6.4. El paquete `pbuilder`

El paquete `pbuilder` es muy útil para conseguir un entorno de compilación limpio (chroot) donde verificar las dependencias de compilación [66]. Esto asegura una construcción limpia desde el código en los auto-compiladores de `sid` para las distintas arquitecturas y evita fallos de nivel de severidad serios del tipo FTBFS («Fail to Build From Source», o «fallo al construir desde la fuente »), que son siempre de categoría RC (fallos críticos o «release critical»). [67]

Para personalizar el funcionamiento del paquete `pbuilder` haz lo siguiente:

- permite que tu usuario del sistema tenga permiso de escritura en el directorio `/var/cache/pbuilder/result`.

- crea un directorio, p.e. ``/var/cache/pbuilder/hooks``, con permiso de escritura para tu usuario. En este directorio pondrás los guiones «hook»

- establece los archivos `~/.pbuilderrc` o `/etc/pbuilderrc` con el siguiente contenido:

      AUTO_DEBSIGN=${AUTO_DEBSIGN:-no}
      HOOKDIR=/var/cache/pbuilder/hooks

Ahora puedes inicializar el sistema local `pbuilder` chroot por primera vez ejecutando:

    $ sudo pbuilder create

Si ya dispones de un paquete fuente completo, ejecuta las siguientes órdenes en el directorio donde tengas los archivos ``nombre_del_paquete`.orig.tar.gz`, ``nombre_del_paquete`.debian.tar.gz` y ``nombre_del_paquete`.dsc` para actualizar el sistema local `pbuilder` chroot y, a continuación, compilar el paquete binario en él:

    $ sudo pbuilder --update
    $ sudo pbuilder --build nombre_del_paquete.dsc

Una vez finalizada la compilación, el paquete compilado estará en el directorio `/var/cache/pbuilder/result/` cuyo propietario será tu usuario en lugar del usuario administrador.

Las firmas GPG en los archivos `.dsc` y `.changes` se puede generar como sigue

    $ cd /var/cache/pbuilder/result/
    $ debsign nombre_del_paquete_versión_arquitectura.changes

Si en lugar de iniciar la construcción del paquete a partir de un paquete ya construido, dispones de un directorio con las fuentes originales actualizadas, deberás ejecutar las siguientes órdenes desde el directorio de las fuentes originales (y en el que deberá estar presente el directorio `debian` con todo su contenido):

    $ sudo pbuilder --update
    $ pdebuild

Puedes «conectarte» al entorno chroot ejecutando la orden `pbuilder --login --save-after-login` y configurarlo para adaptarlo a tus necesidades. Este entorno puede guardarse saliendo del «shell» con `^D` (Control-D).

La última versión de la orden lintian puede ejecutarse automáticamente en el entorno `chroot` utilizando el guión «hook» disponible en ``/var/cache/pbuilder/hooks`/B90lintian` y configurado como sigue [68]:

    #!/bin/sh
    set -e
    install_packages() {
            apt-get -y --allow-downgrades install "$@"
            }
    install_packages lintian
    echo "+++ lintian output +++"
    su -c "lintian -i -I --show-overrides /tmp/buildd/*.changes" - pbuilder
    # use this version if you don't want lintian to fail the build
    #su -c "lintian -i -I --show-overrides /tmp/buildd/*.changes; :" - pbuilder
    echo "+++ end of lintian output +++"

Debes tener un entorno `sid` actualizado para construir correctamente paquetes para `sid`. En realidad, al versión `sid` puede contener errores que no hacen recomendable la migración de tu sistema a esta versión. El paquete `pbuilder` te ayuda a hacer frente a esta situación.

You may need to update your `stable` packages after their release for `stable-proposed-updates`, `stable/updates`, etc. [69] For such occasions, the fact that you may be running a `sid` system is not a good enough excuse for failing to update them promptly. The `pbuilder` package can help you to access environments of almost any Debian derivative distribution of the same architecture.

Consulta http://www.netfort.gr.jp/~dancer/software/pbuilder.html, pdebuild(1), pbuilderrc(5), y pbuilder(8).

## 6.5. git-buildpackage command and similar

Si el autor original utiliza un sistema de gestión de versiones para el código [70] puedes considerar utilizarlo. Así se facilita la coordinación y la selección de los parches en las fuentes. Debian dispone de varios paquetes de guiones especializados en cada tipos de VCS:

- `git-buildpackage`: conjunto para la compilación de paquetes en repositorios «Git».

- `svn-buildpackage`: programas de ayuda para el mantenimiento de paquetes Debian con «Subversion».

- `cvs-buildpackage`: conjunto de paquete de guiones Debian para estructuras de directorios CVS.

El uso de `git-buildpackage` se está convirtiendo en muy popular para los desarrolladores de Debian para el mantenimiento de los paquetes Debian con el servidor Git en alioth.debian.org. [71] Este paquete ofrece muchas órdenes para automatizar el mantenimiento de paquetes:

- gbp-import-dsc(1): import a previous Debian package to a Git repository.

- gbp-import-orig(1): import a new upstream tar to a Git repository.

- gbp-dch(1): generate the Debian changelog from Git commit messages.

- git-buildpackage(1): compila los paquetes Debian del repositorio «Git».

- git-pbuilder(1): compila los paquetes Debian del repositorio «Git» utilizando pbuilder/cowbuilder.

Estas órdenes utilizan 3 ramas en la gestión del proceso de empaquetado:

- `main` (principal) del árbol de directorios del paquete Debian.

- `upstream` (autor) para el árbol de las fuentes del autor.

- `pristine-tar` por el fichero comprimido «.tar» del autor generado por la opción `--pristine-tar`.[72]

Puedes configurar `git-buildpackage` con `~/.gbp.conf`. Lee gbp.conf(5). [73]

## 6.6. Reconstrucción rápida

Con un paquete grande, puede que no quieras recompilar desde cero cada vez que tocas un detalle en el fichero `debian/rules`. Para propósitos de prueba, puedes hacer un fichero `.deb` sin necesidad de recompilar las fuentes originales de esta forma[74]:

      fakeroot debian/rules binary

O simplemente puedes comprobar si el paquete se compila con:

    $ fakeroot debian/rules build

Una vez terminada la puesta a punto, recuerda reconstruir el paquete siguiendo el procedimiento adecuado explicado anteriormente. Puede que no seas capaz de enviar correctamente el paquete si intentas enviar los archivos `.deb` construidos de esta forma.

## 6.7. Jerarquía de órdenes

A continuación hay un breve resumen de cómo las órdenes de construcción de paquetes encajan jerárquicamente. Hay muchas maneras de hacer lo mismo.

- `debian/rules` = guión del desarrollador para la construcción del paquete

- dpkg-buildpackage = orden principal de las herramientas de compilación

- debuild = dpkg-buildpackage + lintian (construcción con la configuración estándar de las variables de entorno)

- pbuilder = núcleo de la herramienta de entorno «chroot» de Debian

- pdebuild = pbuilder + dpkg-buildpackage (construcción en el entorno «chroot»"

- cowbuilder = ejecución acelerada de pbuilder

- git-pbuilder = la versión de sintaxis fácil para pdebuild (utilizado por gbp buildpackge)

- gbp = gestor de los ficheros Debian del paquete en un repositorio «git»

- gbp buildpackge = pbuilder + dpkg-buildpackage + gbp

Aunque el uso de las órdenes de nivel superior como gbp buildpackge y pbuilder asegura el entorno perfecto de construcción de paquetes, es esencial para comprender cómo órdenes de menor nivel, tales como `debian/rules` y dpkg-buildpackage se ejecutan subordinadas.

[62] Esta clave GPG debe ser firmado por un desarrollador de Debian para conectarse a la red de confianza y debe registrarse en el anillo de claves de Debian. Esto permite que los paquetes sean aceptados en los repositorios de Debian. Consulta Cómo crear un clave GPG nueva y Wiki de Debian sobre la firma de claves.

[63] Puedes evitar la aplicación automática de las modificaciones por dquilt en los paquetes con formato `3.0 (quilt)` al final de la extracción con la opción `--skip-patches`. También puedes deshacer las modificaciones al finalizar la extracción con la ejecución de `dquilt pop -a`.

[64] El funcionamiento del sistema actual de compilación automática es más complicado que lo expuesto en este documento. Muchos detalles quedan fuera de los objetivos de este documento.

[65] Contrariamente al modo de funcionamiento del paquete `pbuilder` (que se tratará más adelante), el entorno chroot del paquete `sbuild` utilizado por el sistema automático no tiene una instalación mínima de paquetes del sistema y puede dejar muchos paquetes instalados.

[66] Dado que el paquete `pbuilder` está evolucionando, deberías comprobar la situación de la configuración consultando la última documentación oficial disponible.

[67] Consulta http://buildd.debian.org/ para saber más sobre la construcción automática de paquetes Debian.

[68] Se supone que la variable de entorno `HOOKDIR=/var/cache/pbuilder/hooks` ya está configurada. Puedes consultar otros ejemplos en `/usr/share/doc/pbuilder/examples`.

[69] Hay algunas restricciones para estas actualizaciones de tu paquete `stable`.

[70] Consulta Version control systems para saber más.

[71] Debian wiki Alioth documenta cómo utilizar el servicio alioth.debian.org.

[72] The `--pristine-tar` option invokes the pristine-tar command, which can regenerate an exact copy of a pristine upstream tarball using only a small binary delta file and the contents of the tarball that are typically kept in an `upstream` branch in the VCS.

[73] Aquí tienes algunos recursos disponibles en la red, dirigidos a usuarios expertos.

- Construcción paquetes Debian con «git-buildpackage» (`/usr/share/doc/git-buildpackage/manual-html/gbp.html`)

- debian packages in git

- Using Git for Debian Packaging

- git-dpm: Debian packages in Git manager

[74] Environment variables that are normally configured to proper values are not set by this method. Never create real packages to be uploaded using this quick method.

Capítulo 5. Otros ficheros en el directorio `debian`. |  | Capítulo 7. Comprobación del paquete en busca de fallos