Changement de la variable CHOST
1.
Introduction
Le changement de la variable CHOST est un grand enjeu qui peut sérieusement
endommager votre système - par conséquent, pourquoi ce guide explique-t-il
cette procédure ?
Il y a certaines situations où le changement de CHOST est inévitable. Par
exemple, vous voulez mettre à jour glibc vers la version 2.4 qui ne supporte
que nptl et vous découvrez que votre CHOST est i386, ce qui rend impossible
l'utilisation de nptl. Dans ce cas, vous n'avez pas beaucoup d'options et le
changement de CHOST est l'une d'entre elles.
Même après avoir suivi ces instructions, des problèmes peuvent surgir.
Veuillez vous assurer de les lire et de les exécuter très précautionneusement.
Dans cet exemple, le CHOST sera changé de i386 à i686, si vous faites d'autres
changements, veillez à changer les commandes en conséquence.
2.
Changement de la variable CHOST
Établissement des paquets
Pour commencer le changement de CHOST, éditez le fichier
/etc/make.conf et changez la valeur de CHOST selon ce que
vous désirez. Ensuite, reconstruisez les paquets suivants dans cet ordre :
Exemple de code 2.1 : Reconstruction des outils importants du système |
# emerge -av1 binutils gcc glibc
|
Important :
Veuillez noter que les mises à jour majeures de gcc qui se déroulent en même
temps que le changement de CHOST (par exemple, commencer avec gcc 3.3 et le
CHOST i386 puis basculer vers gcc 4.1 et le CHOST i686) peuvent mener à de
graves effets secondaires. Il peut ne pas être impossible de faire ceci, mais
il est difficile de prévoir quels problèmes peuvent potentiellement surgir et
de les documenter dans ce guide. Par conséquent, veuillez ne faire qu'une seule
chose à la fois, par exemple commencez par mettre à jour gcc selon notre guide de mise à jour de gcc, puis
changez votre CHOST ensuite. Si vous êtes sur un système avec un CHOST=i386,
vous aurez besoin de masquer glibc 2.4 (et supérieur) durant la mise à jour de
gcc, car elle ne peut pas être utilisée avec le CHOST i386, puis de la
démasquer une fois que ce sera terminé.
|
Vérification du bon fonctionnement des choses
Maintenant il est temps de s'assurer que votre gcc-config et que les
paramètres de binutils-config sont corrects et que vous n'avez pas
d'anciens restes dans /etc/env.d.
Les affichages de sortie de gcc-config et binutils-config
devraient ressembler à ceci (ils peuvent différer selon votre version de gcc et
votre CHOST, ici il s'agit de gcc 4.1.1 et d'un CHOST i686) :
Exemple de code 2.2 : Vérification de l'installation |
# gcc-config -l
[1] i686-pc-linux-gnu-4.1.1 *
# gcc-config -c
i686-pc-linux-gnu-4.1.1
# binutils-config -l
[1] i686-pc-linux-gnu-2.16.1 *
# binutils-config -c
i686-pc-linux-gnu-2.16.1
|
Ensuite, regardez s'il y a des références à l'ancien CHOST dans
/etc/env.d/ :
Exemple de code 2.3 : Vérification des références à l'ancien CHOST |
# cd /etc/env.d/
# grep 386 *
05gcc-i386-pc-linux-gnu:PATH="/usr/i386-pc-linux-gnu/gcc-bin/4.1.1"
05gcc-i386-pc-linux-gnu:ROOTPATH="/usr/i386-pc-linux-gnu/gcc-bin/4.1.1"
|
Note :
Cela peut ne pas se produire pour vous, mais dans ce cas
05gcc-i386-pc-linux-gnu contient des références à l'ancien CHOST. Les choses
peuvent être différentes sur votre système, selon votre CHOST de
départ/d'arrivée, ou même être tout simplement bonnes. En outre, le nom
pourrait être 05gcc-your_new_CHOST-pc-linux-gnu.
|
Avant de supprimer le fichier, vérifions les fichiers avec le nouveau
CHOST :
Exemple de code 2.4 : Vérification des fichiers avec le nouveau CHOST |
# grep 686 *
05binutils:MANPATH=/usr/share/binutils-data/i686-pc-linux-gnu/2.16.1/man
05binutils:INFOPATH=/usr/share/binutils-data/i686-pc-linux-gnu/2.16.1/info
05binutils:LDPATH=/usr/i686-pc-linux-gnu/lib
05gcc:PATH="/usr/i686-pc-linux-gnu/gcc-bin/4.1.1"
05gcc:ROOTPATH="/usr/i686-pc-linux-gnu/gcc-bin/4.1.1"
05gcc:MANPATH="/usr/share/gcc-data/i686-pc-linux-gnu/4.1.1/man"
05gcc:INFOPATH="/usr/share/gcc-data/i686-pc-linux-gnu/4.1.1/info"
05gcc:LDPATH="/usr/lib/gcc/i686-pc-linux-gnu/4.1.1"
|
Ceci semble correct car il y a toujours un fichier pour gcc dans
/etc/env.d (05gcc dans cet exemple), ainsi supprimons celui qui a
les mauvaises références :
Exemple de code 2.5 : Suppression des fichiers avec les mauvaises références |
# rm 05gcc-i386-pc-linux-gnu
|
La même procédure est à appliquer à binutils - s'il y en a un
supplémentaire, regardez lequel est dépassé et supprimez-le. Ensuite, vérifiez
votre /etc/env.d/binutils/.
Exemple de code 2.6 : Vérification pour binutils |
# cd /etc/env.d/binutils/
# ls -la
total 8
-rw-r--r-- 1 root root 15 Sep 3 13:48 config-i686-pc-linux-gnu
-rw-r--r-- 1 root root 126 Sep 3 13:48 i686-pc-linux-gnu-2.16.1
# cat config-i686-pc-linux-gnu
CURRENT=2.16.1
# cat i686-pc-linux-gnu-2.16.1
TARGET="i686-pc-linux-gnu"
VER="2.16.1"
LIBPATH="/usr/lib/binutils/i686-pc-linux-gnu/2.16.1"
FAKE_TARGETS="i686-pc-linux-gnu"
|
Cela semble bon, ces deux fichiers devraient effectivement être là. Il est
temps de se rendre dans le répertoire de gcc.
Exemple de code 2.7 : Vérification des bons paramètres pour gcc |
# cd /etc/env.d/gcc
# ls -la
total 12
-rw-r--r-- 1 root root 32 Sep 3 16:43 config
-rw-r--r-- 1 root root 32 Aug 3 14:25 config-i386-pc-linux-gnu
-rw-r--r-- 1 root root 292 Sep 3 16:43 i686-pc-linux-gnu-4.1.1
# cat config
CURRENT=i686-pc-linux-gnu-4.1.1
# cat config-i386-pc-linux-gnu
CURRENT=i386-pc-linux-gnu-4.1.1
# cat i686-pc-linux-gnu-4.1.1
PATH="/usr/i686-pc-linux-gnu/gcc-bin/4.1.1"
ROOTPATH="/usr/i686-pc-linux-gnu/gcc-bin/4.1.1"
LDPATH="/usr/lib/gcc/i686-pc-linux-gnu/4.1.1"
GCCBITS="32"
MANPATH="/usr/share/gcc-data/i686-pc-linux-gnu/4.1.1/man"
INFOPATH="/usr/share/gcc-data/i686-pc-linux-gnu/4.1.1/info"
STDCXX_INCDIR="g++-v4"
|
config et i686-pc-linux-gnu-4.1.1 sont corrects, mais
config-i386-pc-linux-gnu est un autre reste qui a besoin d'être
effacé.
Note :
De nouveau, les noms des fichiers qui contiennent des références à des versions
dépassées de gcc peuvent être différents, par exemple config-i686-pc-linux-gnu
même si vous changez vers i686. Il est important que vous identifiez le fichier
sur son contenu et non seulement sur son nom.
|
Exemple de code 2.8 : Suppression des fichiers erronés de gcc config |
# rm config-i386-pc-linux-gnu
|
Maintenant, exécutez les commandes suivantes pour mettre à jour votre
environnement :
Exemple de code 2.9 : Mise à jour de l'environnement |
# env-update && source /etc/profile
|
Ensuite, vérifiez que tout est bien établi :
Exemple de code 2.10 : Vérification de l'absence des références à l'ancien CHOST |
# grep -r 386 /etc/env.d/
|
Si vous trouvez encore quelque chose, vous avez dû oublier quelques fichiers,
essayez de les dépister avant de continuer.
Finalisation du changement
Il est maintenant nécessaire de réinstaller libtool et d'exécuter
/usr/share/gcc-data/$CHOST/<gcc-version>/fix_libtool_files.sh.
Assurez-vous d'utiliser la bonne version de gcc (votre version courante, 4.1.1
ici, et l'ancienne architecture, i386 ici). Remplacez $CHOST par votre nouveau
CHOST et <gcc-version> par la version de gcc. Voici l'exemple d'un CHOST
i686 :
Exemple de code 2.11 : S'assurer du bon équilibre des bibliothèques |
# emerge -av1 libtool
# fix_libtool_files.sh 4.1.1 --oldarch i386-pc-linux-gnu
# /usr/share/gcc-data/i686-pc-linux-gnu/4.1.1/fix_libtool_files.sh 4.1.1 --oldarch i386-pc-linux-gnu
|
Vous pouvez vouloir reconstruire tous vos paquets :
Exemple de code 2.12 : Reconstruction de l'ensemble des paquets |
# emerge -e world
|
Maintenant, en théorie, il ne devrait pas être nécessaire de faire cela, mais
il n'est pas garanti à 100% que ce soit effectivement le cas. Si vous ne
recompilez pas l'ensemble des paquets, je vous dis au moins les quelques
paquets qui ont besoin d'être recompilés, ainsi vous devrez faire :
Exemple de code 2.13 : Recompilation de Python |
# emerge -av1 python
|
Tous les paquets utilisant Perl s'installent dans le répertoire CHOST et
nécessitent par conséquent d'être recompilés. Dans le cas où vous n'avez pas
installé qfile, vous aurez besoin d'installer
app-portage/portage-utils en premier.
Exemple de code 2.14 : Recompilation des paquets Perl |
# emerge -av portage-utils
# emerge -av1 `qfile /usr/lib/perl* -Cq | sort -u`
|
Si vous rencontrez d'autres paquets qui ont besoin d'être recompilés, veuillez
le faire savoir à l'auteur de ce document.
Problèmes courants
Lors de la mise à jour de gcc depuis la version 3.3 vers la 4.1 simultanément
au changement de CHOST (veuillez ne pas faire cela de toute façon), des
utilisateurs ont reporté des paquets cassés qui nécessitaient d'être
recompilés, comme groff et courier :
Exemple de code 2.15 : Message d'erreur |
error while loading shared libraries: libstdc++.so.5: cannot open shared object file: No such file or directory
|
C'est un problème qui arrive parce que pendant la mise à jour, le CHOST ne
correspond pas exactement à CTARGET et le compilateur suppose une compilation
croisée. Par conséquent, LDPATH n'est pas inséré dans le fichier
ld.so.conf, ce qui produit cette erreur.
Veuillez consulter notre guide de mise à
jour de gcc pour savoir ce qu'il est nécessaire de recompiler après une
mise à jour de gcc.
Dans quelques rares cas, cela peut casser d'anciennes version de Python aussi.
Cela peut être corrigé en ajoutant
/usr/lib/gcc-lib/i386-pc-linux-gnu/3.3.6 (adaptez selon votre
ancien CHOST et votre version de gcc) au fichier /etc/ld.so.conf,
exécutez ldconfig et enfin emerge libstdc++-v3. Néanmoins, comme
vous pouvez le constater, vous devez vraiment éviter de vous embarquer dans ce
problème - ne changez pas votre CHOST et votre version de gcc en même temps.
Retours sur expérience
Ce devrait être tout, les réactions (que cela fonctionne, échoue ou tout autre
problème que vous rencontrez) sont les bienvenues, veuillez envoyer un courrier
électronique à Wernfried Haas ou soumettre un message dans ce sujet du forum
(anglophone). La plupart de ce tutoriel vient de Vapier, merci à lui pour son
aide !
Ce document est protégé par la licence Creative
Commons : Paternité - Partage des Conditions Initiales à
l'Identique 2.5.
|