Gentoo Logo

DistCC Cross-Compiling Leitfaden

1.  Cross-Compiling mit distcc

Einleitung

Distcc ist ein Werkzeug, mit dem Sie die Last der Software-Kompilierung über mehrere vernetzte Rechner verteilen können. Solange die vernetzten Rechner alle die gleiche Toolchain für die gleiche Prozessorarchitektur benutzen, benötigen Sie keine spezielle Konfiguration des distcc. Aber was machen Sie, wenn Sie für eine abweichende Architektur auf verschiedenen Computern kompilieren möchten? Diese Anleitung wird Ihnen zeigen, wie Sie distcc konfigurieren müssen, um für unterschiedliche Architekturen zu kompilieren.

Emergen der notwendigen Werkzeuge

Als erstes müssen Sie crossdev auf allen Rechnern, die im Kompilierungsprozess eingebunden werden sollen, emergen. Crossdev ist ein Werkzeug, das das Erstellen von architekturübergreifenden Toolchains vereinfacht. Es wurde ursprünglich von Joshua Kinard geschrieben und dann von Mike Frysinger von Grund auf neu entwickelt. Seine Benutzung ist unkompliziert: crossdev -t sparc erstellt eine vollständig auf die Sparc-Architektur abzielende Cross-Toolchain. Diese beinhaltet binutils, gcc, glibc und linux-headers. Wenn Sie weitere Hilfe benötigen, versuchen Sie crossdev --help auszuführen. Selbstverständlich benötigen Sie die passende Cross-Toolchain auf allen Hilfsrechnern.

Als nächstes müssen Sie distcc auf allen Rechnern, die an dem Prozess beteiligt sein werden, emergen. Das beinhaltet den Rechner, der emerge ausführt, sowie die Rechner mit den Cross-Compilern. Bitte lesen Sie die Gentoo Distcc Dokumentation für weitere Informationen bezüglich Einrichtung und Benutzung von distcc.

Architektur-spezifische Anmerkungen

Wenn Sie zwischen verschiedenen Subarchitekturen für Intel x86 (z.B. i586 und i686) cross-kompilieren, müssen Sie trotzdem eine vollständige Cross-Toolchain für den gewünschten CHOST erstellen, ansonsten wird die Kompilierung fehlschlagen. Das liegt daran, dass i586 und i686 genau genommen verschiedene CHOSTs sind, abgesehen von der Tatsache, dass beide als "x86" wahrgenommen werden. Behalten Sie das bitte im Hinterkopf, wenn Sie Ihre Cross-Toolchains erstellen. Zum Beispiel, wenn der Zielrechner ein i586 ist, heißt das, dass Sie i586 Cross-Toolchains auf Ihren i686 Hilfsrechnern erstellen müssen.

Konfiguration von distcc um fehlerfrei Cross-Compiling zu nutzen

In der Standardeinstellung von distcc wird Cross-Compiling nicht ordnungsgemäß funktionieren. Das Problem ist, dass viele Builds einfach gcc aufrufen, anstatt des vollständigen Compilernamens (z.B. sparc-unknown-linux-gnu-gcc). Wenn dieser Kompilierungsvorgang dann auf die distcc Hilfsrechner verteilt wird, wird der systemeigene Compiler aufgerufen, anstelle Ihres brandneuen Cross-Compilers.

Glücklicherweise gibt es eine Lösung für dieses kleine Problem. Sie benötigen nur ein Wrapper-Skript und ein paar Symlinks auf dem Rechner, der emerge ausführen wird. Ich werde meinen Sparc-Rechner als Beispiel nehmen. Wo auch immer Sie jetzt sparc-unknown-linux-gnu sehen, müssen Sie Ihren eigenen CHOST (zum Beispiel x86_64-pc-linux-gnu für einen AMD64-Rechner) einfügen. Nachdem Sie vorhin distcc emerged haben, sieht das Verzeichnis /usr/lib/distcc/bin wie folgt aus:

Notiz: Die folgenden Anweisungen dürfen nur auf dem Rechner ausgeführt werden, der den emerge-Prozess ausführt. Führen Sie diese Schritte nicht auf den Hilfsrechnern aus.

Befehlsauflistung 1.1: Verfügbare Compiler

# cd /usr/lib/distcc/bin
# ls -l
total 0
lrwxrwxrwx  1 root root 15 Dec 23 20:13 c++ -> /usr/bin/distcc
lrwxrwxrwx  1 root root 15 Dec 23 20:13 cc -> /usr/bin/distcc
lrwxrwxrwx  1 root root 15 Dec 23 20:13 g++ -> /usr/bin/distcc
lrwxrwxrwx  1 root root 15 Dec 23 20:13 gcc -> /usr/bin/distcc
lrwxrwxrwx  1 root root 15 Dec 23 20:13 sparc-unknown-linux-gnu-c++ -> /usr/bin/distcc
lrwxrwxrwx  1 root root 15 Dec 23 20:13 sparc-unknown-linux-gnu-g++ -> /usr/bin/distcc
lrwxrwxrwx  1 root root 15 Dec 23 20:13 sparc-unknown-linux-gnu-gcc -> /usr/bin/distcc

Dies sollten Sie nun ausführen:

Befehlsauflistung 1.2: Modifizierung des distcc

# rm c++ g++ gcc cc

Als nächstes werden wir das neue Skript auf dem Rechner erstellen. Starten Sie Ihren Lieblingseditor und erstellen Sie eine Datei mit dem folgenden Text, dann speichern Sie sie als sparc-unknown-linux-gnu-wrapper ab. Denken Sie daran, den CHOST (in diesem Fall sparc-unknown-linux-gnu) auf den korrekten CHOST des Rechners, der emerge ausführen wird, zu ändern.

Befehlsauflistung 1.3: Das neue Wrapper-Skript

#!/bin/bash
exec /usr/lib/distcc/bin/sparc-unknown-linux-gnu-g${0:$[-2]} "$@"

Als nächstes werden wir das Skript ausführbar machen und die korrekten Symlinks erstellen.

Befehlsauflistung 1.4: Erstellen der Symlinks

# chmod a+x sparc-unknown-linux-gnu-wrapper
# ln -s sparc-unknown-linux-gnu-wrapper cc
# ln -s sparc-unknown-linux-gnu-wrapper gcc
# ln -s sparc-unknown-linux-gnu-wrapper g++
# ln -s sparc-unknown-linux-gnu-wrapper c++

Wenn Sie das erledigt haben, sollte /usr/lib/distcc/bin folgendermaßen aussehen:

Befehlsauflistung 1.5: Ein korrekter Satz von Compilern

# ls -l
total 4
lrwxrwxrwx  1 root root 25 Jan 18 14:20 c++ -> sparc-unknown-linux-gnu-wrapper
lrwxrwxrwx  1 root root 25 Jan 18 14:20 cc -> sparc-unknown-linux-gnu-wrapper
lrwxrwxrwx  1 root root 25 Jan 18 14:20 g++ -> sparc-unknown-linux-gnu-wrapper
lrwxrwxrwx  1 root root 25 Jan 18 14:20 gcc -> sparc-unknown-linux-gnu-wrapper
lrwxrwxrwx  1 root root 15 Nov 21 10:42 sparc-unknown-linux-gnu-c++ -> /usr/bin/distcc
lrwxrwxrwx  1 root root 15 Nov 21 10:42 sparc-unknown-linux-gnu-g++ -> /usr/bin/distcc
lrwxrwxrwx  1 root root 15 Jul 27 10:52 sparc-unknown-linux-gnu-gcc -> /usr/bin/distcc
-rwxr-xr-x  1 root root 70 Jan 18 14:20 sparc-unknown-linux-gnu-wrapper

Herzlichen Glückwunsch, Sie haben jetzt eine (hoffentlich) lauffähige cross-distcc-Umgebung.

Funktionsweise

Wenn distcc aufgerufen wird, prüft es als was es aufgerufen wurde (z.B. i686-pc-linux-gnu-gcc, sparc-unknown-linux-gnu-g++, usw). Wenn distcc dann den Kompilierungsvorgang auf einen Hilfsrechner verteilt, liefert es den Namen, mit dem es aufgerufen wurde, mit. Der distcc-Dämon auf dem Hilfsrechner sucht dann nach einer Binärdatei mit diesem Namen. Wenn er nur gcc sieht, sucht es nach gcc, welches wahrscheinlich der native Compiler auf dem Hilfsrechner ist, wenn nicht die gleiche Architektur, wie auf dem Rechner der emerge ausführt, verwendet wird. Wenn der vollständige Name des Compilers mitgeschickt wurde (z.B. sparc-unknown-linux-gnu-gcc), gibt es keine Verwirrung.



Drucken

Seite aktualisiert 17. Februar 2006

Die Originalversion dieser Übersetzung wird nicht länger gepflegt

Zusammenfassung: Diese Anleitung zeigt Ihnen, wie Sie distcc für Cross-Compiling zwischen verschiedenen Prozessorarchitekturen einrichten.

Andrew Gaffney
Autor

Joshua Saddler
Bearbeiter

Michael Münch
Übersetzer

Donate to support our development efforts.

Copyright 2001-2014 Gentoo Foundation, Inc. Questions, Comments? Contact us.