Gentoo Logo

Cambiando la variable CHOST

Contenido:

1.  Introducción

Cambiar el CHOST es un asunto importante que puede seriamente desestabilizar el sistema - así que ¿porqué existe esta guía?

Existen ciertas situaciones donde cambiar el CHOST es inevitable, por ejemplo, si desea actualizar al glibc 2.4 que solo soporta nptl y averigua que el CHOST es un i386, lo cual imposibilita el uso de nptl. En este caso no existe una variedad de opciones y cambiar el CHOST es una de ellas.

Aún siguiendo estas instrucciones puede surgir problemas, así que por favor asegúrese de leer y ejecutarlas con sumo cuidado. En este ejemplo cambiaremos el CHOST de i386 a i686 y si su situación es diferente, por favor haga los cambios de rigor en los comandos.

2.  Cambiando la variable CHOST

Construyendo los paquetes

Para comenzar con el cambio de CHOST, modifique el archivo /etc/portage/make.conf y cambie el valor de CHOST según sus necesidades. Luego, reconstruya estos paquetes en el siguiente orden:

Listado de Código 2.1: Reconstruyendo las herramientas del sistema importantes

# emerge -av1 binutils gcc glibc

Importante: Por favor tome en cuenta la advertencia que actualizar el gcc al mismo tiempo que hacer el cambio de CHOST (como por ejemplo comenzar con un gcc 3.3 y un CHOST i386 y cambiar a un gcc 4.1 y un CHOST i686) puede conllevar unos severos efectos colaterales. Aunque tal vez no sea imposible, es difícil predecir cuáles problemas potenciales pueden surgir y documentarlos en esta guía. Como consecuencia, le rogamos haga una cosa a la vez, por ejemplo actualizar el gcc primero de acuerdo a nuestra guía de actualización del gcc y luego cambiar el CHOST. Si está en un sistema con el CHOST=i386, necesita enmascarar el glibc 2.4 (o más reciente) durante la actualización del gcc ya que no puede ser usado con i386 y luego desenmascararlo al terminar.

Verificando el funcionamiento

Ahora es el momento de asegurarse que la configuración de gcc-config y binutils-config están sanos y que no tiene el /etc/env.d/ embasurado.

La salida de gcc-config y de binutils-config deberían parecerse a (podría ser distinto según su versión de gcc y CHOST, siendo el gcc 4.1.1 y CHOST i686 en este caso):

Listado de Código 2.2: Verificando una configuración sana

# 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

Luego revisemos si tenemos alguna referencia antigua al CHOST viejo en /etc/env.d/:

Listado de Código 2.3: Revisando la existencia de referencias al CHOST viejo

# 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"

Nota: Esto tal vez no le ocurra, pero en este caso 05gcc-i386-pc-linux-gnu contiene referencias al CHOST anterior. Las cosas pueden lucir distintas en su sistema, dependiendo de cuál CHOST se está cambiando de/a, o tal vez hasta esté perfecto. El nombre puede ser también 05gcc-nuevo_CHOST-pc-linux-gnu.

Antes de borrar este archivo, revisemos si hay archivos con el CHOST actualizado:

Listado de Código 2.4: Revisando la presencia de archivos con el CHOST actualizado

# 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"

Esto se ve bien, ya que siempre debe haber un solo archivo para el gcc en /etc/env.d/ (en este ejemplo, el 05gcc), así que borremos el que tiene las referencias equivocadas:

Listado de Código 2.5: Borrando los archivos con las referencias incorrectas

# rm 05gcc-i386-pc-linux-gnu

Lo mismo aplica a binutils - si hay uno extra, verifique que sea antiguo y bórrelo. a continuación revise su directorio /etc/env.d/binutils/:

Listado de Código 2.6: Chequeando el binutils correcto

# 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"

Esto está bien, ambos archivos deben estar donde están. Hora de continuar al directorio gcc.

Listado de Código 2.7: Chequeando el gcc correcto

# 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 y i686-pc-linux-gnu-4.1.1 estan bien, pero config-i386-pc-linux-gnu es otro remanente que hay que borrar.

Nota: Una vez más el nombre del archivo que contiene referencias a una versión vieja de gcc podría tener un nombre diferente, por ejemplo, config-i686-pc-linux-gnu aunque esté cambiando a i686. Es importante identificar el archivo por el contenido, no solo el nombre.

Listado de Código 2.8: Borrando el archivo de configuración gcc incorrecto

# rm config-i386-pc-linux-gnu

Ahora ejecute los siguientes comandos para actualizar su entorno:

Listado de Código 2.9: Actualizando el entorno

# env-update && source /etc/profile

Verifique que todo esté arreglado:

Listado de Código 2.10: Verificando que las referencias al CHOST viejo hayan sido borradas

# grep -r 386 /etc/env.d/

Si todavía encuentra algo, debe haber saltado algún archivo, trate de ubicarlo antes de continuar.

Terminando el Cambio

Ahora será necesario hacer emerge otra vez a libtool y ejecutar /usr/share/gcc-data/$CHOST/<gcc-version>/fix_libtool_files.sh. Debemos asegurar el uso de la versión correcta del gcc (la actual, 4.1.1 y la arquitectura anterior, i386). Reemplace $CHOST con el CHOST nuevo y la <gcc-version> con la versión del gcc. Este ejemplo asume un CHOST i686.

Listado de Código 2.11: Asegurando una librería sana

# emerge -av1 libtool
# /usr/share/gcc-data/i686-pc-linux-gnu/4.1.1/fix_libtool_files.sh 4.1.1 --oldarch i386-pc-linux-gnu

Tal vez quiera reconstruir todos los paquetes instalados:

Listado de Código 2.12: Reconstruyendo world

# emerge -e world

Ahora en teoría, no debería ser necesario hacer esto, pero no podemos garantizar esto al 100% si no recompila world. Entiendo que al menos algunos paquetes requieren recompilación, así que:

Listado de Código 2.13: Recompilando python

# emerge -av1 python

Todos los paquetes que usan perl instalan según el directorio CHOST y por ende hay que recompilarlos. En caso que no haya instalado qfile, necesitará instalar primero app-portage/portage-utils.

Listado de Código 2.14: Recompilando los paquetes perl

# emerge -av portage-utils
# emerge -av1 `qfile /usr/lib/perl* -Cq | sort -u`

Si encuentra otros paquetes que requieren recompilación, por favor hágaselo saber al autor de este documento.

Problemas Comunes

Al actualizar del gcc 3.3 a 4.1 al mismo tiempo que hacer el cambio de CHOST (de todas formas, por favor no lo haga), un par de usuarios reportaron paquetes rotos que requirieron recompilación como groff y courier:

Listado de Código 2.15: Mensaje de error

error while loading shared libraries: libstdc++.so.5: cannot open shared object file: No such file or directory

Esto ocurre porque al hacer la actualización, el CHOST no es exactamente igual al CTARGET y el compilador asume que se trata de una compilación cruzada. Como consecuencia, no se inserta LDPATH en el archivo ld.so.conf, lo cual resulta en este error.

Por favor vea nuestra guía de actualización del gcc para información acerca de qué reconstruir después de una actualización del gcc.

En algunos raros casos, esto puede romper versiones antiguas de python también. Esto se puede arreglar agregando /usr/lib/gcc-lib/i386-pc-linux-gnu/3.3.6 (cambie según el CHOST y gcc anteriores) a /etc/ld.so.conf, ejecutando ldconfig y luego haciendo emerge libstdc++-v3. Sin embargo, tal como puede ver, realmente puede evitar encontrarse con este problema al no cambiar el CHOST y el gcc al mismo tiempo.

Comentarios, sugerencias

Eso debería ser todo, cualquier comentario o sugerencia (si funciona o no o si se encontraron otros problemas) es bienvenido. Por favor envíe correo electrónico a Wernfried Haas o haga un post en este foro. Mucha de la información en este documento es por cortesía de vapier, ¡gracias por tu ayuda!



Imprimir

Página actualizada 24 de julio, 2012

Sumario: Este documento explica cómo cambiar la variable CHOST en un sistema existente.

Wernfried Haas
Autor

Mike Frysinger
Revisor

Chris White
"Codificación GuideXML"

John Christian Stoddart
Traductor

Sergio D. Rodríguez Inclan
Traductor

Donate to support our development efforts.

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