Précédent: Compilation croisée, Monter: Architectures externes [Table des matières][Index]
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]