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 optionnellement clang 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
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 optionnellement clang et llvm) :
Code BASH :
emerge -1 sys-devel/libtool sys-devel/llvm sys-devel/clang
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
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