Distcc/fr

Distcc est un programme conçu pour répartir des tâches de compilation à travers un réseau vers des hôtes participants. Il comprend un serveur,, et un client,. Distcc peut travailler en toute transparence avec ccache, Portage et Automake moyennant un minimum de configuration.

Si vous envisagez d'utiliser pour vous aider à préparer la chaîne des outils de compilation pour une installation de Gentoo, assurez vous de lire préalablement la section concernant l'utilisation de distcc pour l'amorçage (compilation des outils de compilation).

Installation
Avant de configurer, commençons par nous intéresser à l'installation de sur tous les hôtes.

Dépendances communes à tous les hôtes
Afin d'utiliser, tous les ordinateurs sur votre réseau doivent posséder la même version de GCC. Pour être plus précis, mélanger 3.3.x (avec x variable) est accepté, mais mélanger 3.3.x avec 3.2.x peut conduire à des erreurs de compilation ou des erreurs en exécution.

Vérifiez que tous les systèmes utilisent la même version de binutils (eselect binutils list) ou de nombreux paquets vont échouer à l'édition de liens avec différentes erreurs telles que des relocalisations de texte.

Emerge
Distcc comprend un utilitaire de surveillance graphique des tâches de compilation externes envoyées par un ordinateur. La présence de celui-ci est contrôlée par l'option  de la variable.

Une fois la variable USE configurée, installez le packet.

Service
Afin de mettre en place le démarrage automatique de, suivez les instructions suivantes.

OpenRC
Éditez et assurez-vous de définir la directive   pour n'autoriser que les clients auxquels vous accordez votre confiance. Pour une sécurité renforcée, utilisez aussi la directive  afin de dire au daemon  quelles adresses IP écouter (pour les systèmes multi-adresses). Des informations complémentaires sur la sécurité avec sont disponibles à l'adresse Distcc security notes.

L'exemple suivant autorise les clients distcc tournant sur  et   à se connecter au serveur  local.

When logging to a file in, create the log and give appropriate permissions:

Maintenant démarrez votre daemon sur tous les ordinateurs participants :

systemd
Éditez le fichier afin d'ajouter les clients au format CIDR. Voici un exemple ajoutant toutes les adresses IP du bloc 192.168.1.xxx :

Or an example with multiple clients and a manually specified log-level

To set the proper environment variables for, place them into. For example,

For workaround, you need to edit distccd.service by running the following command.

This will open up an editor. Change the line with  directive to

Alternatively, you could also write a shell script wrapper for.

Recharger les nouvelles configurations:

Activer le démarrage automatique de et démarrer le service :

Spécification des hôtes participants
Utilisez la commande pour définir la liste des participants.

Voici quelques exemples de définition d’hôtes. Dans la plupart des cas, des variations des lignes 1 et 2 suffisent. Cette dernière inclue la syntaxe  afin d'informer  du nombre maximal de taches à lancer sur le nœud. Plus d'informations sur la syntaxe employée aux lignes 3 et 4 sont disponibles sur le manuel de distcc.

Il y a aussi plusieurs autres méthodes pour définir des hôtes. Reportez-vous à la page de manuel de  pour plus de détails.

Si la machine locale doit elle aussi compiler, indiquez  dans la liste des hôtes participants. À l'inverse, si la machine locale ne participe pas à la compilation (ce qui est souvent le cas), omettez la de la liste. Sur une machine lente, utiliser  peut ralentir les choses. Assurez vous de la performance de votre configuration en effectuant des tests.

Configurons afin d'utiliser les hôtes mentionnés par la première ligne de l'exemple :

Distcc permet également un mode « pump », en invoquant la commande. Ce mode peut réduire le temps de compilation de manière significative lorsque plusieurs fichiers sont compilés en parallèle. Cela cache les entêtes pré-traitées sur le serveur et, par conséquent, évite les téléchargements et pré-traitements répétitifs de ces fichiers d’entête.

Pour configurer un hôte pour le mode « pump », ajoutez les suffixes  à la définition des hôtes. Le mode « pump » requiert les deux options  et   (que les fichiers soient en C ou C++).

Hosts also need to be in:

Optionally, to set the maximum number of threads used by a host, add a forward slash "/" after each host:

The same applies to the command. If the maximum threads number is not specified, it will default to 4.

Avec Portage
Il est aisé de configurer Portage pour qu'il utilise. Il suffit pour cela d'activer la fonctionnalité et de choisir une valeur décente pour le nombre de taches de compilation simultanées (étant donné que  augmente le nombre de ressources disponible pour la compilation).

Définissez les variables MAKEOPTS et FEATURES comme indiqué ci-dessous.

Une stratégie courante consiste à
 * mettre pour valeur de  le double du nombre "total" (locaux + distants) de cœurs du processeur + 1, et
 * mettre pour valeur de  le nombre de cœurs du processeur local.

L'utilisation de  dans la variable MAKEOPTS empêchera la création d'un nombre trop élevé de taches lorsque certain hôtes de  sont indisponibles (augmentant alors la quantité de taches simultanées sur les autres systèmes) ou lorsqu'un ebuild est configuré de façon à interdire la compilation distante (tel qu'avec gcc). Cela est accompli en refusant le démarrage de taches supplémentaires lorsque la charge du système et égale ou supérieure à la valeur de

Par exemple, lorsqu'il y à deux hôtes quadruple cœur qui exécute et que le PC local possède un processeur double cœur, la variable MAKEOPTS peut ressembler à ceci :

CFLAGS et CXXFLAGS
Lors de l’édition de, assurez vous que les variables CFLAGS et CXXFLAGS ne contiennent pas. ne distribuera pas de taches aux autres machines si  a pour valeur. Une valeur approximative de  et d’options peut être obtenue en utilisant la commande suivante :

Pour plus d'information, consultez Résolution de  pour distcc

Avec automake
Ceci est, dans certains cas, plus facile que de configurer Portage. Il n'y a besoin que de mettre la variable PATH à jour pour qu'elle inclue en face du répertoire qui contient. Prenez garde cependant: si vous utilisez, mettez alors le répertoire contenant après celui de.

Placez ceci dans le fichier de l'utilisateur, ou son équivalent, pour une variable PATH définie à chaque entrée dans sa session, ou définissez la de manière globale avec un fichier dans.

Au lieu de simplement appeler, ajoutez s'y un paramètre d'invocation  (où   est un entier naturel). La valeur de  dépend du réseau et du type des ordinateurs utilisés pour la compilation. Une approche heuristique pour trouver la bonne valeur a été donné plus tôt dans cet article.

With ccache
To make Ccache work with, some prerequisites must be fulfilled:
 * Ccache is successfully set up locally
 * Distcc is successfully set up on the desired hosts

The following setup will work as follows:

Configure distccd
In order to let the daemon use, it must masquerade the path  with. Furthermore, when it uses, should use the prefix  :

Additionally must be aware of the environment variables DISTCC_DIR and CCACHE_DIR :

Next, update the environment variables:

Finally, restart the daemon to adapt all changes:

Configure ccache
First, prepare the cache directories:

The second command will create the first level directories from  to,  to  and. The following loop will then look for the first level directories, excluding the current directory  and. It then descends into each of them, creates the second level directories from to  and  to   and goes back to the previous directory , which is.

When the preparation is done, every directory - including the directory itself - must be owned by the user  :

Configure portage
To use with  and, make sure, that both features are enabled and that CCACHE_DIR is set in :

It might be redundant to set CCACHE_DIR here, since it is already defined in, mentioned here. But to make absolutely sure, configure it like that.

Remote
First enable verbose logging by setting  to   in :

After that, restart the daemon to adapt the changes:

Also check, if there are directories in - including the directory  itself - which are not owned by the user   and correct their owner permissions:

Client
Make sure, that the following environment variables are present in the current shell:

After that, navigate to a temporary directory within and compile the example mentioned below:

This will provide a verbose output, while also keeping temporary files receiving from the remote site in by default:

Any occuring error from the remote site are saved in.

If the compilation was successful, the following line will be shown.

On the remote site, it will look like this:

The important part here, is, that any symlink of is a save symlink to.

Also, on the remote site, there should be the cached file in, assuming, the example with its filename was copied from this wiki article. Generally, one can monitor the ccache size using, while compiling.

Testing distcc with ccache using emerge
Check, if necessary environment variables are present for the current shell, see here and that was configured properly, see here.

To produce some cached files on the remote site, one can compile small packages like  and   on the client:

Future usage
Make sure, that the following environment variables are always set in the desired shell:

Pour amorcer
Utiliser pour amorcer (c'est à dire construire une chaîne d'outils avant d'installer le reste du système) requiert quelques étapes supplémentaires.

Étape 1: configurer Portage
Démarrez la nouvelle machine avec un LiveCD de Gentoo Linux et suivez les instructions d'installation tout en tenant compte des instructions sur le démarrage présentes dans la FAQ de Gentoo comme source d'information sur l'amorçage. Configurez ensuite Portage pour utiliser :

Mettez aussi à jour la variable PATH de votre session d'installation:

Étape 2: obtenir distcc
Installez :

Étape 3: configurer distcc
Exécutez la commande pour configurer distcc; remplacez les   de l'exemple par les adresses IP ou les noms d'hôte des nœuds participant.

Distcc est maintenant configuré pour l’amorçage ! Continuez avec les instructions d'installation officielles et n'oubliez pas de lancer  après avoir fait. Cela permet d'être sûr que toutes les dépendances nécessaires sont installées.

Suppléments
L'application a quelques fonctionnalités supplémentaires et des outils pour aider à travailler dans un environnement.

Utilitaires de surveillance
Distcc arrive avec deux utilitaires de surveillance. L'un, à base de texte, est toujours compilé et est appelé. Le lancer pour la première fois peut paraître confus, mais il est en fait facile à utiliser. Si le programme est utilisé sans paramètre, il ne s'actionnera qu'une seule fois. Cependant, s'il lui est passé un nombre, il se mettra à jour toutes les   secondes (avec   l'argument qui lui a été passé).

L'autre utilitaire de surveillance n'est activé qu'à travers l'option  de la variable. Celui-ci est basé sur GTK+, tourne dans un environnement X et est très agréable. Pour Gentoo, le surveillant graphique a été renommé pour éviter la confusion. Il était originellement appelé.

Pour surveiller l'utilisation de par Portage:

Une astuce consiste à définir DISTCC_DIR dans les variables d'environnement:

Mettez maintenant l'environnement à jour:

Pour finir, démarrez l'application graphique:

SSH pour les communications
Configurer distcc via SSH demande d'éviter quelques pièges. Tout d'abord, générez une paire de clés SSH sans définir le mot de passe. Restez conscient du fait que Portage compile les programmes en tant que l'utilisateur Portage (ou en tant que root si  n'est pas défini). Le dossier home de l'utilisateur Portage est, ce qui veut dire que les clés doivent être stockées dans.

Ensuite, créez une section pour chacun des hôtes dans le fichier de configuration SSH :

Envoyez la clef publique à chaque nœud de compilation:

Assurez-vous également que chaque hôte est disponible dans le fichier :

Réparez les permissions de fichiers:

Pour mettre en place les hôtes  et , lancez:

Notez le signe  (symbole @) qui spécifie les hôtes SSH à distcc.

Pour finir, indiquez à quel binaire SSH utiliser"

Il n'est pas nécessaire de lancer le script d'initialisation (initscript) sur les hôtes lorsque communique via SSH.

Reverse SSH
As an alternative to distcc's built-in SSH solution, a compiling server can connect to the distcc client via SSH, redirecting the client's distcc TCP port to the compiling server. There is no need for password-less SSH keys on the client.

Note that distcc uses as a literal keyword for special purpose so that  has to be used instead. For multiple compiling servers each needs its own port redirection on the client (e.g. 127.0.0.1:4000, 127.0.0.1:4001 etc). Assert that IP addresses and ports are listed in on the client.

Testing
To test, write a simple Hello distcc program and run in verbose mode to see if it communicates properly.

Next, turn on verbose mode, compile the program using and link the generated object file into an executable:

There should be a bunch of output about finding its configuration, selecting the host to connect to, starting to connect to it, and ultimately compile. If the output does not list the desired hosts, check the configuration.

Finally, ensure the compiled program works properly. To test each host, enumerate each compile host in the hosts file.

Dépannage
Si un problème apparaît lors de l'utilisation de, cette section pourra peut être aider à le résoudre.

ERROR: failed to open
Au jour du 22 Janvier 2015, la création du fichier dans  echoue lors de l'emergement. Ceci semble n'affecter que la version 3.1-r8 de distcc. Ce bug est en cours de correction (plus plus d'information, voir ). Il est possible de contourner le problème en créant manuellement le fichier de log, lui assigner un propriétaire convenable et redémarrer le daemon de distcc.

Continuez par mettre à jour le chemin de présent dans le fichier de configuration de   afin de pointer vers le dossier  créé dans l’étape précédente.

Pour finir, redémarrez le service distccd:

Quelques paquets n'utilisent pas distcc
Lorsque certains paquets sont installés, les utilisateurs remarqueront que la compilation de certain d'entre-eux n'est pas répartie (et ils ne sont pas compilés en parallèle). Ceci peut survenir du fait que le du paquet ne prenne pas en charge les opérations en parallèle, ou que le mainteneur du ebuild les ai explicitement désactivées suite à un problème connu.

Parfois peut faire échouer la compilation d'un paquet. Si cela arrive, ayez s'il vous plaît l’amabilité de le rapporter.

Rust package is known to cause excessive IO utilization as --local-load is ignored and --jobs is usually too high for local build resources. A package.env needs to be provisioned with non-distcc MAKEOPTS values to workaround this behaviour.

Versions mélangées de GCC
Si l'environnement héberge plusieurs versions différentes de GCC, il est probable que des problèmes étranges se produisent. La solution est alors de faire en sorte que tous les hôtes aient la même version de GCC.

De récentes mises à jour de Portage ont fait que Portage utilise  (tiret gcc) au lieu de. Ceci veut dire que si des machines i686 sont mélangées avec d'autres types (i386, i586), des soucis de compilation se présenteront. Un contournement à cela peut consister à lancer :

Il est aussi possible de définir les variables  et   de  avec la liste de valeurs indiquée plus haut.

-march=native
À partir de GCC 4.3.0, le compilateur prend en charge l'option, qui active l’auto-détection des processeurs et les optimisations qui valent la peine d’être activées sur le processeur faisant tourner GCC. Cela pose un problème lors de l'utilisation de, car cela engendre le mélange de codes optimisés pour différents processeurs. Par exemple, faire tourner avec   sur un réseau de nœuds contenant un système utilisant un AMD Athlon et un système utilisant un Intel Pentium mélangera du code compilé sur chacun des hôtes. Une partie du code compilé sera alors optimisée pour AMD Athlon tandis qu'une autre sera optimisée pour Intel Pentium.

Prenez garde à cette avertissement:

See the CFLAGS and CXXFLAGS section and Inlining  for distcc for more information.

Network is unreachable
Due to network restrictions introduced by the feature, you may run into this issue. Since contradicts with this security feature, you have to disable it:

Get more output from emerge logs
It is possible to obtain more logging by enabling verbose mode. This is accomplished by adding DISTCC_VERBOSE to :

The verbose logging can then be found in.

Keep in mind that the first invocation visible in  isn’t necessary the first  call during a build process. For example a build server can get a one-minute backoff period during the configuration stage when some checks are performed using a compiler ( sets a backoff period when compilation on a remote server failed, it doesn’t matter whether it failed on local machine or not).

Dig into the directory to investigate such situations. Find other logs, or call explicitly from within the working directory.

Another interesting variable to use is DISTCC_SAVE_TEMPS. When set, it saves the standard output/error from a remote compiler which, for Portage builds, results in files in the directory.

Failed to create directory /dev/null/.cache/ccache/tmp: Not a directory
This error can be discovered from the standard error output file in the server if you set DISTCC_SAVE_TEMPS. It only occurs when using with.

Likely, it is because CCACHE_DIR is not properly set, or not passed correctly to. will then default to as its cache folder. However, is run by  under user distcc, which is a non-login account. See systemd section and With ccache section for setting CCACHE_DIR.

Portage build failing with errors that are apparently not connected with distcc at all
When builds are failing with errors that do not seem to be connected to distcc, but the build works with FEATURES="-distcc", it has been reported that builds sometimes fail because of DISTCC_VERBOSE=1. Try the build with DISTCC_VERBOSE=0.

Ressources externes

 * Résolution de  pour distcc
 * Site web de distcc