Certains programmes sont relativement lourds et peuvent prendre des heures sur des machines pas très puissantes. Heureusement, il existe plusieurs solutions et l'un d'entre elles est de compiler sur plusieurs machines en parallèle.
Même si Gcc permet de faire facilement des cross compilations, il est déconseillé de mixer les architectures (par exemple, du x86 avec du Sparc ou du PowerPC).
L'installation se fera par un classique
emerge distcc
Son fichier de configuration est /etc/conf.d/distccd. Il faut s'assurer :
Enfin, il faut que le démon soit démarré au boot
rc-update add distccd default
On peut évidemment le lancer à la main par un
/etc/init.d/distccd start
Une fois distcc installé, il faut configurer le maitre pour que les compilations se fassent en distribué. Ça se passe évidemment dans le fichier /etc/make.conf
Enfin, il faut indiquer la liste des machines participant à la compilation.
distcc-config --set-hosts " bidule.chez.moi chose.chez.moi localhost"
Actuellement, distcc ne fait pas de loadbalancing et alloue les tâches dans l'ordre de la liste fournie à distcc-config. Ici, chargera d'abord bidule, puis chose en enfin la machine locale. Si une machine n'est pas joignable, pas de problème, c'est la machine locale qui prendra le relais.
Si USE contient le flag gtk, on dispose d'un moniteur graphique : distccmon-gui. Comme son nom l'indique, il s'agit d'un monitor graphique de l'activité distcc.
Depuis un shell, on le lancera par la commande :
DISTCC_DIR="/var/tmp/portage/.distcc/" distccmon-gui &
Si c'est depuis un menu d'openbox, ça devient :
sh -c 'DISTCC_DIR="/var/tmp/portage/.distcc/" distccmon-gui'
Sous Ubuntu, le fichier de configuration est /etc/default/distcc. Il est important de vérifier :
Un autre problème est que gcc est invoqué par son nom complet, ce qui permet entre autre de s'assurer de n'avoir que des architectures identiques ... le problème est que Ubuntu est compilé pour des 486 et gentoo pour des 686. Le maitre étant sous Gentoo, i686-linux-gnu-gcc sera cherché sans succes, vu que le compilateur est présent sous le nom i486-linux-gnu-gcc ... La solution est d'ajouter dans le /etc/make.conf du maitre les lignes suivantes :
CC='gcc'
CXX='g++'
A nouveau, c'est extrêmement important de ne pas panacher les architectures (Sparc avec Intel par exemple) car maintenant, distcc n'a aucun moyen d'appeler un cross compilateur.
Il est possible d'avoir une compilation collaborative en dehors de portage, par exemple pour compiler le kernel. Il suffit d'utiliser les lignes suivantes :
export DISTCC_HOSTS=$( cat /etc/distcc/hosts )
make CC="distcc" -j4
On n'oubliera pas non plus d'activer les options d'optimisation grâce en affectant la variable CFLAGS.
CFLAGS="-march=pentium4 -O2 -pipe -fomit-frame-pointer"
L'un des problèmes lorsque l'on est dans un environnement domestique est que toutes les machines ne sont pas forcement allumée à un instant donné. Mais grâce à Avahi, ce sont les clients eux-mêmes qui annoncent leur existence, plus besoin d'avoir une liste statique de client.
La première chose est de compiler distcc avec le USE avahi.
Ensuite, placer dans le fichier /etc/distcc/hosts
+zeroconf
On a tout configuré, toutes les machines ont la même architecture, mais une machine est ignorée ... c'est généralement, car elle n'a pas la même version de gcc que maître.
Pour s'en assurer, on peut utiliser le client "Avahi discovery". Les machines éligibles sont visibles dans la catégorie "Distributed Compiler" ont peu afficher leurs caractéristiques en cliquant sur leur nom. Celle qui nous intéresse ici est cc_version.
Gcc n'a pas de dépendance donc pour faire une mise à jour, il suffit de faire
emerge gcc
puis de sélectionner la nouvelle version
chose ~ # gcc-config -l
[1] i686-pc-linux-gnu-4.5.4 *
[2] i686-pc-linux-gnu-4.6.3
chose ~ # gcc-config 2
* Switching native-compiler to i686-pc-linux-gnu-4.6.3 ...
>>> Regenerating /etc/ld.so.cache... [ ok ]
* If you intend to use the gcc from the new profile in an already
* running shell, please remember to do:
* . /etc/profile
chose ~ # . /etc/profile
en enfin il faut redémarrer distcc pour que la nouvelle version soit prise en compte.
/etc/init.d/distcc restart
Attention : assurez-vous que les compilations fonctionnent avant de purger l'ancien Gcc ... Il se peut que l'installation se passe bien mais que Gcc plante à cause d'une librairie manquante. On trouvera ces dépendances manquantes grâce à revdep-rebuild.
[ 48% ] * broken /usr/libexec/gcc/i686-pc-linux-gnu/4.6.3/cc1 (requires libmpc.so.3)
* broken /usr/libexec/gcc/i686-pc-linux-gnu/4.6.3/cc1plus (requires libmpc.so.3)
* broken /usr/libexec/gcc/i686-pc-linux-gnu/4.6.3/lto1 (requires libmpc.so.3)
Visitez : Nos sorties Ski et rando |
Copyright Laurent Faillie
2001-2024
N'oubliez pas d'entrer le mot de passe pour voir aussi les photos perso. |
Contactez moi si vous souhaitez réutiliser ces photos et pour les obtenir avec une plus grande résolution. |
Visites durant les 7 derniers jours au total. |
Vous pouvez
laissez un commentaire
sur cette page.