¿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
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 (Reemplace $CHOST con su CHOST actual, ubicado en /etc/make.conf) (Reemplace <gcc-version> con su nueva versión de GCC actualizada) # /usr/share/gcc-data/$CHOST/<gcc-version>/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
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.
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.
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* |
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 (Reemplace $CHOST con su CHOST actual, ubicado en /etc/make.conf) (Reemplace <gcc-version> con su nueva versión de GCC actualizada) # /usr/share/gcc-data/$CHOST/<gcc-version>/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
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
|
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. |
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
|
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"
|
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.
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 /usr/share/gcc-data/$CHOST/<gcc-version>/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 también $CHOST y <gcc-version> con sus versiones actuales de CHOST y GCC).
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 |
El contenido de este documento está registrado bajo los términos de la licencia Creative Commons - Reconocimiento / Compartir Igual