2006-02-17, Rev. 1.3DistCC Cross-Compiling Leitfaden
Diese Anleitung zeigt Ihnen, wie Sie distcc für Cross-Compiling zwischen
verschiedenen Prozessorarchitekturen einrichten.
DistCC Cross-Compiling Leitfaden
1.
Cross-Compiling mit distcc
1.1 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.
1.2 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.
1.3 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.
1.4 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:
|
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
4.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
4.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
4.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
4.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
4.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.
1.5 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.
Die Inhalte dieses Dokuments sind, sofern nicht explizit
anders genannt, unter der Creative Commons -
Namensnennung / Weitergabe Lizenz lizenziert. Die Gentoo Name and Logo
Usage Guidelines treffen zu.
|