Précédent: , Monter: Architectures externes   [Table des matières][Index]


10.2 Constructions natives

Les commandes qui prennent en charge l’imitation d’un système spécifique proposent les options --list-systems et --system.

L’option --list-systems liste tous les systèmes pris en charge qui peuvent être passés en argument à --system.

$ guix build --list-systems
Les systèmes disponibles sont :

   - x86_64-linux [current]
   - aarch64-linux
   - armhf-linux
   - i586-gnu
   - i686-linux
   - mips64el-linux
   - powerpc-linux
   - powerpc64le-linux
   - riscv64-linux

$ guix build --system=i686-linux hello
/gnu/store/cc0km35s8x2z4pmwkrqqjx46i8b1i3gm-hello-2.12

$ file /gnu/store/cc0km35s8x2z4pmwkrqqjx46i8b1i3gm-hello-2.12/bin/hello
/gnu/store/cc0km35s8x2z4pmwkrqqjx46i8b1i3gm-hello-2.12/bin/hello: ELF
32-bit LSB executable, Intel 80386 …

Dans l’exemple ci-dessus, le système actuel est x86_64-linux. Le paquet hello est cependant construit pour le système i686-linux.

C’est possible parce que le jeu d’instruction CPU i686 est un sous-ensemble de x86_64, d’où le fait que les binaires ciblant i686 puissent tourner sur x86_64.

Toujours dans le contexte de l’exemple précédent, si on choisit le système aarch64-linux que la commande guix build --system=aarch64-linux hello doit construire des dérivations, une étape supplémentaire est nécessaire.

Les binaires qui cibles aarch64-linux ne peuvent pas tourner directement sur un système x86_64-linux. Une couche d’émulation est requise. Le démon GNU Guix peut utiliser le mécanisme binfmt_misc du noyau Linux pour cela. En résumé, le noyau Linux peut laisser l’exécution d’un binaire qui cible une plateforme externe, ici aarch64-linux à un programme en espace utilisateur, typiquement un émulateur.

Il existe un service qui configure QEMU en tant que moteur pour le mécanisme binfnmt_misc (voir qemu-binfmt-service-type). Sur les distributions externes basées sur Debian, l’alternative consiste à installer le paquet qemu-user-static.

Si le mécanisme binfmt_misc n’est pas correctement mis en place, la construction échouera de cette façon :

$ guix build --system=armhf-linux hello --check
…
 unsupported-platform /gnu/store/jjn969pijv7hff62025yxpfmc8zy0aq0-hello-2.12.drv aarch64-linux
while setting up the build environment: a `aarch64-linux' is required to
build `/gnu/store/jjn969pijv7hff62025yxpfmc8zy0aq0-hello-2.12.drv', but
I am a `x86_64-linux'…

alors que, avec le mécanisme binfmt_misc correctement lié à QEMU, on peut s’attendre à voir :

$ guix build --system=armhf-linux hello --check
/gnu/store/13xz4nghg39wpymivlwghy08yzj97hlj-hello-2.12

Le principal avantage de la construction native par rapport à la compilation croisée est que plus de paquets seront susceptibles de se construire correctement. Cependant cela a un prix : la compilation prise en charge par QEMU est bien plus lente que la compilation croisée, car chaque instruction doit être émulée.

La disponibilité des substituts pour l’architecture ciblée par l’option --system peut atténuer ce problème. Une autre manière de le contourner est d’installer GNU Guix sur une machine dont le CPU prend en charge le jeu d’instruction cible, et de la configurer en tant que machine de déchargement (voir Utiliser le dispositif de déchargement).


Précédent: Compilation croisée, Monter: Architectures externes   [Table des matières][Index]