Gentoo : Mise à jour de GCC
Table des matières
Après une mise à jour de GCC, souvent, c'est toujours la version précédente qui est utilisée pour compiler.
Si cette version a été désinstallée, les paquets échouent à la compilation.
On se rend compte que GCC va être mis à jour quand GCC apparait dans la liste des mises à jour (normal) :
On peut faire la mise à jour de GCC avant celle du système, afin d'activer la nouvelle version de GCC avant la mise à jour (et notamment de ses paquets liés comme glibc, binutils, ...)
Après la mise à jour de GCC, il faut passer sur la nouvelle version de GCC puis si besoin retirer l'ancienne.
Pour remédier à ça, on exécute la commande suivante :
Elle nous indique (par exemple) :
ou, si l'ancienne version de GCC a été supprimée (manuellement ou avec emerge -ac) :
Donc, on va activer cette nouvelle version dans notre système (exemple ici quand il ne reste que x86_64-pc-linux-gnu-5.4.0 ) :
Ensuite, on recharge dans notre console l'environnement :
Il est nécessaire de recompiler des paquets dépendant fortement de gcc, comme libtool et llvm :
Puis on peut utiliser l'outil fixlibtool en spécifiant l'ancienne version de GCC pour recréer les liens écrits en dur dans les éventuels fichiers :
Et c'est réglé !
L'option la plus "sécure" de ne pas avoir de problèmes est de recompiler la base du système avec le nouveau GCC (même si une version supérieure de GCC est rétrocompatible avec l'ancienne)
voire tout le système :
Mais cela prend un temps infini.
Dans la plupart des cas, les paquets réinstallés ci-dessus feront l'affaire.
Il se peut aussi que ce message apparaisse lors d'une compilation de paquets :
Il suffit de recompiler la base du système sauf GCC :
Si certaines applications ne se lancent pas correctement :
Il suffit de recompiler (ou télécharger à nouveau les binaires qui ont été régénérés chez Calculate par exemple) les applications qui dépendent directement de GCC via cette commande :
Introduction
Après une mise à jour de GCC, souvent, c'est toujours la version précédente qui est utilisée pour compiler.
Si cette version a été désinstallée, les paquets échouent à la compilation.
Mise à jour de GCC
On se rend compte que GCC va être mis à jour quand GCC apparait dans la liste des mises à jour (normal) :
Code BASH :
[ebuild U ] sys-devel/gcc-5.4.0:5.4.0::gentoo USE="cxx fortran (multilib) nls nptl objc openmp sanitize vtv (-altivec) (-awt) -cilk -debug -doc (-fixed-point) -gcj -go -graphite (-hardened) (-libssp) -multislot -nopie -nossp -objc++ -objc-gc -regression-test -vanilla" 87941 KiB
On peut faire la mise à jour de GCC avant celle du système, afin d'activer la nouvelle version de GCC avant la mise à jour (et notamment de ses paquets liés comme glibc, binutils, ...)
Code BASH :
emerge -1u sys-devel/gcc
Que faire après la mise à jour
Après la mise à jour de GCC, il faut passer sur la nouvelle version de GCC puis si besoin retirer l'ancienne.
Pour remédier à ça, on exécute la commande suivante :
Code BASH :
gcc-config -l
Elle nous indique (par exemple) :
Code BASH :
[1] x86_64-pc-linux-gnu-4.9.3 * [2] x86_64-pc-linux-gnu-5.4.0
ou, si l'ancienne version de GCC a été supprimée (manuellement ou avec emerge -ac) :
Code TEXT :
* gcc-config: Active gcc profile is invalid! [1] x86_64-pc-linux-gnu-5.4.0
Donc, on va activer cette nouvelle version dans notre système (exemple ici quand il ne reste que x86_64-pc-linux-gnu-5.4.0 ) :
Code BASH :
gcc-config 1
Code TEXT :
* Switching native-compiler to x86_64-pc-linux-gnu-5.4.0 ... >>> Regenerating /etc/ld.so.cache... [ ok ] * If you intend to use the gcc from the new profile in an already * running shell, please remember to do: * . /etc/profile
Ensuite, on recharge dans notre console l'environnement :
Code BASH :
env-update && source /etc/profile
Il est nécessaire de recompiler des paquets dépendant fortement de gcc, comme libtool et llvm :
Code BASH :
emerge -1 sys-devel/libtool sys-devel/llvm
Puis on peut utiliser l'outil fixlibtool en spécifiant l'ancienne version de GCC pour recréer les liens écrits en dur dans les éventuels fichiers :
Code TEXT :
Usage: fix_libtool_files.sh <old-gcc-version> [--oldarch <old-CHOST>]
Code BASH :
fix_libtool_files.sh 4.9.3
Code TEXT :
Scanning libtool files for hardcoded gcc library paths... * [1/12] Scanning /lib ... * [2/12] Scanning /usr/lib ... * [3/12] Scanning /lib32 ... * [4/12] Scanning /lib64 ... * [5/12] Scanning /usr/games/lib ... * [6/12] Scanning /usr/games/lib32 ... * [7/12] Scanning /usr/games/lib64 ... * [8/12] Scanning /usr/lib32 ... * [9/12] Scanning /usr/lib64 ... * [10/12] Scanning /usr/local/lib ... * [11/12] Scanning /usr/local/lib32 ... * [12/12] Scanning /usr/local/lib64 ...
Et c'est réglé !
Recompiler tous les paquetse
L'option la plus "sécure" de ne pas avoir de problèmes est de recompiler la base du système avec le nouveau GCC (même si une version supérieure de GCC est rétrocompatible avec l'ancienne)
Code BASH :
emerge -e @system
voire tout le système :
Code BASH :
emerge -e @world
Mais cela prend un temps infini.
Dans la plupart des cas, les paquets réinstallés ci-dessus feront l'affaire.
Quelques erreurs rencontrées
configure: error: C compiler cannot create executables
Il se peut aussi que ce message apparaisse lors d'une compilation de paquets :
Code TEXT :
checking for x86_64-pc-linux-gnu-gcc... x86_64-pc-linux-gnu-gcc checking whether the C compiler works... no configure: error: in `/var/calculate/tmp/portage/dev-libs/libmix-2.05-r7/work/libmix-v2.05': configure: error: C compiler cannot create executables See `config.log' for more details
Il suffit de recompiler la base du système sauf GCC :
Code BASH :
emerge -e @system --exclude gcc
symbol lookup error
Si certaines applications ne se lancent pas correctement :
Code BASH :
symbol lookup error: clementine: undefined symbol
Il suffit de recompiler (ou télécharger à nouveau les binaires qui ont été régénérés chez Calculate par exemple) les applications qui dépendent directement de GCC via cette commande :
Code BASH :
revdep-rebuild --library 'libstdc++.so.6' -- --exclude gcc