Distcc/Cross-Compiling/de

Diese Anleitung zeigt wie distcc für das Übersetzen von Programmen für eine andere Rechnerarchitektur, als die vorhandene, konfiguriert werden msuss.

Einleitung
ist ein Tool mit dem die Aufgaben eines Compilierprozesses auf mehrere im Netzwerk verteilte Rechner, aufgeteilt werden können. Wenn alle beteiligten Rechner die gleiche GCC-Version und Prozessorarchitektur verwenden, ist für keine spezielle Konfiguration notwendig.

Diese Anleitung enthält die Instruktionen wie distcc zu konfigurieren ist um Übersetzungen für andere Rechnerarchitekturen durchführen zu können.

Installieren der benötigten Werkzeuge
Zuerst muss auf allen beteiligten Rechnern installiert werden. ist ein Tool mit dem die Werkzeuge die für andere Rechnerarchitekturen benötigt werden, einfach erstellt werden können. Es wird folgendermaßen aufgerufen: erstellt alle Werkzeuge für die Sparc-Architektur. Die beinhaltet binutils, gcc, glibc und linux-Headers.

Es ist notwendig die passenden Werkzeuge auf allen teilnehmenden Rechner zu installieren. Weitere Hilfe wird durch angezeigt.

Hier ist ein Skript das die genauen Versionen für binutils, gcc, kernel, glibc und verwendete Architektur anzeigt (dieses sollte auf der Ziel-Platform aufgerufen werden).

Als nächstes muss auf allen Rechnern installiert werden, die am Übersetzungsprozess beteiligt werden sollen. Dies schließt die Zielplattform und die Rechnern die für das Crosscompiling vorgesehen sind ein. Die Gentoo Distcc Dokumentation enthält weitere Informationen für die Konfiguration und Benutzung von.

Intel x86 Architekturen
Wird das Crosscompiling für verschiedene Intel-x86-Prozessoren (z.B. i586 und i686) durchgeführt, müssen die Tools für jeden gewünschten CHOST installiert werden, ansonsten schlägt die Übersetzung fehl. Die Prozessoren i586 und i686 sind aktuell verschiedene CHOST, obwohl es sich bei beiden um x86-Prozessoren handelt. Diese Unterscheidung darf nicht vergessen werden, wenn die Cross-Compiling Werkzeuge installiert werden. Wenn zum Beispiel für einen i586 Rechner Programme übersetzt werden sollen und über i686 Rechner beteiligt werden, müssen auf diese die Werkzeuge für i586 installiert sein.

SPARC
Der Aufruf von kann mit einer der folgenden Fehlermeldungen fehlschlagen.

Wenn dies zutrifft, kann der folgende Befehl verwendet werden:

Fehlerfreies Crosscompiling mit distcc
Mit dem voreingestellten distcc-Setup wird das Crosscompiling nicht funktionieren. Ursache des Problems ist, dass viele Pakete als Compiler nur auf rufen, anstelle des vollen Pfades (z.B. ). Wird dieses Paket nur zum Übersetzen auf einen Remotehost übertragen, wird auf diesem der system-eigene Compiler verwendet, anstelle des Cross-Compiler.

Für dieses kleine Problem gibt es zum Glück einen Workaround. Alles was es benötigt, ist ein Wrapper-Skript und ein paar Symlinks auf dem Rechner, auf dem laufen soll. In folgenden Beispiel wird ein Sparc-Rechner benutzt, also muss immer dort wo  an die eigene CHOST, z.B.   für eine AMD64 CPU. Nach dem Installieren von distcc, sieht ein Listing  in etwa folgendermaßen aus:

Here is what you want to do:

Next, we'll create the new script on this box. Fire up your favorite editor and create a file with the following text in it, then save it as. Remember to change the CHOST value (in this case, ) to the actual CHOST of the box that will be running the emerge.

Next, we'll make the script executable and create the proper symlinks:

When you're done, will look like this:

Next we want to make sure that these wrappers stay available after upgrading the distcc package as it will overwrite the symbolic links. We can do this through a file that looks like so:

Then create this file:

Give it the proper permissions:

Congratulations; you (hopefully) now have a working cross-distcc setup.

How this works
When is called, it checks to see what it was called as (e.g. ,  , etc.) When distcc then distributes the compile to a helper box, it passes along the name it was called as. The distcc daemon on the other helper box then looks for a binary with that same name. If it sees just, it will look for , which is likely to be the native compiler on the helper box, if it is not the same architecture as the box running. When the full name of the compiler is sent (e.g. ), there is no confusion.

Troubleshooting
This section covers a number of common problems when using for cross-compiling.

Remote host distccd COMPILE ERRORS
When receiving the message  within a remote host's  file, see the above notes concerning specifying the correct architecture name (ie. ).

Another solution is to uninstall and re-install compiler tools, using the  option, or ensuring  no longer exists, and then completely reinstall the cross compiler.

It might also be wise to edit the remote host's, and ensure the contents of the CFLAGS variable are similar on all computers or hosts performing compiler operations.

Failed to exec $TARGET-unknown-linux-gnu-gcc: No such file or directory
The wrapper scripts might fail to execute, even with correct permissions:

To resolve this, make sure to have the wrapper script created with the complete name of the architecture target: