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:

Was ist zu tun?

Nun muss auf dem Ausgangsrechner ein Skript erstellt werden, mit dem Text aus der folgenden Box. Es muss Dieses ist unter  zu speichern. Es muss   an die CHOST Variable angepasst werden auf der das emerge-Skript aufgerufen wird.

Der nächste Schritt besteht darin, das Skript ausführbar zu machen und die benötigen Verlinkungen auf dieses Skript anzulegen.

Nun sollte das Listing von folgendes Bild ergeben:

Bei einem Upgrade des Distcc-Paketes werden nun diese Verknüpfungen überschrieben. Damit diese nach einem Upgrade wieder hergestellt werden, wird folgende Verfahrensweise benutzt. Wird das Distcc-Paket oder der GNU-C-Compiler neu übersetzt, wird nach dem Übersetzen und Installieren ein Skript ausgeführt. Die Anweisung bekommt Portage dazu durch folgendes Skript in :

Dann muss das Skript erstellt werden, mit dem die symbolischen Links wieder hergestellt werden:

If you ARE using clang:

Anpassen der Zugriffsrechte:

Glückwunsch zum (hoffentlich) fehlerfrei funktionierendem Distcc Cross-Comiling Setup.

Funktionsweise
Immer wenn nun  aufgerufen wird, prüft es über welche Verknüpfung es aufgerufen wurde, (z.B.  ,  , etc.). Wenn nun Distcc einen Quelltext auf einen anderen Rechner zur Übersetzung sendet, wird der vollständige Name des Compilers, der auf dem unterstützenden Rechners zu verwenden ist, genannt. Würde nur der Defaultname mitgegeben, würde auf dem Unterstützungsrechner der dortige  augeführt, der mit dem lokal verwendeten nicht übereinstimmen muss.

Fehlerbehebung
Dieser Abschnitt hilft bei einigen häufigen Problemen die bei der Benutzung von und Crosscompiling auftreten können.

Übersetzungsfehler auf dem Remote Rechner
Erscheint die Meldung  in der Datei  auf dem Remoterechner, ist die korrekte Rechnerarchitektur wie im obigen Abschnitt anzugeben (z.B. ).

Eine andere Lösungsmöglichkeit besteht darin, die Compiler-Tools zu deinstallieren und neu zu installieren, unter Benutzung der  Option. Wenn leer ist, kann man auch den CrossCompiler komplett neu installieren.

Ratsam ist es auch die Datei auf dem Remote Host so anzupassen, dass die  CFLAGS Variablen auf allen teilnehmenden Rechner angeglichen sind.

Failed to exec $TARGET-unknown-linux-gnu-gcc: No such file or directory
Auch bei richtig gesetzten Zugriffsrechten, können die Wrapper-Skripte mit einem Fehler abbrechen:

Um diesen Fehler zu beheben, ist zu kontrollieren, dass das Wrapper-Skript mit dem kompletten Name der Architektur erstellt wurde.