2008-07-19, Rev. 23Gentoo GCC-Aktualisierungsanleitung
Dieses Dokument führt den Benutzer durch den Prozess einer GCC-Aktualisierung.
Gentoo GCC-Aktualisierungsanleitung
1.
Einführung
1.1 Aktualisierung von GCC
Wieso sollten Sie aktualisieren? Nun ja, GCC ist jedem anderen Paket auf Ihrem
System sehr ähnlich, nur etwas kritischer. Wann immer eine neue Version Fehler
beseitigt, die Sie stören, neue Funktionen, die Sie benötigen bereitstellt oder
Sie einfach nur aktuell bleiben möchten, sollten Sie GCC aktualisieren. Sollte
keiner dieser Fälle auf Sie zutreffen, können Sie die Aktualisierung so lange
aufschieben, solange Ihre GCC-Version von den Gentoo Entwicklern unterstützt
wird.
Wenn Sie eine neue Hauptversion von GCC installieren (wie von 3.3.6 auf 3.4.5),
wird das System diese nicht automatischen benutzen. Sie müssen den Wechsel
selbst veranlassen, da die Umstellung einige weitere Schritte benötigen kann.
Falls Sie sich dazu entscheiden, nicht zu wechseln, wird Portage weiterhin die
alte Version verwenden, außer Sie entscheiden sich zu wechseln oder löschen den
alten Compiler von Ihrem System. Bei Aktualisierungen von Unterversionen von
GCC (wie von 3.4.5 auf 3.4.6) wird automatisch für Sie gewechselt.
Diese Anleitung beschreibt die nötigen Schritte um eine nahtlose Aktualisierung
des von Gentoo benutzten Compilers durchzuführen. Ein Abschnitt widmet sich der
Aktualisierung von GCC 3.3 auf 3.4 und
Problemen mit libstdc++. Ein weiterer Abschnitt ist spezifisch für
Benutzer einer Gentoo Erstinstallation mit
einem stage3-Tarball, nachdem eine neue GCC-Version veröffentlicht wurde.
|
Beachten Sie, dass das Aktualisieren von GCC-3.4 (oder 3.3) auf GCC-4.1 oder
höher nach wie vor die generellen
Aktualisierensanweisung benötigt, da GCC-3.4 und GCC-4.1 leicht
unterschiedliche ABIs verwenden.
|
2.
Generelle Aktualisierungsanleitung
2.1 Einführung
|
Falls Sie nach Anweisungen speziell für das Aktualisieren von GCC-3.3 auf
GCC-3.4 suchen, konsultieren Sie bitte diesen
Abschnitt.
|
|
Falls Sie nach Anweisungen speziell für das Aktualisieren von GCC bei einer
neuen Installation suchen, konsultieren Sie bitte diesen Abschnitt.
|
Generell gesagt, Aktualisieren auf Bug-Fix-Releases wie zum Beispiel von
3.3.5 auf 3.3.6 sollte sicher sein -- emergen Sie einfach die neue Version,
wechseln auf diese und erstellen Sie das einzig betroffene Paket,
libtool, neu. Allerdings brechen einige Aktualisierungen von GCC binäre
Kompatibilität; in solchen Fällen kann ein erneutes Erstellen der betroffenen
Pakete (oder sogar der gesamten Toolchain und des Systems) erforderlich sein.
Als wir über die Notwendigkeit des Wechsels auf den neuen Compiler von Hand
gesprochen haben, haben wir gesagt, das wird nicht automatisch erfolgen.
Allerdings gibt es eine Ausnahme -- Upgrades auf Bug-Fix-Releases, wie von
3.3.5 auf 3.3.6 für den Fall, dass Sie das "multislot" Feature, das es beiden
Versionen erlaubt auf einem System zu existieren, nicht verwenden. Multislot
ist standardmäßig deaktiviert und die Mehrheit der Benutzer werden keinen
Vorteil von dieser Funktion haben.
Befehlsauflistung
1.1: GCC aktualisieren
# emerge -uav gcc
# gcc-config i686-pc-linux-gnu-4.1.1
# env-update && source /etc/profile
# /usr/share/gcc-data/$CHOST/<gcc-version>/fix_libtool_files.sh 3.4.6
# emerge --oneshot -av libtool
Um sicherzugehen, dass das System in einem gesunden Zustand ist, müssen
Sie die Toolchain und danach world neu bauen um den neuen Compiler zu nutzen.
Befehlsauflistung
1.2: System neu erstellen
# emerge -eav system
# emerge -eav world
Ab diesem Zeitpunkt ist es sicher, die alte GCC-Version zu löschen. Falls Sie
das Bedürfnis haben, führen Sie bitte den folgenden Befehl aus (ersetzen Sie
wie üblich =sys-devel/gcc-3.4* durch die Version die Sie löschen
möchten):
Befehlsauflistung
1.3: Alte GCC-Version löschen
# emerge -aC =sys-devel/gcc-3.4*
|
Beachten Sie bitte, dass GCC-4.1 und neuer nur Kernel neuer als 2.4.34
kompilieren kann. Entfernen Sie Ihre alte GCC-Version nicht, wenn Sie
einen älteren Kernel verwenden wollen.
|
|
Für den Fall, dass Sie von GCC-3.3 aktualisieren, sollten Sie emerge
--oneshot sys-libs/libstdc++-v3 ausführen um Kompatibilität mit älteren
binären C++ Anwendungen zu gewährleisten.
|
3.
Aktualisieren von GCC-3.3 auf -3.4
3.1 Einführung
Die Aktualisierung von GCC-3.3 auf -3.4 ist nicht so nahtlos, da sich die C++
ABI zwischen diesen beiden Versionen geändert hat. Außerdem gibt es ein Problem
mit der libstdc++ Bibliothek auf das ebenfalls Rücksicht genommen werden
muss.
3.2 Die Möglichkeiten
Falls Sie von gcc-3.3 auf -3.4 aktualisieren, haben Sie zwei Möglichkeiten Ihr
System zu aktualisieren. Die erste Methode ist schneller und
benötigt die Verwendung des revdep-rebuild Tools des gentoolkit
Pakets während die zweite
Methode das komplette System von Grund auf neu baut um die neuen
Funktionen von GCC zu verwenden. Es bleibt Ihnen überlassen, für welche der
beiden Varianten Sie sich entscheiden. In den meisten Fällen ist die erste
Methode ausreichend.
Falls Sie von gcc 3.3-auf -4.1 aktualisieren, sollten Sie nicht die Methode,
die auf revdep-rebuild basiert benutzen, sondern machen Sie einen kompletten
Neubau des System.
3.3 revdep-rebuild verwenden
Die erste Methode verlangt, dass Sie zuerst gentoolkit installieren,
sollten Sie das nicht schon getan haben. Danach werden wir GCC aktualisieren
und zur neuen Version wechseln. Wir werden auch das libtool Paket neu
bauen, um sicher zu gehen, dass die Toolchain in einem ordentlichen Zustand
ist.
Befehlsauflistung
3.1: Installation von gentoolkit und Aktualisierung von GCC
# emerge -an gentoolkit
# emerge -uav gcc
# gcc-config i686-pc-linux-gnu-3.4.5
# source /etc/profile
# emerge --oneshot -av libtool
Jetzt wollen wir sehen, welche Pakete revdep-rebuild neu bauen will. Danach
werden wir revdep-rebuild sagen, dass es diese Pakete neu bauen soll. Das wird
eine Weile dauern, also haben Sie etwas Geduld.
Befehlsauflistung
3.2: Verwendung von revdep-rebuild
# revdep-rebuild --library libstdc++.so.5 -- -p -v
# revdep-rebuild --library libstdc++.so.5
|
Es ist möglich, dass Sie Probleme mit nicht existierenden Paketversionen haben,
da diese eventuell veraltet oder maskiert sind. Sollte das der Fall sein,
verwenden Sie die --package-names Option von revdep-rebuild. Das
veranlasst, dass die Pakete basierend auf dem Paketnamen, anstatt des genauen
Namens und der Version, neu gebaut werden.
|
Um die Kompatibilität zu älteren C++ Binärapplikationen und Paketen die
revdep-rebuild ausgelassen hat zu erhalten, muss sys-libs/libstdc++-v3
emerged werden, bevor Sie GCC-3.3 von Ihrem System entfernen.
Befehlsauflistung
3.3: libstdc++-v3 installieren und aufräumen
# emerge --oneshot sys-libs/libstdc++-v3
# emerge -aC =sys-devel/gcc-3.3*
3.4 emerge -e verwenden
Diese Methode, obwohl um einiges langsamer, wird Ihr gesamtes System neu bauen,
um sicherzustellen, dass Alles mit Ihrem neuen Compiler neu gebaut wurde und ist
daher viel sicherer. Zuerst aktualisieren Sie GCC und libtool und wechseln zu
Ihrem neuen Compiler.
Befehlsauflistung
4.4: GCC aktualisieren
# emerge -uav gcc
# gcc-config i686-pc-linux-gnu-3.4.5
# source /etc/profile
# /usr/share/gcc-data/$CHOST/<gcc-version>/fix_libtool_files.sh 3.3.6
# emerge --oneshot -av libtool
Um die Kompatibilität mit älteren C++ Binärapplikationen zu gewährleisten, muss
sys-libs/libstdc++-v3 auf Ihrem System installiert werden.
Befehlsauflistung
4.5: libstdc++-v3 installieren
# emerge --oneshot sys-libs/libstdc++-v3
Jetzt werden wir dazu übergehen, zuerst das system-Ziel und dann das world-Ziel
neu zu bauen. Das wird sehr lange dauern, abhängig von der Anzahl der Pakete die
Sie installiert haben, da es Ihre komplette Toolchain und unterstützenden
Systemdateien neu erstellen wird, gefolgt von jedem Paket auf Ihrem System,
inklusive der Toolchain. Das ist nötig, um sicher zu stellen, dass alle Pakete
mit dem neuen Compiler gebaut wurden, inklusive der Toolchain selbst.
Befehlsauflistung
4.6: system und world neu bauen
# emerge -e system
# emerge -e world
Ab diesem Zeitpunkt ist es sicher, alte GCC-Versionen zu entfernen:
Befehlsauflistung
4.7: Aufräumen
# emerge -aC =sys-devel/gcc-3.3*
4.
Aktualisieren von GCC bei einer Erstinstallation
4.1 Einführung
Eine GCC-Aktualisierung auf einem System nach einer stage3-Tarball-Installation
ist eine einfache Angelegenheit. Ein Vorteil die Benutzer einer neuen
Installation haben, ist, dass diese nicht massenhaft Software installiert
haben, die gegen die alte Version von GCC gelinkt ist. Das folgende Beispiel
ist für eine GCC-3.3 auf -3.4 Aktualisierung. Einige Abschnitte sind eventuell
unterschiedlich falls Sie von anderen Versionen aktualisieren. Zum Beispiel die
benutzten Bibliothekennamen von revdep-rebuild unter GCC-3.3 im
speziellen, sowie der Bedarf libstdc++-v3 zu installieren.
Wenn ein Benutzer an seinem System noch keine Änderungen vorgenommen hat, sind
es nur einige wenige Schritte um das System auf eine neue GCC Version zu
aktualisieren. Wie bei der GCC-3.3 auf -3.4 Aktualisierung hat der Benutzer
einige Möglichkeiten. Allerdings ist die Aktualisierung von GCC-3.4 auf -3.4
weniger kompliziert, da es hier geringere Unterschiede zwischen den Methoden
gibt. Die erste Methode ist
schneller und benutzt das revdep-rebuild Werkzeug von gentoolkit,
gleich wie das obige Verfahren. Die Benutzung von revdep-rebuild bewirkt nur
das neu Bauen von Paketen die gegen GCC-Bibliotheken gelinkt sind, während die
zweite Methode Ihre ganze neue
Installation mit der neuen GCC-Version neu kompiliert und dauert daher viel
länger. Die zweite Methode ist nie notwendig und ist nur der Vollständigkeit
halber dokumentiert.
Diese ersten Schritte haben beide Methoden gemeinsam und sollten von jedem
durchgeführt werden.
Befehlsauflistung
1.1: GCC aktualisieren
# emerge -uav gcc
# gcc-config i686-pc-linux-gnu-3.4.5
# source /etc/profile
# emerge --oneshot -av libtool
Um die Kompatibilität zu älteren C++ Binärprogrammen zu gewährleisten, muss
sys-libs/libstdc++-v3 auf Ihrem System installiert werden.
Befehlsauflistung
1.2: libstdc++-v3 installieren
# emerge --oneshot sys-libs/libstdc++-v3
4.2 Verwendung von revdep-rebuild
Diese Methode verlangt, dass Sie zuerst gentoolkit installieren, sollten
Sie das nicht bereits getan haben. Wir führen revdep-rebuild aus, um die
installierten Pakete nach jenen zu durchsuchen, die neu gebaut werden müssen,
danach werden diese neu gebaut.
Befehlsauflistung
2.3: Installation von gentoolkit und Aktualisierung von GCC
# emerge -an gentoolkit
# revdep-rebuild --library libstdc++.so.5 -- -p -v
# revdep-rebuild --library libstdc++.so.5
|
Es ist möglich, dass Sie Probleme mit nicht existierenden Paketversionen haben,
da diese eventuell veraltet oder maskiert sind. Sollte das der Fall sein,
verwenden Sie die --package-names Option von revdep-rebuild. Das
veranlasst, dass die Pakete basierend auf dem Paketnamen, anstatt des genauen
Namens und der Version, neu gebaut werden.
|
4.3 Verwendung von emerge -e
Diese Methode ist viel langsamer, baut aber das ganze System neu, um
sicherzustellen, dass alles mit Ihrem aktualisierten Compiler neu gebaut wurde.
Das ist nicht nötig, aber zuverlässig falls Sie auch Ihre CFLAGS oder andere
make.conf Variablen, die den Kompiliervorgang beinflussen, ändern.
Da wir diese Aktionen nach einer Erstinstallation durchführen, müssen wir das
world Ziel nicht neu bauen, wie wir es bei einer Aktualisierung eines
bereits installierten Systems tun würden. Es steht Ihnen jedoch frei eine
Aktualisierung von world anstatt von system durchführen, um sicherzustellen,
dass alle Pakete aktualisiert wurden.
Befehlsauflistung
3.4: System neu bauen
# emerge -e system
4.4 Aufräumen
Ab diesem Zeitpunkt ist es sicher, die alte GCC-Version zu löschen. Bitte
ersetzen Sie IHRE-NEUE-GCC-VERSION mit der Version auf die Sie
aktualisiert haben:
Befehlsauflistung
4.5: Aufräumen
# emerge -aC "<sys-devel/gcc-IHRE-NEUE-GCC-VERSION"
5.
Bekannte Stolpersteine
Es ist wichtig, distcc während der Aktualisierung zu deaktivieren.
Compilerversionen auf Ihrem Host zu mischen, wird Probleme beim Bauen
verursachen. Für ccache ist das nicht nötig, da die Cache Objekte ohnehin
ungültig werden.
Benutzen Sie immer dieselbe GCC-Version für Ihre Kernel und zusätzliche
Kernelmodule. Nachdem Sie Ihr world mit dem GCC neu gebaut haben, werden sich
externe Module (wie app-emulation/qemu-softmu) nicht mehr laden lassen.
Bitte bauen Sie Ihren Kernel mit dem aktualisierten GCC neu, um das Problem zu
beheben.
Falls Sie auf einem SPARC-Rechner aktualisieren, stellen Sie sicher,
silo -f nach dem Neubauen von world auszuführen, um mögliche Probleme
zu vermeiden.
5.2 Häufige Fehlermeldungen
Falls sich Ihr System über etwas wie libtool: link:
`/usr/lib/gcc-lib/i686-pc-linux-gnu/3.3.6/libstdc++.la' is not a valid libtool
archive beschwert, führen Sie bitte
/usr/share/gcc-data/$CHOST/<gcc-version>/fix_libtool_files.sh 3.3.6
aus (ersetzen Sie "3.3.6" durch die Versionsnummer aus der Fehlermeldung, und
$CHOST und <gcc-version> mit Ihrem eigentlichen CHOST und Ihrer
GCC-Version).
Falls Sie error: /usr/bin/gcc-config: line 632:
/etc/env.d/gcc/i686-pc-linux-gnu-3.3.5: No such file or directory sehen,
versuchen Sie /etc/env.d/gcc/config-i686-pc-linux-gnu zu löschen
und gcc-config gefolgt von source /etc/profile erneut
auszuführen. Tun Sie dies jedoch nur, wenn Sie keinen Cross-Compiler
eingerichtet haben.
Falls ein Paket während emerge -e system oder emerge -e world
fehlschlägt, können Sie die Operation mit emerge --resume fortsetzen.
Falls ein Paket wiederholt fehlschlägt, überspringen Sie es mit emerge
--resume --skipfirst. Führen Sie inzwischen keine weitere Instanz von emerge
aus, da Sie sonst die resume Informationen verlieren.
Falls Sie eine Fehlermeldung spec failure: unrecognized spec option
während der Aktualisierung Ihres Compilers bekommen, versuchen Sie auf Ihren
Standardcompiler zurück zu wechseln, entfernen Sie die GCC_SPECS Variable
und aktualisieren Sie GCC erneut:
Befehlsauflistung
2.1: Primärspezifikationen wiederherstellen
# gcc-config 1
# source /etc/profile
# unset GCC_SPECS
# emerge -uav gcc
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.
|