Recompilar un paquet binari és necessari sota diversos conjunts de circumstàncies. En alguns casos, l'administrador necessita una característica de programari que requereix que el programari sigui compilat a partir de les fonts, amb una opció de compilació particular; en altres, el programari empaquetat en la versió instal·lada de Debian no és prou recent. En aquest últim cas, l'administrador normalment crearà un paquet més recent a partir d'una versió més nova de Debian — com ara
Testing o fins i tot
Unstable — de manera que aquest nou paquet funcioni a la distribució
Stable; aquesta operació s'anomena «backporting». Com de costum, abans d'emprendre una tasca d'aquest tipus, s'hauria de tenir cura de comprovar si ja s'ha fet — un cop d'ull ràpid al Debian Package Tracker per a aquest paquet revelarà aquesta informació.
15.1.1. Obtenir les fonts
La recompilació d'un paquet Debian comença per obtenir el seu codi font. La manera més senzilla és utilitzar l'ordre
apt-get source nom-del-paquet
. Aquesta ordre requereix una línia
deb-src
al fitxer
/etc/apt/sources.list
, i fitxers d'índex actualitzats (és a dir,
apt-get update
). Aquestes condicions ja s'haurien de complir si seguiu les instruccions del capítol que tracta sobre la configuració d'APT (vegeu
Secció 6.1, «Omplint el fitxer sources.list
»). Tingueu en compte, però, que descarregareu els paquets font de la versió Debian mencionada a la línia
deb-src
.
Si es necessita una altra versió, potser s'ha de descarregar manualment des d'un mirall de Debian o des del lloc web. Això implica la descàrrega de dos o tres fitxers (amb les extensions *.dsc
– de Debian Source Control – *.tar.comp
, i de vegades *.diff.gz
o *.debian.tar.comp
— comp eesent un valor entre gz
, bz2
o xz
depenent de l'eina de compressió usada), i llavors executeu l'ordre dpkg-source -x fitxer.dsc
. Si el fitxer *.dsc
és directament accessible en una URL donada, hi ha una manera encara més senzilla d'obtenir-ho tot, amb l'ordre dget URL
. Aquesta ordre (que es pot trobar al paquet devscripts) obté el fitxer *.dsc
a l'adreça donada, després n'analitza el contingut, i automàticament descarrega el fitxer o fitxers referenciats dins. Una vegada que tot s'ha baixat, verifica la integritat dels paquets font descarregats utilitzant dscverify
, i extreu el paquet font (tret que s'utilitzi l'opció -d
o --download-only
). Es necessita l'anell de claus de Debian, llevat que se li passi l'opció -u
.
Usem el paquet samba com a exemple.
$
apt source samba
Reading package lists... Done
NOTICE: 'samba' packaging is maintained in the 'Git' version control system at:
https://salsa.debian.org/samba-team/samba.git
Please use:
git clone https://salsa.debian.org/samba-team/samba.git
to retrieve the latest (possibly unreleased) updates to the package.
Need to get 12.3 MB of source archives.
Get:1 http://security.debian.org/debian-security bullseye-security/main samba 2:4.13.13+dfsg-1~deb11u3 (dsc) [4,514 B]
Get:2 http://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]
Fetched 12.3 MB in 3s (4,582 kB/s)
dpkg-source: info: extracting samba in samba-4.13.13+dfsg
dpkg-source: info: unpacking samba_4.13.13+dfsg.orig.tar.xz
dpkg-source: info: unpacking samba_4.13.13+dfsg-1~deb11u3.debian.tar.xz
dpkg-source: info: using patch list from debian/patches/series
dpkg-source: info: applying 07_private_lib
dpkg-source: info: applying bug_221618_precise-64bit-prototype.patch
dpkg-source: info: applying [...]
El codi font del paquet està disponible en un directori anomenat a partir del nom del paquet font i de la versió (samba-4.13.13+dfsg
); aquí és on treballarem en els nostres canvis locals.
El primer que cal fer és canviar el número de versió del paquet, de manera que els paquets reconstruïts es puguin distingir dels paquets originals proporcionats per Debian. Suposant que la versió actual és
2:4.13.13+dfsg-1~deb11u3
, es pot crear la versió
2:4.13.13+dfsg-1~deb11u3+falcot1
, que indica clarament l'origen del paquet. Això fa que el número de la versió del paquet sigui més alt que el que proporciona Debian, de manera que el paquet s'instal·larà fàcilment com una actualització del paquet original. Aquest canvi és millor fer-lo amb l'ordre
dch
(
Debian CHangelog) del paquet
devscripts.
$
cd 4.13.13+dfsg-1~deb11u3
$
dch --local +falcot
L'última ordre invoca un editor de text (
sensible-editor
— aquest hauria de ser el vostre editor preferit si s'esmenta en les variables d'entorn
VISUAL
o
EDITOR
, i l'editor per defecte altrament) per permetre documentar les diferències aportades per aquesta recompilació. Aquest editor ens mostra que
dch
realment ha canviat el fitxer
debian/changelog
.
Quan es requereix un canvi en les opcions de compilació, els canvis s'han de fer a debian/rules
, que controlar les passes del procés de construcció de paquets. En els casos més senzills, les línies relatives a la configuració inicial (./configure ...
) o la compilació real ($(MAKE) ...
o make ...
o cmake …
o ...) són fàcils de veure. Si aquestes ordres no es criden explícitament, són probablement un efecte colateral d'una altra ordre explícita, en aquest cas consulteu la seva documentació per aprendre més sobre com canviar el comportament per defecte. Amb els paquets que utilitzen dh
, és possible que hàgiu d'afegir un «override» o “substitució” per a les ordres dh_auto_configure
o dh_auto_build
(vegeu les seves respectives pàgines de manual i debhelper(7) per a explicacions sobre com aconseguir-ho).
Depenent dels canvis locals en els paquets, també es pot requerir una actualització al fitxer debian/control
, que conté una descripció dels paquets generats. En concret, aquest fitxer conté línies Build-Depends
que controlen la llista de dependències que s'han de complir en el moment de compilació del paquet. Aquestes sovint es refereixen a versions dels paquets continguts en la distribució del paquet font, però que poden no estar disponibles en la distribució utilitzada per a la recompilació. No hi ha una manera automatitzada de determinar si una dependència és real o només especificada per garantir que la construcció només s'hauria d'intentar amb l'última versió d'una biblioteca — aquesta és l'única manera que hi ha per forçar un «autobuilder» a utilitzar una versió donada del paquet durant la compilació, que és per això que els mantenidors de Debian sovint utilitzen dependències de construcció amb versions “estrictes”.
Si se sap amb seguretat que aquestes dependències de construcció són massa estrictes, no hi patiu per relaxar-les localment. Llegir els fitxers que documenten la manera estàndard de construir el programari — aquests fitxers sovint s'anomenen INSTALL
— us ajudarà a esbrinar les dependències apropiades. Idealment, totes les dependències han de ser satisfetes des de la distribució utilitzada per a la recompilació; si no ho són, s'inicia un procés recursiu en el qual els paquets esmentats al camp Build-Depends
han de ser “retroadaptats” abans que el paquet desitjat ho pugui ser. Alguns paquets poden no necessitar “retroadaptació”, i es poden instal·lar tal qual durant el procés de construcció (un exemple notable és debhelper). Tingueu en compte que el procés de retroadaptació pot tornar-se complex ràpidament si no aneu amb compte. Per tant, les retroadaptacions han de mantenir-se en un mínim estricte sempre que sigui possible.
15.1.3. Inici de la recompilació
Quan s'han aplicat tots els canvis necessaris a les fonts, podem començar a generar el paquet binari real (fitxer .deb
). Tot el procés és gestionat per l'ordre dpkg-buildpackage
.
Exemple 15.1. Recompilació d'un paquet
$
dpkg-buildpackage -us -uc
[...]
L'ordre anterior pot fallar si el camp
Build-Depends
no s'ha actualitzat, o si els paquets relacionats no estan instal·lats. En aquest cas, és possible anul·lar aquesta comprovació passant l'opció
-d
a
dpkg-buildpackage
. No obstant això, ignorar explícitament aquestes dependències corre el risc que el procés de construcció falli més endavant. O pitjor encara, el paquet pot semblar que es compila bé i no funcionar correctament: alguns programes desactiven automàticament algunes de les seves característiques quan una biblioteca requerida no està disponible en el moment de la compilació. L'opció encara pot ser molt útil si només voleu crear un paquet de codi font, que se suposa que es farà arribar a entorns nets de compilació com es descriu en
ULLADA RÀPIDA Compilació de paquets en entorns chroot i virtual.
Les altres opcions utilitzades en l'exemple anterior s'asseguren que ni el fitxer de codi font .dsc
(-us
) ni el fitxer produït .changes
(-uc
) se signin amb la clau criptogràfica del mantenidor del paquet després d'una compilació exitosa.
Sovint, els desenvolupadors de Debian utilitzen un programa d'alt nivell com debuild
; això executa dpkg-buildpackage
com de costum, però també afegeix una invocació d'un programa que executa moltes comprovacions per validar el paquet generat segons la política de Debian. Aquest script també neteja l'entorn de manera que les variables d'entorn locals no "contaminin" la construcció del paquet. L'ordre debuild
és una de les eines de la suite devscripts, que comparteixen una certa coherència i configuració per facilitar la tasca dels mantenidors.