Gentoo Logo

Guía de actualización de GCC en Gentoo Linux

Contenido:

1.  Introducción

Actualización de GCC

¿Por que debería actualizar? Bueno, GCC es muy similar a cualquier otro paquete en su sistema, pero un poco más crítico. Debería actualizar GCC en caso de que una nueva versión corrija algún bug que le moleste, se añada una nueva funcionalidad que necesita o si quiere mantener su sistema al día. Si ninguno de los casos mencionados le afecta, puede postergar con seguridad la actualización mientras que su versión de GCC esté soportada por los desarrolladores de Gentoo.

Si instala una nueva versión de GCC (como de 3.3.6 a 3.4.5), el sistema no hará uso de ella automáticamente. Tiene que pedir explícitamente el cambio porque el proceso de migración puede que tome algunos pasos adicionales. Si decide no realizar el cambio, Portage continuará usando la versión antigua de su compilador hasta que cambie de parecer o borre el compilador antiguo del sistema. Las actualizaciones no críticas del gcc se hará automáticamente (por ejemplo de 3.4.5 a 3.4.6).

Esta guía documenta los pasos necesarios para llevar a cabo una actualización sin contratiempos del compilador usado por su sistema Gentoo. Se dedica una sección específica a la actualización de GCC 3.3 a la versión 3.4 o versiones superiores y problemas con libstdc++. Hay una segunda sección específica destinada a los usuarios que instalan Gentoo por primera vez a partir de stage3 tras haberse liberado una nueva versión principal o no de GCC.

Aviso: Note que actualizar desde GCC-3.4 a GCC-4.1 o superior todavía requiere que siga las instrucciones generales de actualización pues GCC-3.4 y GCC-4.1 usan ABIs (Interfaz de Aplicación Binaria) ligeramente diferentes

2.  Instrucciones generales de actualización

Introducción

Importante: Si está buscando instrucciones específicas para actualizaciones de GCC-3.3 a GCC-3.4 o superior, por favor consulte la sección dedicada.

Importante: Si está buscando instrucciones específicas para actualizar GCC en instalaciones nuevas, por favor consulte la sección dedicada.

Generalmente hablando, las actualizaciones a versiones que incluyen correcciones de bugs, como de la 3.3.5 a la 3.3.6, deberían ser bien seguras -- tan solo instale la nueva versión, haga que su sistema la use y recompile el único paquete que se ve afectado, libtool. Sin embargo, algunas actualizaciones de GCC hacen que se corrompa la compatibilidad binaria, en tales casos puede que se necesite una recompilación de los paquetes afectados (o incluso todo el conjunto de herramientas y paquetes centrales (system)).

Cuando hablábamos acerca de la necesidad de cambiar su compilador a una versión más nueva, dijimos que no sucedería automáticamente. No obstante, hay una excepción -- las actualizaciones a versiones que corrigen bugs, como de la 3.3.5 a la 3.3.6, en cuyo caso no utiliza la característica de "multislot" que les permite coexistir en el mismo sistema. Multislot está desactivado por defecto ya que la mayoría de los usuarios no se beneficiará de este.

Listado de Código 2.1: Actualizar GCC

# emerge -uav gcc

(Por favor reemplace "i686-pc-linux-gnu-4.1.1" con la versión de
GCC y configuraciones del CHOST a las que se ha actualizado:)
# gcc-config i686-pc-linux-gnu-4.1.1
# source /etc/profile

Si ha actualizado de gcc 3 a 4 (por ejemplo, como acá de 3.4.6 a 4.1.1) tendrá que ejecutar fix_libtool_files.sh a mano
# fix_libtool_files.sh 3.4.6

(Recompilando libtool)
# emerge --oneshot -av libtool

Para estar completamente seguro que su sistema está en un estado seguro, deberá recompilar el toolchain y luego el sistema completo (world) para hacer uso del nuevo compilador.

Listado de Código 2.2: Recompilar el sistema

# emerge -eav system
# emerge -eav world

Es seguro borrar la versión antigua de GCC en este momento. Si siente la necesidad, por favor ejecute el siguiente comando (como siempre, substituya =sys-devel/gcc-3.4* con la versión de GCC que quiere desinstalar):

Listado de Código 2.3: Borrar versiones viejas de GCC

# emerge -aC =sys-devel/gcc-3.3*

Importante: Por favor note que el GCC 4.1 y versiones más nuevas solo pueden compilar núcleos más recientes que 2.4.34. No borre su gcc viejo si desea usar un núcleo viejo.

Importante: En caso de estar actualizando de GCC-3.3, debería ejecutar emerge --oneshot sys-libs/libstdc++-v3 para proporcionar compatibilidad con aplicaciones binarias más viejas en C++.

3.  Actualizando GCC-3.3 al 3.4

Introducción

La actualización de GCC/3.3 al 3.4 no es tan perfecta como uno quisiera puesto que la ABI (Interfaz de Aplicación Binaria) de C++ cambió entre ambas versiones. Existe un problema con la biblioteca libstdc++ de la que también tendremos que ocuparnos.

Las opciones

Importante: Si actualiza del gcc 3.4 al 4.1, por favor consulte las Instrucciones Generales de Actualización.

Importante: Si está haciendo la actualización en una máquina SPARC, tendrá que hacer la recompilación completa del sistema debido a ciertos cambios internos de la ABI en el paso de parámetros de GCC.

Si actualiza del gcc 3.3 al 3.4, tiene dos posibilidades para actualizar su sistema. El primer método es más rápido y requiere del uso de la herramienta revdep-rebuild que es parte del paquete gentoolkit mientras que el segundo método recompila su sistema por completo de forma de hacer uso de las nuevas características de GCC. Es su decisión escoger cuál de los métodos va a seguir. En la mayoría de los casos, el primer método es suficiente.

Si actualiza del gcc 3.3 al 4.1, no utilice el método basado en revdep-rebuild, sino una reconstrucción completa del sistema.

Usando revdep-rebuild

Este método necesita que primero instale gentoolkit si es que ya no lo ha hecho. Luego actualizaremos GCC y cambiaremos al nuevo compilador. También recompilaremos el paquete libtool para asegurarnos que el toolchain se encuentre en un estado saludable.

Listado de Código 3.1: Instalar gentoolkit y actualizar GCC

# emerge -an gentoolkit
# emerge -uav gcc
(Por favor reemplace "i686-pc-linux-gnu-3.4.5" con la versión de GCC
GCC y configuraciones del CHOST a las que se ha actualizado:)
# gcc-config i686-pc-linux-gnu-3.4.5
# source /etc/profile

(Recompilando libtool)
# emerge --oneshot -av libtool

Ahora queremos ver qué paquetes revdep-rebuild querrá reconstruir. Luego le diremos a revdep-rebuild que recompile dichos paquetes. Esto puede tomar algo de tiempo, así que tenga paciencia.

Listado de Código 3.2: Usar revdep-rebuild

# revdep-rebuild --library libstdc++.so.5 -- -p -v
# revdep-rebuild --library libstdc++.so.5

Nota: Es posible que tenga problemas con versiones de paquetes inexistentes debido a que estén enmascarados o sean antiguos. Si este es el caso, tendrá que usar la opción --package-names de revdep-rebuild. Esto hace que los paquetes sean recompilados basados en su nombre en vez de la versión y nombre exacto.

Para tener compatibilidad con aplicaciones binarias antiguas en C++ y cualquiera de los paquetes que revdep-rebuild puede haberse saltado, el paquete sys-libs/libstdc++-v3 tiene que ser instalado antes de que desinstale GCC 3.3 de su sistema.

Listado de Código 3.3: Instalar libstdc++-v3 y desinstalar GCC 3.3

# emerge --oneshot sys-libs/libstdc++-v3
# emerge -aC =sys-devel/gcc-3.3*

Usar emerge -e

Este método, aunque es mucho más lento, recompila todo su sistema para asegurar que todo se haya recompilado con su nuevo compilador, y por tanto, es más seguro. Primero, actualice GCC y libtool y cámbiese a su nuevo compilador.

Listado de Código 3.4: Actualizar GCC

# emerge -uav gcc
(Por favor reemplace "i686-pc-linux-gnu-3.4.5" con la versión de GCC
GCC y configuraciones del CHOST a las que se ha actualizado:)
# gcc-config i686-pc-linux-gnu-3.4.5
# source /etc/profile

Si actualizó del gcc 3 al 4 (por ejemplo, del 3.3.6 al 4.1.1 en este caso) tendrá que ejecutar fix_libtool_files.sh manualmente
# fix_libtool_files.sh 3.3.6

(Recompilando libtool)
# emerge --oneshot -av libtool

Para tener compatibilidad con aplicaciones binarias antiguas en C++ el paquete sys-libs/libstdc++-v3 tiene que ser instalado en su sistema.

Listado de Código 3.5: Instalar libstdc++-v3

# emerge --oneshot sys-libs/libstdc++-v3

Ahora primero recompilaremos los paquetes centrales (system) y luego el sistema completo (world). Esto va a tomar mucho tiempo dependiendo del número de paquetes que tenga instalado, pues recompilará el toolchain entero y los archivos de apoyo del sistema, seguido de cada paquete existente en su sistema. Esto es necesario para asegurar que todos los paquetes hayan sido compilados con el nuevo toolchain, incluyendo el propio toolchain también.

Listado de Código 3.6: Recompilar system y world

# emerge -e system
# emerge -e world

También es seguro borrar las versiones antiguas de GCC en este momento.

Listado de Código 3.7: Limpiar el sistema

# emerge -aC =sys-devel/gcc-3.3*

4.  Actualizar GCC en una primera instalación

Introducción

La actualización de GCC tras haber instalado un sistema a partir de stage3 es un asunto sencillo. Una de las ventajas que tienen los usuarios de instalaciones nuevas es que no tienen una gran cantidad de software instalado que enlace contra la versión antigua de GCC. El siguiente ejemplo es para una actualización de GCC-3.3 a 3.4. Ciertas partes serán diferentes si actualiza desde otras versiones de GCC. Por ejemplo, los nombres de las bibliotecas usados más abajo por revdep-rebuild son específicas a GCC-3.3, así como la necesidad de instalar libstdc++-v3.

Si no ha hecho personalizaciones a su sistema, entonces hay que seguir unos pocos pasos para que este quede actualizado a la nueva versión de GCC. Tal como con la actualización de GCC-3.3 a 3.4, hay dos opciones posibles. No obstante, a diferencia de la actualización de GCC-3.3 a 3.4, esta es menos complicada ya que hay pocas diferencias entre ambos métodos. El primer método es más rápido y hace uso de la herramienta revdep-rebuild que es parte de gentoolkit, similar al procedimiento descrito arriba. Usar revdep-rebuild hace que se recompilen solamente los paquetes que realmente están enlazados contra las bibliotecas de GCC, mientras que el segundo método hace que su nueva instalación se recompile por completo usando la nueva versión de GCC y por tanto, toma mucho más tiempo. Este segundo método nunca se necesita y está documentado sólo por completitud.

Los primeros pasos son comunes a ambos métodos, y deberían ser llevados a cabo por todos los usuarios.

Listado de Código 4.1: Actualizar GCC

# emerge -uav gcc
(Por favor reemplace "i686-pc-linux-gnu-3.4.5" con la versión de GCC
GCC y configuraciones del CHOST a las que se ha actualizado:)
# gcc-config i686-pc-linux-gnu-3.4.5
# source /etc/profile

(Recompilar libtool)
# emerge --oneshot -av libtool

Para tener compatibilidad con aplicaciones binarias antiguas en C++ el paquete sys-libs/libstdc++-v3 tiene que ser instalado en su sistema.

Listado de Código 4.2: Instalar libstdc++-v3

# emerge --oneshot sys-libs/libstdc++-v3

Usar revdep-rebuild

Este método necesita que primero instale gentoolkit si es que ya no lo ha hecho. Ejecutaremos revdep-rebuild para revisar los paquetes instalados y así ver aquellos que necesitamos recompilar, luego los recompilaremos.

Listado de Código 4.3: Instalar gentoolkit y ejecutar revdep-rebuild

# emerge -an gentoolkit
# revdep-rebuild --library libstdc++.so.5 -- -p -v
# revdep-rebuild --library libstdc++.so.5

Nota: Es posible que tenga problemas con versiones de paquetes inexistentes debido a que están desactualizados o enmascarados. Si este es el caso, tendrá que usar la opción --package-names de revdep-rebuild. Esto provoca que los paquetes sean recompilados de acuerdo al nombre en vez de su nombre y versión exactos.

Usar emerge -e

Este método, aunque es mucho más lento, recompila todo el sistema para asegurar que todo se haya recompilado con su nuevo compilador. Esto no es necesario, pero es válido si también está haciendo cambios a sus CFLAGS u otras variables del fichero make.conf que causarán efecto en la compilación del sistema.

Debido a que estamos llevando a cabo esas acciones después de una instalación inicial, no hay necesidad de recompilar todo el sistema (world) tal como lo haríamos en una actualización de un sistema ya en funcionamiento. Sin embargo, puede hacer una actualización completa en vez de actualizar los paquetes centrales (system), para asegurarse que todos los paquetes están actualizados.

Listado de Código 4.4: Recompilar los paquetes centrales (system)

# emerge -e system

Limpiando el sistema

También es seguro quitar las versiones antiguas de GCC en este paso. Por favor, substituya SU-NUEVA-VERSION-DE-GCC con la versión real a la cual se actualizó:

Listado de Código 4.5: Limpiar

# emerge -aC "<sys-devel/gcc-SU-NUEVA-VERSION-DE-GCC"

5.  Errores comunes

Es importante que desactive distcc durante la actualización. Mezclar versiones de compiladores en sus nodos provocará dificultades. Este no se necesita para ccache pues los objetos de éste serán invalidados de cualquier modo.

Siempre use la misma versión de GCC para su núcleo y módulos adicionales de este. Una vez que recompile su sistema completo (world) con el nuevo GCC, los módulos externos (como app-emulation/qemu-softmmu) no funcionarán al cargarse. Por favor, recompile su núcleo con el nuevo GCC para corregir aquello.

Si está actualizando en una máquina SPARC, asegúrese de ejecutar silo -f luego de haber completado la actualización completa del sistema (world) para evitar posibles problemas.

Mensajes de error frecuentes

Si su sistema se queja de algo como: libtool: link: `/usr/lib/gcc-lib/i686-pc-linux-gnu/3.3.6/libstdc++.la' is not a valid libtool archive, por favor ejecute /sbin/fix_libtool_files.sh 3.3.6 (substituya "3.3.6" con el número de versión que sale en el mensaje de error).

Si observa error: /usr/bin/gcc-config: line 632: /etc/env.d/gcc/i686-pc-linux-gnu-3.3.5: No such file or directory, entonces intente borrar /etc/env.d/gcc/config-i686-pc-linux-gnu y ejecute gcc-config nuevamente, seguido por source /etc/profile. Solamente haga esto si no tiene configurado algún compilador cruzado.

Si un paquete falla durante emerge -e system o emerge -e world , puede reanudar la operación con emerge --resume. Si un paquete falla repetidamente, sáltelo con emerge --resume --skipfirst. No ejecute otras instancias de emerge entre medio o perderá toda la información para reanudar.

Si obtiene el mensaje de error spec failure: unrecognized spec option mientras actualiza su compilador, intente volver a su compilador por defecto, deshabilite la variable de entorno GCC_SPECS y actualice nuevamente GCC:

Listado de Código 5.1: Recuperar las specs principales

# gcc-config 1
# source /etc/profile
# unset GCC_SPECS
# emerge -uav gcc


Imprimir

Actualizado 3 de abril, 2007

Sumario: Este documento guiará al usuario en el proceso de actualización de GCC en sus máquinas con Gentoo Linux.

Wernfried Haas
Autor

Jan Kundrát
Autor

Mark Loeser
Editor

Andrés Pereira
Traductor

Donate to support our development efforts.

Support OSL

Support OSL

Gentoo Centric Hosting: vr.org

VR Hosted

Tek Alchemy

Tek Alchemy

SevenL.net

SevenL.net

Global Netoptex Inc.

Global Netoptex Inc.

Bytemark

Bytemark

Linux World Expo

Linux World Expo

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