Guide de compilation croisée avec DistCC Andrew Gaffney Joshua Saddler Bertrand Coppa Ce guide vous explique comment configurer distcc pour faire de la compilation croisée pour différentes architectures de processeur. 1.0 2006-01-22 Compilation croisée avec distcc
Introduction

distcc est un outil vous permettant de distribuer la tâche 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 expliquera 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 rend facile la création de chaîne de compilation pour architectures croisées. Il fut à l'origine écrit par Joshua Kinard et a été reé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 chacune des machines.

Ensuite, il vous 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 sur comment installer et utiliser 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 de soutien i686.

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 y a moyen 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 :

Les commandes suivantes ne doivent être effectuées que sur la machine lançant emerge. Ne suivez pas ces étapes pour les machines de soutien.
# 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 vous faut faire :

# rm c++ g++ gcc cc

Ensuite, il faut créer le nouveau script sur cette machine. Lancez votre éditeur de texte favori et créer un fichier contenant le texte suivant dedans 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.

#!/bin/bash

exec /usr/lib/distcc/bin/sparc-unknown-linux-gnu-${0##*/} "$@"

Pour continuer, il faut rendre le script exécutable et créer les liens symboliques nécessaires :

# chmod a+x sparc-unknown-linux-gnu-wrapper
# ln -s /usr/bin/distcc sparc-unknown-linux-gnu-cc
# 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 :

# 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 Jan 18 14:20 sparc-unknown-linux-gnu-cc -> /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.