La documentation de distcc pour Gentoo Lisa Seelye Gérald FENOY 1.2.4 15 octobre 2003 Ce document sert de mini-guide pour utiliser distcc avec Gentoo. Introduction
Qu'est-ce que distcc ?

Distcc est un programme conçu pour distribuer les tâches de compilation entre plusieurs machines en réseau. Il est composé d'un serveur, distccd, et d'un programme client, distcc. Distcc, après une petite étape de configuration, peut fonctionner de façon transparente avec ccache et Portage.

Installation
Dépendances
     >=sys-apps/portage-2.0.46-r11
     Distcc-2.11 ou plus récent nécessite >=sys-apps/portage-2.0.49-r6
     >=sys-devel/gcc-config-1.3.1
     sys-apps/shadow
     Lorsque vous utilisez gtk dans vos options USE, distcc a les dépendances optionnelles suivantes (depuis la version 2.8 jusqu'à 2.11)
     >=x11-libs/gtk+-2.2.1
    
     >=sys-apps/portage-2.0.49-r6
     >=sys-devel/gcc-config-1.3.1
     sys-apps/shadow
     Dans cette version, vous pouvez choisir entre une interface Gnome ou GTK pour le moniteur de supervision, ils ont les dépendances supplémentaires suivantes
     Pour GTK :
     >=x11-libs/gtk+-2.0.0
     >=gnome-base/libglade-2.0.0
     x11-libs/pango
     Pour Gnome :
     >=x11-libs/gtk+-2.0.0
     >=gnome-base/libglade-2.0.0
     x11-libs/pango
     >=gnome-base/libgnomeui-2.0.0.0
     >=gnome-base/libgnome-2.0.0
    
Installation de distcc

L'installation de distcc est vraiment simple. Définissez vos options USE et lancez emerge distcc. Il y a néamoins quelques options que vous devriez connaître.

Distcc est fourni avec deux interfaces graphiques qui permettent la supervision des tâches que votre ordinateur envoie pour la compilation. Si vous utilisez Gnome, alors il vous suffit d'ajouter 'gnome' à vos options USE. Cependant, si vous n'utilisez pas gnome et que vous souhaitez néamoins avoir un outil de supervision alors vous pouvez ajouter 'gtk' à vos options USE.

Configurer Portage pour qu'il utilise distcc

Configurer distcc est très simple avec Portage. Sur chaque ordinateur où vous voulez utiliser distcc, suivez simplement les étapes suivantes :

     # emerge distcc
     # nano -w /etc/make.conf
     
Si vous utilisez distcc-2.11.1 ou supérieure avec >=portage-2.0.49-r6, tout ce que vous aurez à faire, c'est de définir la liste de vos serveurs (voyez le bloc de code suivant), de modifier MAKEOPTS dans /etc/make.conf et d'ajouter 'distcc' à vos FEATURES dans le même /etc/make.conf. Éditez vos options FEATURES pour y inclure "distcc" Vous devriez également décommenter la ligne qui contient la variable PORTAGE_TMPDIR dans /etc/make.conf. Affectez DISTCC_DIR=${PORTAGE_TMPDIR}/portage/.distcc à la fin du fichier

Ensuite, vous devez définir quels sont les serveurs que vous voulez utiliser. Pour ce faire, vous pouvez utiliser la commande distcc-config pour créer la liste des serveurs. Voici un exemple de la définition de quelques serveurs qui pourraient se trouver dans votre liste :

     192.168.0.1          192.168.0.2                       192.168.0.3
     192.168.0.1/2        192.168.0.2                       192.168.0.3/10
     192.168.0.1:4000/2   192.168.0.2/1                     192.168.0.3:3632/4
     @192.168.0.1         @192.168.0.2:/usr/bin/distccd     192.168.0.3
     

Cela peut sembler compliqué, mais dans la plupart des cas, une variante des lignes 1 ou 2 suffira. Voici une explication de chaque ligne : la ligne 1 représente juste une liste de serveurs délimités par un espace qui utiliseront les options par défaut. La ligne 2 est une liste de serveurs qui utilise l'option /N pour indiquer le nombre maximum de requêtes simultanées à envoyer à ce serveur. Etant donné que la plupart des gens n'utiliseront pas les lignes 3 et 4, je vous prierai de vous référer à la documentation de distcc pour de plus amples d'informations.

Un exemple d'utilisation de la commande pour ajouter des serveurs (pour la ligne 1) :

    # /usr/bin/distcc-config --set-hosts "192.168.0.1 192.168.0.2 192.168.0.3"
    

L'étape finale pour intégrer distcc à Portage est d'éditer votre fichier /etc/make.conf et d'y modifier la ligne qui contient MAKEOPTS pour y mettre -jN (où N est un entier). Généralement, vous placerez ici le nombre total de processeurs présents dans votre réseau plus un.

     # nano -w /etc/make.conf
     MAKEOPTS=-jN
     
N'oubliez pas de lancer le démon distcc avec la commande : /etc/init.d/distccd start
Configurer distcc pour fonctionner avec automake

Parfois, ceci est encore plus simple que la mise en place avec Portage. Il vous suffit de modifier votre variable d'environnement PATH pour y insérer /usr/lib/distcc/bin avant le chemin où se trouve gcc (/usr/bin). Cependant, si vous utilisez ccache, prenez garde à mettre le chemin de distcc après celui de ccache. Ce qui se fait de la façon suivante :

   # export PATH="/usr/lib/ccache/bin:/usr/lib/distcc/bin:${PATH}"
   

Ceci fait, au lieu de lancer make, vous devez utiliser make -jN (où N est un entier). Une valeur sûre pour N varie selon votre réseau et le type d'ordinateurs que vous utilisez pour compiler. Pour ma part, j'ai un ordinateur bi-processeurs P3 et un K6-2/400 qui compilent tout pour mon ordinateur de bureau (un Athlon Thunderbird 1200MHz) ; j'utilise -j5. Testez vos propres valeurs afin de trouver la plus appropriée.

La compilation croisée (Cross-Compiling)
Une note sur la compilation croisée

La compilation croisée utilise un certain type d'architecture afin de générer des programmes pour un autre type d'architecture. Ceci peut être aussi simple que d'utiliser un Athlon (i686) pour générer des programmes pour un K6-2 (i586) ou d'utiliser une Sparc pour compiler un programme pour un ppc.

Une note personnelle sur la compilation croisée

J'aimerais être capable de prendre part à l'effort accompli par Gentoo pour la compilation croisée, mais je n'ai pas de machine non-x86. Ce que j'écris fonctionne en théorie, mais je dépends d'autres personnes pour les tests. Cela fonctionne jusqu'à un certain point, mais c'est dur. ;-)

Dans un futur, proche j'espère acquérir une Sparc et y mettre une gentoo.

Utiliser distcc pour l'installation (bootstrap)
Étape 1: configurez votre nouvelle bécane

Ensuite, vous devez démarrer votre nouvelle bécane avec le LiveCD de Gentoo et suivre toutes les étapes jusqu'au bootstrap. Procédez alors à la petite installation préliminaire qui suit sur votre nouvelle bécane.

     Ici nous ajoutons distcc aux FEATURES
     # nano -w /etc/make.conf
     Ajouter "distcc" à FEATURES
     Modifier MAKEOPTS dans /etc/make.conf pour y affecter -jN (comme décrit précédemment)
     

Ensuite ajoutez l'utilisateur distcc à votre fichier /etc/passwd:

     # echo "distcc:x:240:2:distccd:/dev/null:/bin/false" >>/etc/passwd
     N'oubliez pas le `>>'
     
Étape 2: obtenir distcc

Ensuite, vous devez exécuter la commande suivante dans le chroot sur la nouvelle bécane

   # emerge --nodeps distcc
   
Étape 3: configurer distcc lui-même

Maintenant, configurez distcc lui-même...

    # /usr/bin/distcc-config --install
    # /usr/bin/distcc-config --set-hosts "localhost host1 host2 host3 ..."
    

Distcc devrait maintenant être configuré pour le bootstrap ! Reprenez le guide officiel d'installation où vous l'avez laissé, et n'oubliez pas de refaire un emerge de distcc après l'emerge system.

Problèmes fréquents
Mozilla et Xfree

Parfois, vous noterez que vos compilations de paquets ne sont pas toutes distribuées (et en effet pas créées en parallèle). La raison est que les développeurs des ebuilds de Mozilla et Xfree ont désactivé la possibilité de génération en parallèle car ces paquets sont connus pour poser des problèmes. Ceci n'est pas nécessairement un problème de distcc.

Cela ne veut pas dire que parfois distcc entraînera l'echec d'une compilation.

Un mélange de serveurs hardened-gcc et de non-hardened-gcc sera défectueux

Avec un aussi long titre, toute explication est presque hors de propos. Cependant, si vous envisagez d'utiliser distcc sur des serveurs qui ont PaX/hardened-gcc avec d'autres qui ne l'ont pas, vous allez avoir des problèmes.

La solution requiert un peu de prévoyance de votre part. Vous devez exécuter hardened-gcc -R sur le serveur qui possède PaX/hardened-gcc, ou vous devez activer les protections PaX dans votre noyau et exécuter emerge hardened-gcc. Les deux sont de bonnes solutions du fait que la plupart des protections offertes par ces deux paquets sont bonnes et sont transparentes pour l'utilisateur.

Mélange de diverses versions de GCC

Si vous avez différentes versions de GCC sur vos serveurs, il y aura probablement d'étranges problèmes. La solution est de vous assurer que tout les seveurs ont la même version de gcc.

Les suppléments de distcc
Les outils de supervision Distcc

Distcc est fourni avec deux outils de supervision. Une version qui fonctionne en mode texte est automatiquement installée, elle s'appelle distccmon-text. À la première exécution, l'outil peut paraître déroutant mais il est en fait très simple d'utilisation. Si vous l'exécutez sans paramètre, il s'exécutera une seule fois. Cependant, si vous lui passez un nombre N en argument, il affichera les informations toutes les N secondes.

L'autre moniteur est seulement installé si vous utilisez gtk ou gnome dans vos options USE. Celui-ci est en mode graphique (comme vous l'aviez sans doute deviné) et est basé sur la librairie GTK+, il est vraiment joli.

Veuillez noter que si vous souhaitez superviser tous les emerges, vous devez lancer les moniteurs de supervision de la façon suivante :

     # DISTCC_DIR=/chemin/vers/distccdir distccmon-text N
     Ou vous pouvez lancer le superviseur graphique ...
     # DISTCC_DIR=/chemin/vers/distccdir distccmon-gnome
     
Si vous utilisez Portage et que vous avez utilisé l'exemple précédent, l'affectation devra être DISTCC_DIR=/var/tmp/portage/.distcc. Si vous n'utilisez pas Portage, vous ne devez pas spécifier de valeur pour DISTCC_DIR (lancez juste distccmon-text N).
Avenir de distcc et Gentoo
distcc-subnetscan

distcc-subnetscan est un programme perl en cours de développement qui sera capable de scanner un sous-réseau à la recherche de serveurs sur lesquels tourne un démon distcc. Il sera également capable de vérifier que les démons sont conformes à une valeur spécifique de CHOST pour faciliter la compilation croisée.

Le script perl est disponible ici jusqu'à ce qu'un meilleur endroit soit trouvé.

distcc-config

distcc-config, l'outil de configuration de l'espace utilisateur n'est plus à jour. Il sera bientôt récrit pour être utilisé avec la version courante de distcc