Gentoo : Mise à jour de GCC




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



:magic:
Cette page a été vue 3349 fois