Précédent: , Monter: Invoquer guix build   [Table des matières][Index]


7.1.4 Débogage des échecs de construction

Lors de la définition d’un nouveau paquet (voir Définition des paquets), vous passerez probablement du temps à déboguer et modifier la construction jusqu’à ce que ça marche. Pour cela, vous devez effectuer les commandes de construction vous-même dans un environnement le plus proche possible de celui qu’utilise le démon de construction.

Pour cela, la première chose à faire est d’utiliser l’option --keep-failed ou -K de guix build, qui gardera l’arborescence de construction dans /tmp ou le répertoire spécifié par TMPDIR (voir --keep-failed).

À partir de là, vous pouvez vous déplacer dans l’arborescence de construction et sourcer le fichier environment-variables, qui contient toutes les variables d’environnement qui étaient définies lorsque la construction a échoué. Disons que vous déboguez un échec de construction dans le paquet foo ; une session typique ressemblerait à cela :

$ guix build foo -K
… build fails
$ cd /tmp/guix-build-foo.drv-0
$ source ./environment-variables
$ cd foo-1.2

Maintenant, vous pouvez invoquer les commandes comme si vous étiez le démon (presque) et corriger le processus de construction.

Parfois il arrive que, par exemple, les tests d’un paquet réussissent lorsque vous les lancez manuellement mais échouent quand ils sont lancés par le démon. Cela peut arriver parce que le démon tourne dans un conteneur où, contrairement à notre environnement au-dessus, l’accès réseau est indisponible, /bin/sh n’existe pas, etc. (voir Réglages de l'environnement de construction).

Dans ce cas, vous pourriez avoir besoin de lancer le processus de construction dans un conteneur similaire à celui que le démon crée :

$ guix build -K foo
…
$ cd /tmp/guix-build-foo.drv-0
$ guix environment --no-grafts -C foo --ad-hoc strace gdb
[env]# source ./environment-variables
[env]# cd foo-1.2

Ici, guix environment -C crée un conteneur et démarre un nouveau shell dedans (voir Invoquer guix environment). La partie --ad-hoc strace gdb ajoute les commandes strace et gdb dans le conteneur, ce qui pourrait s’avérer utile pour le débogage. L’option --no-grafts s’assure qu’on obtient le même environnement, avec des paquets non greffés (voir Mises à jour de sécurité, pour plus d’informations sur les greffes).

Pour obtenir un conteneur plus proche de ce qui serait utilisé par le démon de construction, on peut enlever /bin/sh :

[env]# rm /bin/sh

Ne vous inquiétez pas, c’est sans danger : tout cela se passe dans un conteneur jetable créé par guix environment.

La commande strace n’est probablement pas dans le chemin de recherche, mais on peut lancer :

[env]# $GUIX_ENVIRONMENT/bin/strace -f -o log make check

De cette manière, non seulement vous aurez reproduit les variables d’environnement utilisées par le démon, mais vous lancerez aussi le processus de construction dans un conteneur similaire à celui utilisé par le démon.


Précédent: , Monter: Invoquer guix build   [Table des matières][Index]