Guide de compilation croisée avec DistCC
1.
Compilation croisée avec distcc
Introduction
distcc est un outil qui permet de distribuer des tâches de compilation
sur plusieurs ordinateurs en réseau. Tant que toutes les machines du réseau
utilisent la même chaîne de compilation (NdT, en anglais : toolchain)
compilée pour la même architecture de processeur, aucune configuration
particulière de distcc n'est nécessaire. Mais que faire si on veut
compiler pour différentes architectures en utilisant différentes
machines ? Ce guide vous explique comment configurer distcc pour
compiler pour différentes architectures.
Installation des outils nécessaires
D'abord, il vous faut installer crossdev sur toutes les machines qui
seront impliquées dans la compilation croisée. crossdev est un outil qui
facilite la création de chaîne de compilation pour architectures croisées. Il
fut à l'origine écrit par Joshua Kinard et
a été récrit depuis zéro par Mike
Frysinger. Son utilisation est des plus simples : crossdev -t
sparc construira une chaîne de compilation croisée complète pour
l'architecture Sparc. Cela inclut binutils, gcc, glibc et les linux-headers. Si
vous voulez en savoir plus sur les fonctionnalités, lancez crossdev
--help. Évidemment, il vous faudra installer la chaîne de compilation
croisée appropriée sur chaque machine.
Ensuite, il faut installer distcc sur toutes les machines impliquées
dans le processus. Cela comprend la machine qui lancera emerge et les
machines avec les compilateurs croisés. Veuillez consulter la documentation DistCC Gentoo pour plus
d'informations à propos de l'installation et l'utilisation de distcc.
Remarques concernant certaines architectures
Si vous faites une compilation croisée entre différentes sous-architectures
d'Intel x86 (par exemple : i586 et i686), il vous faut tout de même
compiler une chaîne de compilation croisée complète correspondant au CHOST
voulu, sinon la compilation échouera. Cela vient du fait que i586 et i686 sont
en fait deux CHOSTs différents bien qu'ils soient tous deux considérés comme
des « x86. » N'oubliez pas ceci lorsque vous construisez vos chaînes
de compilation croisées. Par exemple, si la machine de destination est de type
i586, cela veut dire que vous devez construire une chaîne de compilation
croisée i586 sur toutes les machines i686 qui vont participer à la
compilation.
Configuration de distcc pour la compilation croisée
Dans la configuration par défaut de distcc, la compilation croisée ne
fonctionnera pas correctement. Le problème vient du fait que beaucoup de
processus de compilation ne font qu'appeler gcc au lieu d'utiliser le
nom complet du compilateur (sparc-unknown-linux-gnu-gcc par exemple).
Quand cette compilation est distribuée aux autres machines, le compilateur
natif est appelé à la place du compilateur croisé fraîchement installé.
Heureusement, il est possible de contourner ce petit problème. Il suffit d'un
script de lancement et de quelques liens symboliques sur la machine qui lancera
emerge. J'utiliserai ma machine Sparc comme exemple. À chaque fois que
vous verrez sparc-unknown-linux-gnu, il vous faudra le remplacer par
votre propre CHOST (x86_64-pc-linux-gnu pour un AMD64 par exemple).
Quand vous installez distcc pour la première fois, le répertoire
/usr/lib/distcc/bin ressemble à ceci :
Note :
Les commandes suivantes ne doivent être effectuées que sur la machine qui lance
emerge. Ne suivez pas ces étapes pour les machines de soutien.
|
Exemple de code 1.1 : Compilateurs disponibles |
# cd /usr/lib/distcc/bin
# ls -l
total 0
lrwxrwxrwx 1 root root 15 Dec 23 20:13 c++ -> /usr/bin/distcc
lrwxrwxrwx 1 root root 15 Dec 23 20:13 cc -> /usr/bin/distcc
lrwxrwxrwx 1 root root 15 Dec 23 20:13 g++ -> /usr/bin/distcc
lrwxrwxrwx 1 root root 15 Dec 23 20:13 gcc -> /usr/bin/distcc
lrwxrwxrwx 1 root root 15 Dec 23 20:13 sparc-unknown-linux-gnu-c++ -> /usr/bin/distcc
lrwxrwxrwx 1 root root 15 Dec 23 20:13 sparc-unknown-linux-gnu-g++ -> /usr/bin/distcc
lrwxrwxrwx 1 root root 15 Dec 23 20:13 sparc-unknown-linux-gnu-gcc -> /usr/bin/distcc
|
Voilà ce qu'il faut faire :
Exemple de code 1.2 : Modifier distcc |
# rm c++ g++ gcc cc
|
Ensuite, il faut créer le nouveau script sur cette machine. Lancez votre
éditeur de texte favori, créez un fichier contenant le texte suivant et
enregistrez-le sous le nom de sparc-unknown-linux-gnu-wrapper.
N'oubliez pas d'utiliser le CHOST correspondant à la machine qui utilisera
emerge.
Exemple de code 1.3 : Le nouveau script |
#!/bin/bash
exec /usr/lib/distcc/bin/sparc-unknown-linux-gnu-g${0:$[-2]} "$@"
|
Pour continuer, il faut rendre le script exécutable et créer les liens
symboliques nécessaires :
Exemple de code 1.4 : Créer les liens symboliques |
# chmod a+x sparc-unknown-linux-gnu-wrapper
# ln -s sparc-unknown-linux-gnu-wrapper gcc
# ln -s sparc-unknown-linux-gnu-wrapper cc
# ln -s sparc-unknown-linux-gnu-wrapper c++
# ln -s sparc-unknown-linux-gnu-wrapper g++
|
Une fois fini, /usr/lib/distcc/bin devrait ressembler à ceci :
Exemple de code 1.5 : Un jeu correct de compilateurs |
# ls -l
total 4
lrwxrwxrwx 1 root root 25 Jan 18 14:20 c++ -> sparc-unknown-linux-gnu-wrapper
lrwxrwxrwx 1 root root 25 Jan 18 14:20 cc -> sparc-unknown-linux-gnu-wrapper
lrwxrwxrwx 1 root root 25 Jan 18 14:20 g++ -> sparc-unknown-linux-gnu-wrapper
lrwxrwxrwx 1 root root 25 Jan 18 14:20 gcc -> sparc-unknown-linux-gnu-wrapper
lrwxrwxrwx 1 root root 15 Nov 21 10:42 sparc-unknown-linux-gnu-c++ -> /usr/bin/distcc
lrwxrwxrwx 1 root root 15 Nov 21 10:42 sparc-unknown-linux-gnu-g++ -> /usr/bin/distcc
lrwxrwxrwx 1 root root 15 Jul 27 10:52 sparc-unknown-linux-gnu-gcc -> /usr/bin/distcc
-rwxr-xr-x 1 root root 70 Jan 18 14:20 sparc-unknown-linux-gnu-wrapper
|
Félicitations, vous avez maintenant (normalement) une installation fonctionnelle
de distcc pour la compilation croisée.
Comment ça marche ?
Lorsque distcc est appelé, il regarde de quelle manière il a été appelé
(i686-pc-linux-gnu-gcc, sparc-unknown-linux-gnu-g++, etc.) Quand
distcc distribue la compilation aux autres machines, il transmet ce nom. Le
démon distcc sur les autres machines cherche alors un binaire du même nom. Si
il ne voit que gcc, il ne cherchera que gcc, ce qui sera
probablement le compilateur natif de la machine qui peut ne pas correspondre si
ce n'est pas la même architecture que la machine utilisant emerge.
Quand le nom complet est envoyé (sparc-unknown-linux-gnu-gcc par
exemple), il n'y a plus de confusion possible.
Ce document est protégé par la licence Creative
Commons : Paternité - Partage des Conditions Initiales à
l'Identique 2.5.
|