Gentoo Logo

Changement de la variable CHOST

Table des matières :

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 !



Imprimer

Dernière mise à jour le 29 juillet 2008

Une version originale plus récente datée du 24 juillet 2012 existe.

Résumé : Ce document explique comment changer la variable CHOST sur un système existant.

Wernfried Haas
Auteur

Mike Frysinger
Relecteur

Chris White
"Correcteur"

Marion Agé
Traducteur

Donate to support our development efforts.

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