Son varias las cirunstancias bajo las que es necesario reconstruir un paquete binario. En algunos casos, el administrador necesita una funcionalidad del software para la que necesitará compilarlo desde sus fuentes con alguna opción de compilación particular; en otras, el software empaquetado para la versión de Debian instalada no es suficientemente reciente. En el último caso, el administrador generalmente compilará un paquete más reciente que obtendrá de una versión más reciente de Debian — como
Testing o inclusive
Unstable — para que este nuevo paquete funcione con su distribución
Stable; esta operación es llamada «retroadaptación» («backporting»). Como siempre, antes de embarcarse en esta tarea, se debe revisar si no fue hecha ya — un repaso rápido al gestor de seguimiento de paquetes Debian mostrará esta información.
15.1.1. Obtención de las fuentes
La reconstrucción de un paquete Debian comienza con la obtención de su código fuente. La forma más fácil es utilizar la orden
apt-get source nombre-paquete
. Esta orden requiere una línea
deb-src
en el archivo
/etc/apt/sources.list
, y archivos de índice actualizados (es decir,
apt-get update
). Estas condiciones ya deberían cumplirse si ha seguido las instrucciones del capítulo que trata sobre la configuración de APT (ver
Sección 6.1, “Contenido del archivo sources.list
”). Sin embargo, hay que tener en cuenta que se descargarán los paquetes fuente de la versión de Debian mencionada en la línea
deb-src
.
Si necesita otra versión, puede que tenga que descargarla manualmente desde una réplica de Debian o desde el sitio web. Esto implica la obtención de dos o tres ficheros (con las extensiones *.dsc
-- para Debian Source Control -- *.tar.comp
, y a veces *.diff.gz
o *.debian.tar. comp
- comp tomando un valor entre gz
, bz2
o xz
dependiendo de la herramienta de compresión en uso), luego ejecute el comando dpkg-source -x file.dsc
. Si se puede acceder directamente al archivo *.dsc
en una URL determinada, hay una forma aún más sencilla de obtenerlo todo, con el dget URL
dominio. Este comando (que se puede encontrar en el paquete devscripts) obtiene el archivo *.dsc
en la dirección dada, luego analiza su contenido y obtiene automáticamente el archivo o archivos a los que se hace referencia. Una vez que se ha descargado todo, verifica la integridad de los paquetes fuente descargados usando dscverify
, y extrae el paquete fuente (a menos que -d
o --download -solo se usa la opción
). Se necesita el conjunto de claves de Debian, a menos que se proporcione la opción -u
.
15.1.2. Realización de cambios
Usemos el paquete samba como ejemplo.
$
apt source samba
Leyendo lista de paquetes... Hecho
NOTA: el empaquetamiento de «samba» se mantiene en el sistema de control de versiones «Git» en:
https://salsa.debian.org/samba-team/samba.git
Utilice:
git clone https://salsa.debian.org/samba-team/samba.git
para obtener las últimas actualizaciones (posiblemente no publicadas aún) del paquete.
Se necesita descargar 12,3 MB de archivos fuente.
Desde:1 http://security.debian.org/debian-security bullseye-security/main samba 2:4.13.13+dfsg-1~deb11u3 (dsc) [4,514 B]
Desde:2 hhttp://security.debian.org/debian-security bullseye-security/main samba 2:4.13.13+dfsg-1~deb11u3 (tar) [11.8 MB]
Get:3 http://security.debian.org/debian-security bullseye-security/main samba 2:4.13.13+dfsg-1~deb11u3 (diff) [468 kB]
Descargados 12.3 MB en 3s (4,582 kB/s)
dpkg-source: información: extrayendo samba en samba-4.13.13+dfsg
dpkg-source: información: desempaquetando samba_4.13.13+dfsg.orig.tar.xz
dpkg-source: información: desempaquetando samba_4.13.13+dfsg-1~deb11u3.debian.tar.xz
dpkg-source: información: using patch list from debian/patches/series
dpkg-source: información: aplicando «07_private_lib»
dpkg-source: información: aplicando «bug_221618_precise-64bit-prototype.patch»
dpkg-source: info: applying [...]
Ahora tiene disponibles las fuentes del paquete en un directorio cuyo nombre coincide con el paquete fuente y su versión (samba-4.13.13+dfsg
); allí es donde trabajaremos en nuestros cambios locales.
Lo primero que debemos hacer es cambiar el número de versión del paquete para que podamos distinguir el paquete recompilado del paquete original que provee Debian. Si asumimos que la versión actual es
2:4.13.13+dfsg-1~deb11u3
, podemos crear la versión
2:4.13.13+dfsg-1~deb11u3+falcot1
, que claramente indica el origen del paquete. Esto además hace que el número de versión del paquete sea mayor que el que provee Debian para que el paquete se instale fácilmente como actualización del paquete original. La mejor forma de realizar dicho cambio es con la orden
dch
(
Debian CHangelog) del paquete
devscripts.
$
cd 4.13.13+dfsg-1~deb11u3
$
dch --local +falcot
La última orden llama a un editor de texto (
sensible-editor
—esto debería ser su editor favorito si se menciona en las variables de entorno
VISUAL
o
EDITOR
, y el editor predeterminado en caso contrario—) para permitir documentar las diferencias que ha traido esta recompilación. El editor nos muestra que
dch
realmente cambió el archivo
debian/changelog
.
When a change in build options is required, the changes need to be made in debian/rules
, which drives the steps in the package build process. In the simplest cases, the lines concerning the initial configuration (./configure …
) or the actual build ($(MAKE) …
or make …
or cmake …
or …) are easy to spot. If these commands are not explicitly called, they are probably a side effect of another explicit command, in which case please refer to their documentation to learn more about how to change the default behavior. With packages using dh
, you might need to add an override for the dh_auto_configure
or dh_auto_build
commands (see their respective manual pages and debhelper(7) for explanations on how to achieve this).
Dependiendo de los cambios locales a los paquetes, también podría necesitar actualizar el archivo debian/control
, que contiene una descripción de los paquetes generados. En particular, este paquete contiene líneas Build-Depends
que controlan la lista de dependencias que se deben cumplir en el momento de compilar un paquete. Éstas líneas generalmente hacen referencia a las versiones de los paquetes que se encuentran en la distribución de la que proveen los paquetes fuente pero que pueden no estar disponibles en la distribución en la que estamos recompilando. No hay una forma automatizada para determinar si una dependencia es real o sólo está presente para garantizar que sólo se intente compilar con la última versión de una biblioteca — esta es la única forma de forzar que autobuilder utilice una versión específica de un paquete durante su compilación, por lo que los desarrolladores Debian frecuentemente utilizan dependencias de compilación con versiones estrictas.
Si está seguro que estas dependencias de compilación son muy estrictas, siéntase libre de relajarlas localmente. Lea los archivos que documentan la forma estándar de compilar el software — generalmente estos archivos son llamados INSTALL
— le ayudarán a encontrar las dependencias adecuadas. Idealmente, podrá satisfacer todas las dependencias en la distribución que utilice para recompilar; de lo contrario, comienza un proceso recursivo en el que debemos retroadaptar los paquetes mencionados en el campo Build-Depends
antes de poder finalizar con el paquete deseado. Algunos paquetes pueden no necesitar ser retroadaptados y puede instalarlos tal cual durante el proceso de compilación (un ejemplo notable es debhelper). Sepa que el proceso de retroadaptación puede volverse muy complejo rápidamente si no tiene cuidado. Por lo tanto, debe mantener al mínimo las retroadaptaciones siempre que sea posible.
15.1.3. Inicio de la recompilación
Cuando aplicamos los cambios necesarios a las fuentes, podemos comenzar la generación del paquete binario (archivo .deb
). El programa dpkg-buildpackage
gestiona todo el proceso.
Ejemplo 15.1. Recompilación del paquete
$
dpkg-buildpackage -us -uc
[...]
El comando anterior puede fallar si el campo
Build-Depends
no se ha actualizado o si los paquetes relacionados no están instalados. En tal caso, es posible evitar este chequeo con la opción
-d
en
dpkg-buildpackage
. Sin embargo, al ignorar explícitamente estas dependencias corre el riesgo de que el proceso de compilación falle en una etapa posterior. Lo que es peor, el paquete puede parecer compilar correctamente pero no ejecutarse correctamente: algunos programas desactivan automáticamente algunas de sus funcionalidades cuando la biblioteca necesaria no está disponible en el momento de compilarlo. El cambio aún puede servir si solo desea crear un paquete fuente, que se supone que debe pasarse a entornos de compilación limpios como se describe en
VISTA RÁPIDA Construyendopaquetes en entornos chrooted y virtual.
The other options used in the above example make sure that neither the source package's .dsc
(-us
) nor the produced .changes
file (-uc
) get signed with the package builder's cryptographic key after the asuccessful build.
La mayoría de las veces, los desarrolladores Debian utilizan un programa de alto nivel como debuild
; éste ejecuta dpkg-buildpackage
normalmente, pero también agrega una invocación de un programa que ejecuta muchos chequeos para validar el paquete generado según la normativa Debian. Este script también limpia el entorno para que las variables de entorno locales no «contaminen» la compilación del paquete. El comando debuild
es una de las herramientas del paquete devscripts, que comparte un poco de consistencia y configuración para facilitar la tarea del desarrollador.