Gentoo Logo

Guide de mise à jour de GCC pour Gentoo

Table des matières :

1.  Introduction

Mettre à jour GCC

Pourquoi faudrait-il que vous mettiez GCC à jour ? GCC ressemble fort aux autres paquets de votre système, il est juste plus critique. Vous devriez mettre GCC à jour au moment où une nouvelle version supprime un bogue qui vous ennuie, une nouvelle fonctionnalité dont vous avez besoin a été ajoutée ou si vous voulez simplement garder votre système à jour. Si les cas précédents ne vous correspondent pas, vous pouvez retarder votre mise à jour sans crainte tant que votre version de GCC est supportée par les développeurs de Gentoo.

Si vous installez une nouvelle version majeure de GCC (par exemple de 3.3.6 à 3.4.5), le système ne basculera pas automatiquement vers la nouvelle version. Vous devrez exécuter des étapes supplémentaires durant la migration. Si vous décidez de ne pas exécuter ces étapes, Portage continuera à utiliser la version antérieure de votre compilateur jusqu'à ce que vous changiez d'avis ou supprimiez l'ancien compilateur de votre système. Les mises à jour mineures provoquent le basculement automatique vers la nouvelle version (par exemple de 3.4.5 vers 3.4.6).

Ce guide documente les étapes nécessaires pour mettre à jour en douceur le compilateur utilisé par votre machine Gentoo. Une section spécifique est dédiée à la mise à jour de GCC depuis la version 3.3 à la 3.4 et aux problèmes liés à libstdc++. Une autre section spécifique vise les utilisateurs qui installent Gentoo à partir d'une image du stage3 après qu'une nouvelle version majeure ou mineure de GCC soit sortie.

Attention : Notez bien que la mise à jour de GCC-3.4 (ou 3.3) vers GCC-4.1 (ou plus) nécessite de suivre les instructions générales de mise à jour, puisque GCC-3.4 et GCC-4.1 n'utilisent que des ABI très légèrement différentes.

2.  Instructions générales de mise à jour

Introduction

Important : Si vous cherchez les instructions spécifiques pour la mise à jour de GCC 3.3 vers GCC 3.4, veuillez consulter la section dédiée.

Important : Si vous cherchez les instructions spécifiques pour la mise à jour de GCC lors d'une nouvelle installation, veuillez consulter la section dédiée.

En général, les mises à jour qui corrigent des bogues, comme de GCC 3.3.5 à 3.3.6, devraient se passer sans risque – il suffit d'installer la nouvelle version, de modifier votre système afin d'utiliser le nouveau GCC et de recompiler le seul paquet affecté, libtool. Cependant, quelques mises à jour de GCC affectent la compatibilité des binaires ; dans ces cas, une recompilation des paquets concernés (ou même de la chaîne de compilation complète et du système) pourrait être requise.

Souvenez-vous, nous avons dit que la mise à jour de GCC ne serait pas automatique. Il y a tout de même une exception : les mises à jour qui suppriment des bogues, comme de la version 3.3.5 à la 3.3.6, si vous n'utilisez pas l'option USE « multislot » qui autorise les deux versions à coexister sur un seul système. Multislot est désactivé par défaut, car il n'a pas grand intérêt pour les utilisateurs.

Exemple de code 2.1 : Mise à jour de GCC

# emerge -uav gcc

(Veuillez remplacer « i686-pc-linux-gnu-4.1.1 » par votre paramètre
CHOST et la version de GCC vers laquelle vous venez de mettre à jour.)
# gcc-config i686-pc-linux-gnu-4.1.1
# env-update && source /etc/profile

(Si vous mettez à jour de gcc 3 vers gcc 4 (de 3.4.6 vers 4.1.1 dans
cet exemple), vous devrez lancer fix_libtool_files.sh à la main.)
(Remplacez $CHOST par votre véritable CHOST, situé dans le fichier
/etc/make.conf)
(Remplacez <gcc-version> par votre nouvelle version de GCC mise à
jour)
# /usr/share/gcc-data/$CHOST/<gcc-version>/fix_libtool_files.sh 3.4.6

(Recompilation de libtool.)
# emerge --oneshot -av libtool

Pour être complètement sûr que votre système se trouve dans un état sain, vous devez recompiler la chaîne de compilation, puis world, afin de s'assurer que tous les paquets seront recompilés par le nouveau GCC.

Exemple de code 2.2 : Recompilation du système

# emerge -eav system
# emerge -eav world

Il est maintenant prudent de supprimer l'ancienne version de GCC. Si vous préférez, vous pouvez spécifier la version à désinstaller (comme d'habitude, remplacez =sys-devel/gcc-3.4* par la version à retirer) :

Exemple de code 2.3 : Désinstallation des anciennes versions de GCC

# emerge -aC =sys-devel/gcc-3.4*

Important : Notez bien que GCC 4.1 et plus ne peuvent compiler que les noyaux supérieurs à 2.4.34. Ne supprimez pas votre ancienne version de GCC si vous souhaitez toujours utiliser un noyau inférieur à cette version.

Important : Dans le cas où vous mettiez GCC à jour à partir de la version 3.3, vous devez lancer un emerge --oneshot sys-libs/libstdc++-v3 pour fournir la compatibilité avec les anciennes applications binaires C++.

3.  Mise à jour de la version 3.3 à la version 3.4

Introduction

La mise à jour de GCC 3.3 à 3.4 n'est pas sans soucis, car l'ABI C++ a changé entre les deux versions. Il faut également s'occuper d'un problème qui va survenir avec la bibliothèque libstdc++.

Les choix disponibles

Important : Si vous mettez à jour de GCC 3.4 vers GCC 4.1, veuillez utiliser les instructions générales de mise à jour.

Important : Sur une machine SPARC, il est nécessaire d'effectuer une mise à jour complète à cause d'une modification de l'ABI concernant le passage des paramètres par GCC.

Si vous mettez à jour de GCC 3.3 vers 3.4, vous avez le choix entre deux possibilités. La première méthode est la plus rapide et consiste en l'utilisation de l'outil revdep-rebuild du paquet gentoolkit, alors que la seconde recompile intégralement le système. Le système utilisera ainsi les nouvelles fonctionnalités de GCC. Le choix entre ces deux possibilités vous appartient. Dans la plupart des cas, la première méthode est suffisante.

Si vous mettez à jour de GCC 3.3 vers 4.1, n'utilisez pas la méthode basée sur revdep-rebuild, mais faites plutôt une recompilation totale du système.

Utiliser revdep-rebuild

Cette méthode requiert tout d'abord l'installation de gentoolkit si vous ne l'avez pas déjà. Nous pourrons alors mettre GCC à jour et passer de l'ancien au nouveau compilateur. Nous allons ensuite recompiler le paquet libtool afin de s'assurer que la chaîne de compilation est en parfait état.

Exemple de code 3.1 : Installation de gentoolkit et mise à jour de GCC

# emerge -an gentoolkit
# emerge -uav gcc

(Veuillez remplacer « i686-pc-linux-gnu-3.4.5 » par votre paramètre
CHOST et la version de GCC vers laquelle vous venez de mettre à jour.)
# gcc-config i686-pc-linux-gnu-3.4.5
# source /etc/profile

(Recompilation de libtool.)
# emerge --oneshot -av libtool

Nous voulons maintenant voir quels paquets revdep-rebuild veut recompiler. Nous demanderons ensuite à revdep-rebuild de réinstaller ces paquets. Cela peut prendre du temps, soyez patient.

Exemple de code 3.2 : Utiliser revdep-rebuild

# revdep-rebuild --library libstdc++.so.5 -- -p -v
# revdep-rebuild --library libstdc++.so.5

Note : Il est possible que vous rencontriez des problèmes avec des paquets dont la version n'existe plus car ils sont dépassés ou masqués au moment où vous mettez à jour. Si c'est le cas, vous pouvez utiliser l'option --package-names de revdep-rebuild. Elle permet de recompiler les paquets en se basant sur leur nom plutôt que leur désignation complète composée du nom et de la version exacte.

Pour permettre la compatibilité avec les anciennes applications binaires C++, sys-libs/libstdc++-v3 doit être installé sur votre système.

Exemple de code 3.3 : Installation de libstdc++-v3 et désinstallation de l'ancienne version de GCC

# emerge --oneshot sys-libs/libstdc++-v3
# emerge -aC =sys-devel/gcc-3.3*

Utiliser emerge -e

Cette méthode, bien que beaucoup plus longue, recompilera votre système entièrement afin de s'assurer que tout aura été reconstruit avec votre nouveau compilateur. C'est aussi une méthode moins risquée. En premier lieu, vous devrez mettre GCC et libtool à jour et ensuite passer de l'ancienne version du compilateur à la nouvelle.

Exemple de code 3.4 : Mise à jour de GCC

# emerge -uav gcc

(Veuillez remplacer « i686-pc-linux-gnu-3.4.5 » par votre paramètre
CHOST et la version de GCC vers laquelle vous venez de mettre à jour.)
# gcc-config i686-pc-linux-gnu-3.4.5
# source /etc/profile

(Si vous mettez à jour de GCC 3 à 4 (de 3.3.6 à 4.1.1 dans notre
exemple), vous devez lancer fix_libtool_files.sh à la main.)
(Remplacez $CHOST par votre véritable CHOST, situé dans le fichier
/etc/make.conf)
(Remplacez <gcc-version> par votre nouvelle version de GCC mise à
jour)
# /usr/share/gcc-data/$CHOST/<gcc-version>/fix_libtool_files.sh 3.3.6

(Recompiler libtool.)
# emerge --oneshot -av libtool

Pour permettre la compatibilité avec les anciennes applications binaires C++, sys-libs/libstdc++-v3 doit être installé sur votre système.

Exemple de code 3.5 : Installation de libstdc++-v3

# emerge --oneshot sys-libs/libstdc++-v3

Nous allons d'abord recompiler le système, ensuite le « world ». Cela va prendre du temps en fonction du nombre de paquets que vous avez installés, car votre chaîne de compilation entière et ses fichiers systèmes seront recompilés, suivis de chaque paquet de votre système, notamment la chaîne de compilation. Cela est nécessaire pour s'assurer que chaque paquet, y compris ceux de la chaîne de compilation elle-même, auront été compilés avec la nouvelle chaîne de compilation.

Exemple de code 3.6 : Recompilation de system et de world

# emerge -e system
# emerge -e world

Supprimez maintenant votre ancienne version de GCC sans crainte :

Exemple de code 3.7 : Désinstallation « propre » de l'ancien GCC

# emerge -aC =sys-devel/gcc-3.3*

4.  Mise à jour de GCC à l'installation du système

Introduction

La mise à jour de GCC sur un système après l'installation d'une image de stage3 est assez simple. Un des avantages qu'ont les utilisateurs qui installent un nouveau système est qu'ils n'ont pas beaucoup de logiciels installés qui ont des liens avec les anciennes versions de GCC. L'exemple suivant sert pour la mise à jour de GCC 3.3 à 3.4. Certains passages seront différents si vous mettez à jour depuis une autre version de GCC. Par exemple, les noms des bibliothèques utilisées avec revdep-rebuild plus bas sont spécifiques à GCC 3.3, ainsi que le besoin d'installer libstdc++-v3.

Si vous n'avez pas encore apporté de modification à votre système, il suffit de quelques étapes pour le mettre à jour vers une nouvelle version de GCC. Comme pour la mise à jour de GCC 3.3 vers 3.4, vous avez deux solutions. Cependant, il y a peu de différences entre les deux solutions. La première méthode est plus rapide et utilise l'outil revdep-rebuild du paquet gentoolkit, comme dans la procédure précédente. L'utilisation de revdep-rebuild n'entraîne la recompilation que pour les paquets qui ont un lien avec les bibliothèques de GCC, tandis que la seconde méthode entraîne la recompilation de tout le système et prend donc beaucoup plus de temps. Cette seconde méthode n'est jamais utile et est seulement documentée à des fins d'exhaustivité.

Les premières étapes sont communes aux deux méthodes et doivent être accomplies dans tous les cas.

Exemple de code 4.1 : Mise à jour de GCC

# emerge -uav gcc
(Veuillez remplacer « i686-pc-linux-gnu-3.4.5 » par votre paramètre
CHOST et la version de GCC vers laquelle vous venez de mettre à jour.)
# gcc-config i686-pc-linux-gnu-3.4.5
# source /etc/profile

(Recompilation de libtool.)
# emerge --oneshot -av libtool

Pour permettre la compatibilité avec les anciennes applications binaires C++, sys-libs/libstdc++-v3 doit être installé sur votre système.

Exemple de code 4.2 : Installation de libstdc++-v3

# emerge --oneshot sys-libs/libstdc++-v3

Utilisation de revdep-rebuild

Cette méthode nécessite que vous installiez d'abord gentoolkit si vous ne l'avez pas déjà fait. Nous utiliserons revdep-rebuild pour rechercher les paquets installés à recompiler et les réinstaller.

Exemple de code 4.3 : Installation de gentoolkit et utilisation de revdep-rebuild

# emerge -an gentoolkit
# revdep-rebuild --library libstdc++.so.5 -- -p -v
# revdep-rebuild --library libstdc++.so.5

Note : Il est possible que vous rencontriez des problèmes avec des paquets dont la version n'existe plus car ils sont dépassés ou masqués au moment où vous mettez à jour. Si c'est le cas, vous pouvez utiliser l'option --package-names de revdep-rebuild. Elle permet de recompiler les paquets en se basant sur leur nom, plutôt que leur désignation complète composée du nom et de la version exacte.

Utilisation de emerge -e

Cette méthode, bien que plus lente, va recompiler tout le système pour s'assurer que tout a bien été compilé avec votre nouveau compilateur. Ce n'est pas nécessaire, mais c'est une solution valide si vous avez modifié les CFLAGS ou d'autres variables de /etc/make.conf qui ont un effet sur la compilation.

Puisque nous accomplissons la mise à jour après une installation initiale, il est inutile de recompiler la cible world comme on devrait le faire pour une mise à jour d'un système déjà installé. Cependant, vous pouvez choisir de faire une mise à jour de world au lieu de seulement system, pour être certain que tous les paquets soient mis à jour.

Exemple de code 4.4 : Recompilation de system

# emerge -e system

Suppression des anciennes versions

Désinstallez enfin les anciennes versions de GCC sans risque en remplaçant VOTRE-NOUVELLE-VERSION-DE-GCC par la version que vous venez d'installer :

Exemple de code 4.5 : Désinstallation des anciennes versions de GCC

# emerge -aC "<sys-devel/gcc-VOTRE-NOUVELLE-VERSION-DE-GCC"

5.  Pièges connus

Il est important de désactiver distcc durant la mise à jour. Mélanger les versions de compilateurs sur vos nœuds provoquera des problèmes au niveau de la compilation. Vous pouvez garder ccache activé étant donné que les objets en cache seront invalidés automatiquement.

Utilisez toujours la même version de GCC pour votre noyau et les modules additionnels du noyau. Une fois votre « world » recompilé avec votre nouveau GCC, les modules externes (comme app-emulation/qemu-softmmu) échoueront lors de leur chargement. Il suffit de recompiler votre noyau pour résoudre ce problème.

Si vous mettez à jour une machine SPARC, n'oubliez pas de relancer silo -f après avoir recompilé world afin d'éviter d'éventuels problèmes.

Messages d'erreurs fréquents

Si vous recevez un message d'erreur du type libtool: link: `/usr/lib/gcc-lib/i686-pc-linux-gnu/3.3.6/libstdc++.la' is not a valid libtool archive, il faut alors exécuter /usr/share/gcc-data/$CHOST/<gcc-version>/fix_libtool_files.sh 3.3.6 (remplacez « 3.3.6 » par le numéro de version mentionné dans le message, $CHOST par votre véritable CHOST et gcc-version par votre version de GCC).

Si vous avez l'erreur error: /usr/bin/gcc-config: line 632: /etc/env.d/gcc/i686-pc-linux-gnu-3.3.5: No such file or directory, essayez alors de supprimer /etc/env.d/gcc/config-i686-pc-linux-gnu et lancez de nouveau gcc-config, suivi de source /etc/profile. Ne faites pas cela si vous utilisez la compilation croisée.

Si un paquet échoue durant emerge -e system ou emerge -e world, vous pouvez relancer l'opération avec la commande emerge --resume. Si un paquet continue d'échouer, passez au paquet suivant avec la commande emerge --resume --skipfirst. Ne lancez aucun autre emerge entre-temps car cela effacerait les informations qui permettent la reprise.

Si vous obtenez un message d'erreur du type spec failure: unrecognized spec option alors que vous mettez votre compilateur à jour, tentez de repasser à la version de GCC que vous utilisiez auparavant. Supprimez la variable GCC_SPECS et relancez la mise à jour de GCC :

Exemple de code 5.1 : Restauration de la configuration d'origine

# gcc-config 1
# source /etc/profile
# unset GCC_SPECS
# emerge -uav gcc


Imprimer

Dernière mise à jour le 19 juillet 2008

La version originale de cette traduction n'est plus maintenue

Résumé : Ce document guidera les utilisateurs de Gentoo pour mettre GCC à jour.

Wernfried Haas
Auteur

Jan Kundrát
Auteur

Mark Loeser
Correcteur

Joshua Saddler
Correcteur

Nicolas Cornu
Traducteur

Donate to support our development efforts.

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