Gentoo Logo

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.



Imprimer

Dernière mise à jour le 17 février 2006

La version originale de cette traduction n'est plus maintenue

Résumé : Ce guide vous explique comment configurer distcc pour faire de la compilation croisée pour différentes architectures de processeur.

Andrew Gaffney
Auteur

Joshua Saddler
Relecteur

Bertrand Coppa
Traducteur

Donate to support our development efforts.

Copyright 2001-2014 Gentoo Foundation, Inc. Questions, Comments? Contact us.