Content-type: text/html
distcc [OPTIONS DU COMPILATEUR]
<compilateur> [OPTIONS DU COMPILATEUR]
Pour chaque tâche de la construction, distcc envoie tout le code source prétraité et les paramètres de compilation sur le réseau : les machines n'ont donc besoin ni de partager de système de fichiers, ni d'avoir les mêmes en-têtes ou bibliothèques installés, ni d'une horloge synchronisée.
La compilation est pilotée par une machine « client » : typiquement la station de travail ou le portable du développeur. Le client distcc s'exécute sur cette machine, tout comme make, le préprocesseur, l'éditeur de liens et les autres étapes du processus de construction. Les machines « volontaires », sans limitation de nombre, aident le client à construire le programme en exécutant le démon distccd(1), le compilateur et l'assembleur à la demande.
distcc peut être exécuté soit en utilisant des sockets TCP (sur le port 3632 par défaut), soit par une commande « tunnel » telle que ssh(1). Pour utiliser les connexions TCP, les clients doivent exécuter le démon distccd(1) directement ou à partir d'inetd. Pour les connexions SSH, distcc doit être installé mais ne doit pas rester à l'écoute en attente de connexions.
Les connexions TCP ne doivent être utilisées que sur un réseau digne de confiance, car les codes source et objet ne sont ni authentifiés ni protégés. Les connexions SSH sont typiquement plus lentes de 25 % en raison de la charge supplémentaire liée au chiffrement, bien que ce rapport varie beaucoup suivant le processeur, le réseau et le programme construit.
distcc est conçu pour être utilisé avec l'option -j de GNU Make, qui effectue plusieurs compilations simultanément. Puisque distcc peut répartir la plus grande partie du travail sur le réseau, le niveau de concurrence atteint est plus grand que lors d'une construction locale. On fixe normalement la valeur de l'option -j à peu près au double du nombre de processeurs disponibles, afin de permettre à certaines tâches de rester bloquées en attente d'E/S disque ou réseau. distcc peut également être utilisé avec d'autres outils de contrôle de construction tels que SCons.
Il est fortement recommandé d'installer la même version du compilateur sur chaque machine participant à la construction. Des compilateurs incompatibles peuvent causer des erreurs de compilation ou d'édition des liens difficiles à identifier.
Le compilateur et l'assembleur attendent un seul fichier en entrée (le code source prétraité) et produisent un seul fichier en sortie (le fichier objet). distcc expédie ces deux fichiers sur le réseau et peut ainsi exécuter la compilation ou l'assemblage à distance.
Heureusement, pour la majorité des programmes l'exécution du préprocesseur est relativement peu coûteuse et l'éditeur de liens n'est pas appelé souvent, donc la plus grande partie du travail peut être distribuée.
distcc examine sa ligne de commande pour déterminer laquelle de ces phases est invoquée, et si la tâche peut être distribuée.
distcc peut être installé sous le nom du vrai compilateur, pour intercepter les appels qui y sont faits et les exécuter à distance. Ce compilateur « masqué » a la plus grande compatibilité avec les arborescences sources existantes, et convient à ceux qui veulent utiliser distcc pour toutes les compilations. L'utilisation de distcc est transparente pour les makefiles.
distcc peut être utilisé comme préfixe dans les lignes de commandes, telles que « distcc cc -c hello.c » ou « CC="distcc gcc" ». Cela convient à ceux qui n'utilisent distcc que pour certaines compilations ou qui sont en train de l'essayer, mais cela peut poser des problèmes avec certains makefiles ou certaines versions de libtools qui considèrent que $CC ne contient pas d'espace.
Enfin, distcc peut être utilisé directement comme compilateur. « cc » est toujours utilisé comme nom du vrai compilateur dans ce mode « implicite ». Cela peut convenir pour une utilisation interactive quand le mode « explicite » ne fonctionne pas, mais ce n'est pas recommandé aux nouveaux utilisateurs.
Gardez à l'esprit que vous ne devez utiliser qu'une seule méthode à la fois pour appeler distcc. Si vous utilisez un répertoire de masquage, ne changez pas CC ou CXX : indiquez simplement le répertoire vers le début de votre chemin de recherche (« PATH »). Si vous n'utilisez pas de répertoire de masquage, vous devrez soit changer CC ou CXX, soit modifier le(s) makefile(s) pour qu'il(s) appelle(nt) distcc explicitement.
Par exemple :
# mkdir /usr/lib/distcc/bin # cd /usr/lib/distcc/bin # ln -s ../../../bin/distcc gcc # ln -s ../../../bin/distcc cc # ln -s ../../../bin/distcc g++ # ln -s ../../../bin/distcc c++
Ainsi, pour utiliser distcc, un utilisateur doit simplement placer le répertoire /usr/lib/distcc/bin vers le début du chemin de recherche, et fixer une liste d'hôtes dans DISTCC_HOSTS ou dans un fichier. distcc se charge du reste.
Notez que le répertoire de masquage doit se trouver dans le chemin de recherche avant le répertoire contenant le compilateur dont il porte le nom. De plus, tous les programmes auxiliaires que ce compilateur utilise (tels que as ou ld) doivent également se trouver dans un répertoire cité après le répertoire de masquage dans le chemin de recherche. En effet, distcc appelle le vrai compilateur avec un chemin de recherche dont sont retirés tous les répertoires jusqu'au répertoire de masquage inclus.
Il est possible de rencontrer une « erreur de récursion » dans le mode masqué, ce qui signifie que distcc se trouve lui-même plutôt que de trouver le vrai compilateur. Cela peut indiquer que deux répertoires de masquage sont indiqués dans le chemin de recherche, peut-être à cause de l'installation de distcc à deux emplacements différents. Cela peut également indiquer que vous tentez de mélanger le mode « masqué » et le mode « explicite ».
Le moyen le plus simple d'utiliser ccache avec distcc est de créer un répertoire de masquage pour chacun d'eux, et de lister le répertoire de ccache avant celui de distcc. Par exemple :
PATH=/usr/lib/ccache/bin:/usr/lib/distcc/bin:/usr/bin:/bin
Une autre solution consiste à fixer CCACHE_PREFIX=distcc et à utiliser CC=ccache gcc .
Depuis la version 2.2, ccache ne conserve plus la compilation des sources prétraités, donc il ne trouvera jamais de correspondance dans le cache s'il est exécuté depuis distccd ou distcc. Il ne doit être exécuté que sur le client et avant distcc pour être efficace.
La liste d'hôtes est une simple énumération de spécifications d'hôtes séparées par des espaces. La forme la plus simple et la plus courante est l'énumération de noms d'hôtes, telle que
distcc accorde une préférence aux hôtes cités en début de liste, aussi les machines doivent être citées par ordre décroissant de vitesse. En particulier, lorsqu'une seule compilation doit être exécutée (par exemple depuis un script « configure »), la première machine de la liste est utilisée. Du fait de la faible surcharge entraînée par l'exécution des tâches locales, localhost doit normalement être la première. Si le client est largement plus lent que les autres machines (cas d'un ordinateur de poche par exemple), on peut le citer plus loin dans la liste, voire pas du tout.
La syntaxe est :
DISTCC_HOSTS = SPEC_HÔTE ... HOSTSPEC = HÔTE_LOCAL | HÔTE_SSH | HÔTE_TCP | HÔTE_TCP_ANCIENSTYLE LOCAL_HOST = localhost[/LIMITE] SSH_HOST = [UTILISATEUR]@IDHÔTE[/LIMITE][:COMMANDE][OPTIONS] TCP_HOST = IDHÔTE[:PORT][/LIMITE][OPTIONS] OLDSTYLE_TCP_HOST = IDHÔTE[/LIMITE][:PORT][OPTIONS] HOSTID = NOMHÔTE | IPV4 OPTIONS = ,OPTION[OPTIONS] OPTION = lzo
Voici quelques exemples de cette syntaxe :
Voici un exemple illustrant certaines de ces possibilités :
Si un hôte de la liste n'est pas joignable distcc émet un avertissement et ignore cet hôte pendant environ une minute.
Activer la compression fait consommer plus de temps CPU par distcc, mais moins de trafic réseau. Le taux de compression est typiquement de 4/1 pour le code source et 2/1 pour le code objet.
L'utilisation de la compression exige que le client et le serveur utilisent tous deux la version 2.9 de distcc ou une version plus récente. Aucune configuration du serveur n'est nécessaire : le serveur répond toujours à des requêtes compressées par des réponses compressées.
distcc peut fournir des informations de débogage détaillées si l'option « verbose » est employée. On la contrôle grâce à la variable d'environnement DISTCC_VERBOSE sur le client, et grâce à l'option --verbose sur le serveur. Pour corriger les erreurs, vous devez examiner aussi bien les messages du client que ceux des serveurs.
distcc distingue les erreurs « authentiques », telles que les erreurs de syntaxe dans le code source, des erreurs « accidentelles », telles que les problèmes de réseau rencontrés lors de la connexion à une machine volontaire. Dans le cas d'une erreur accidentelle, distcc réessayera la connexion en local à moins que l'option DISTCC_FALLBACK n'ait été désactivée.
Si le compilateur se termine avec un signal, distcc retourne un code de sortie égal à 128 plus le numéro du signal.
Les erreurs internes de distcc provoquent des codes de sortie entre 100 et 127. En particulier :
(D'autres codes d'erreur sont listés dans exitcode.h)
distcc crée un certain nombre de fichiers temporaires et de fichiers de verrouillage dans le répertoire temporaire.
La commande de compilation passée à distcc doit être apte à s'exécuter correctement sur chacune des machines volontaires pour produire un fichier objet du type approprié. Si les machines ont des processeurs différents, la simple utilisation de distcc cc ne fonctionnera probablement pas, car cela lancera normalement le compilateur natif de la machine volontaire.
Des machines ayant le même processeur mais des systèmes d'exploitation différents ne génèrent pas nécessairement des fichiers .o compatibles.
Plusieurs configurations différentes de gcc peuvent être installées côte-à-côte sur une machine. Si vous construisez gcc à partir du code source, utilisez l'option de configuration --program-suffix afin qu'il soit installé sous un nom qui contienne la version de gcc et la plate-forme cible.
La convention recommandée pour le nom de gcc est CIBLE-gcc-VERSION (par exemple : i686-linux-gcc-3.2 ). GCC 3.3 s'installera de lui-même sous ce nom, en complément de CIBLE-gcc et, s'il est adapté à la machine locale, de gcc-VERSION et de gcc .
Le compilateur doit être installé sous le même nom sur le client et sur chaque machine volontaire.
Du fait d'une limitation de gcc, gdb peut être incapable de trouver automatiquement les fichiers sources des programmes construits en utilisant distcc dans certaines circonstances. La commande directory de gdb peut être utilisée à cet effet.
L'option -MD de gcc peut produire une sortie dans un mauvais répertoire si les fichiers source et objet sont dans des répertoires différents et que l'option -MF n'est pas utilisée. Il n'y a pas de solution parfaite en raison de changements incompatibles entre les versions de gcc. Indiquer explicitement le fichier de sortie de dépendance avec l'option -MF résoudra ce problème.
Le mode de connexion TCP ne doit être utilisé que sur les réseaux dignes de confiance.
Inscrire des machines lentes dans la liste des machines volontaires peut ralentir la construction.
Utiliser des versions de gcc différentes peut provoquer des problèmes car les fichiers d'en-tête et les interfaces binaires ont évolué, et de plus certaines distributions ont inclus des correctifs incompatibles sans changer le numéro de version. distcc n'offre aucune protection contre l'utilisation de versions incompatibles.
Certains makefiles ont des dépendances manquantes ou superflues qui provoquent des constructions en parallèle incorrectes ou lentes. Réparez le makefile en corrigeant les dépendances, rapportez le bogue au responsable du logiciel, ou ne construisez pas l'arborescence en parallèle.
D'autres bogues connus peuvent être documentés à l'adresse http://distcc.samba.org/
Il est possible que cette traduction soit imparfaite ou périmée. En cas de doute, veuillez vous reporter au document original en langue anglaise fourni avec le programme.