Manualinux
http://www.nvu.com http://www.gimp.org InicioPresentaciónActualizacionesManualesDescargasNoticiasAgradecimientoEnlaces

Entornos GráficosAplicaciones

DesarrolloEmuladoresInternetJuegosMultimediaSistema

Instalar Dependencias para GCCInstalar Java en GNU/Linux

Instalar GCC desde cero

Página - 1Página - 2Página - 3Página - 4




Instalar GCC desde cero




Copyright

Copyright © José Luis Lara Carrascal  2007-2017   http://manualinux.eu



Sumario

Introducción
Instalar GCC 7.2.0
Configurar el sistema para el uso de GCC 7.2.0
Establecer el RPATH correspondiente
Optimizaciones de CPU para GCC
Niveles de optimización soportados por GCC
Optimizaciones adicionales para GCC
Instalar GCC 6.4.0
Configurar el sistema para el uso de GCC 6.4.0
Instalar GCC 5.4.0
Configurar el sistema para el uso de GCC 5.4.0
Instalar GCC 4.9.4
Configurar el sistema para el uso de GCC 4.9.4
Instalar GCC 4.8.5
Configurar el sistema para el uso de GCC 4.8.5
Instalar GCC 4.7.4
Configurar el sistema para el uso de GCC 4.7.4
Instalar GCC 4.6.4
Configurar el sistema para el uso de GCC 4.6.4
Instalar GCC 4.5.4
Configurar el sistema para el uso de GCC 4.5.4
Instalar GCC 4.4.7
Configurar el sistema para el uso de GCC 4.4.7
Instalar GCC 4.3.6
Configurar el sistema para el uso de GCC 4.3.6
Instalar GCC 4.2.4
Configurar el sistema para el uso de GCC 4.2.4
Instalar GCC 3.4.6
Configurar el sistema para el uso de GCC 3.4.6
Instalar GCC 3.3.6
Configurar el sistema para el uso de GCC 3.3.6
Instalar GCC 3.2.3
Configurar el sistema para el uso de GCC 3.2.3
Enlaces




Introducción  

Con la publicación de este manual se oficializa dentro de la web el apartado dedicado a este indispensable compilador, y se incluye la versión más reciente del mismo, además de las otras versiones más recientes de otras series del compilador predefinido del mundo GNU/Linux.

De lo que se trata es de que podamos siempre compilar un programa, y para eso tendremos que tener dos o tres versiones diferentes de GCC, aunque el número de versiones que podamos llegar a tener es ilimitado. La configuración del sistema para que puedan convivir las diferentes versiones de GCC es otro de los aspectos (incluso yo diría el más importante) más destacable de este documento.

Los lenguajes soportados en la compilación de GCC son los que habitualmente uso: C, C++ y Objetive C. Para terminar, y al igual que expliqué en la introducción del manual del Kernel, esto no es un manual genérico de instalación de GCC, sino la radiografía de las instalaciones que un usuario de GNU/Linux viene haciendo hace ya unos cuantos años, sin haber tenido casi nunca, ningún tipo de problema en la convivencia de las diferentes versiones de GCC que tiene en su sistema GNU/Linux. Desde el 8 de mayo de 2012 se incluye también la instalación del lenguaje Fortran. Y desde el 13 de marzo de 2015, la instalación del lenguaje Java, que ha sido retirado a partir de GCC 7.



Instalar GCC 7.2.0

Instalación

Dependencias

Herramientas de Compilación


Entre paréntesis la versión con la que se ha compilado GCC 7.2.0 para la elaboración de este documento.

* GCC - (7.1.0)
* Gawk - (4.1.4)
* M4 - (1.4.18)
* Libtool - (2.4.6)
* Make - (4.2.1)
* Bison - (3.0.4)
* Flex - (2.6.4)
* Automake - (1.15.1)
* Autoconf - (2.69)
* Gettext - (0.19.8.1)
* Gperf - (3.1)
* Texinfo - (6.4)

Librerías de Desarrollo

* Gmp - (6.1.2)
* Mpfr - (3.1.5)
* Mpc - (1.0.3)
* ISL - (0.16.1)



Descarga

gcc-7.2.0.tar.xz

Extracción y Configuración  Bloc de Notas Información general sobre el uso de los comandos

$ tar Jxvf gcc-7.2.0.tar.xz
$ mkdir gcc-build_7.2.0
$ cd gcc-build_7.2.0
$ ../gcc-7.2.0/configure --enable-shared --enable-threads=posix \
--enable-__cxa_atexit --enable-clocale=gnu --enable-languages=c,c++,fortran,objc \
--prefix=/opt/gcc7 --program-suffix=7


Explicación de los comandos

mkdir gcc-build_7.2.0
: Creamos un directorio de compilación, ya que GCC no permite que se compile directamente en el directorio de las fuentes.
--enable-shared : Compila las librerías compartidas.
--enable-threads=posix : Selecciona la librería genérica POSIX/Unix98 para el soporte de hilos.
--enable-__cxa_atexit : Opción necesaria para una correcta compilación de c++.
--enable-clocale=gnu : Evita un error en la generación de las locales, en el caso de que estén incompletas.
--enable-languages=c,c++,fortran,objc : Compila los lenguajes de programación C, C++, Fortran y Objetive C.
--prefix=/opt/gcc7 : Instala el compilador en /opt/gcc7.

--program-suffix=7 : Añadimos un sufijo a los binarios ejecutables instalados para poder diferenciarlos de otras versiones de GCC que tengamos instaladas en nuestro sistema, empezando por la principal del mismo. En mi caso particular no utilizo esta opción porque esta versión es de facto la principal de mi sistema y referencia para la documentación de este sitio web. En la lista de archivos de las estadísticas de compilación e instalación de este paquete, no aparece este sufijo.

Parámetros de configuración opcionales

--disable-bootstrap : Si por la razón que sea, tenemos que volver a recompilar el paquete, utilizando el mismo compilador de la versión que vamos a instalar, añadiendo esta opción evitaremos que los lenguajes C y C++ se recompilen a sí mismos, y anularemos el proceso predefinido de compilación en tres fases. Si la versión utilizada es de la misma serie, también se puede utilizar esta opción. Realizar antes una copia de seguridad de la versión instalada, porque la instalación de la nueva versión sobreescribirá los archivos de la misma.

--with-default-libstdcxx-abi=gcc4-compatible : Añadiendo esta opción, evitamos tener que añadir la macro -D_GLIBCXX_USE_CXX11_ABI=0 a la variable de entorno CXXFLAGS, para poder compilar código escrito en C++ de forma indistinta con GCC 5 y superiores, o Clang, compatibilidad que se rompió a partir de la versión 5 de GCC, al introducir una nueva ABI en Libstdc++. El parche no oficial existente, ha sido aceptado por los programadores de Clang, para la versión 3.9.0 y superiores, pero dado lo experimental del mismo, es muy recomendable seguir utilizando esta opción.

Compilación

$ make

Parámetros de compilación opcionales  

-j2 : Si tenemos un procesador de doble núcleo (dual-core), y el kernel está optimizado para el mismo y es SMP, con este parámetro aumentaremos el número de procesos de compilación simultáneos a un nivel de 2 y aceleraremos el tiempo de compilación del programa de forma considerable.
-j4 : Lo mismo que arriba pero con procesadores de 4 núcleos (quad-core).

Instalación como root

$ su -c "make install-strip"

Borrar las locales adicionales instaladas

$ su
# for i in be ca da de el eo fi fr hr id ja nl pt_BR ru sr sv tr tk uk vi zh_CN zh_TW ; do \
rm -rf /opt/gcc7/share/locale/$i &> /dev/null ; \
done

Borrar los directorios y archivos de instalación que hacen referencia a la versión 7.1.0, sobreescrita por esta nueva versión

Hacer sólo esto si estamos actualizando desde la versión anterior instalada siguiendo las instrucciones de este manual. Con el siguiente comando borramos los directorios y archivos de instalación numerados de la versión anterior.

# find /opt/gcc7 -name '*7.1.0' | xargs rm -rf

Estadísticas de Compilación e Instalación de GCC 7.2.0

Estadísticas de Compilación e Instalación de GCC 7.2.0
CPU AMD Athlon(tm) II X2 260 Processor
MHz 3214.610
RAM 2048 MB
Sistema de archivos XFS
Versión de Glibc 2.25
Enlazador dinámico GNU gold (Binutils 2.29) 1.14
Compilador GCC 7.1.0 + Ccache 3.3.4
Parámetros de compilación -j2
Ocupación de espacio en disco del proceso de compilación 2,0 GB
Tiempo de compilación 27' 24"
Archivos instalados 1.435
Mostrar/Ocultar la lista de archivos instalados
Enlaces simbólicos creados 34
Mostrar/Ocultar la lista de enlaces simbólicos creados
Ocupación de espacio en disco 173,4 MB

Desinstalación como root

1) MODO TRADICIONAL

En el directorio de compilación ejecutamos el siguiente comando:

$ su -c "make uninstall"

2) MODO MANUALINUX

El principal inconveniente del comando anterior es que tenemos que tener el directorio de compilación en nuestro sistema para poder desinstalar el programa. En algunos casos esto supone muchos megas de espacio en disco. Con el paquete de scripts que pongo a continuación logramos evitar el único inconveniente que tiene la compilación de programas, y es el tema de la desinstalación de los mismos sin la necesidad de tener obligatoriamente una copia de las fuentes compiladas.

gcc-7.2.0-scripts.tar.gz

$ su
# tar zxvf gcc-7.2.0-scripts.tar.gz
# cd gcc-7.2.0-scripts
# ./Desinstalar_gcc-7.2.0

La desinstalación del compilador no incluye las librerías compartidas (.so) para evitar problemas de dependencias en el caso de que hayamos compilado algún programa con esta versión de GCC.

Copia de Seguridad como root

Con este otro script creamos una copia de seguridad de los binarios compilados, recreando la estructura de directorios de los mismos en un directorio de copias de seguridad (copibin) que se crea en el directorio /var. Cuando se haya creado el paquete comprimido de los binarios podemos copiarlo como usuario a nuestro home y borrar el que ha creado el script de respaldo, teniendo en cuenta que si queremos volver a restaurar la copia, tendremos que volver a copiarlo al lugar donde se ha creado.

$ su
# tar zxvf gcc-7.2.0-scripts.tar.gz
# cd gcc-7.2.0-scripts
# ./Respaldar_gcc-7.2.0

Restaurar la Copia de Seguridad como root

Y con este otro script (que se copia de forma automática cuando creamos la copia de respaldo del programa) restauramos la copia de seguridad como root cuando resulte necesario.

$ su
# cd /var/copibin/restaurar_copias
# ./Restaurar_gcc-7.2.0

Soporte de optimizaciones para ¿nuevos procesadores? en GCC 7

En GCC 7 se añade soporte de optimizaciones para los siguientes procesadores:

Procesadores Parámetros de optimización
VIA
VIA C7 (Esther) con soporte de instrucciones MMX, SSE, SSE2 y SSE (no se implementa planificación para este chip). -march=c7 -mtune=c7
VIA Eden Samuel 2 con soporte de instrucciones MMX y 3DNow! (no se implementa planificación para este chip). -march=samuel-2 -mtune=samuel-2
VIA Eden Nehemiah con soporte de instrucciones MMX y SSE (no se implementa planificación para este chip). -march=nehemiah -mtune=nehemiah
VIA Eden Esther con soporte de instrucciones MMX, SSE, SSE2 y SSE3 (no se implementa planificación para este chip). -march=esther -mtune=esther
VIA Eden X2 con soporte de instrucciones x86-64, MMX, SSE, SSE2 y SSE3 (no se implementa planificación para este chip). -march=eden-x2 -mtune=eden-x2
VIA Eden X4 con soporte de instrucciones MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, AVX y AVX2 (no se implementa planificación para este chip). -march=eden-x4 -mtune=eden-x4
VIA Nano genérico con soporte de instrucciones x86-64, MMX, SSE, SSE2, SSE3 y SSSE3 (no se implementa planificación para este chip). -march=nano -mtune=nano
VIA Nano 1xxx con soporte de instrucciones x86-64, MMX, SSE, SSE2, SSE3 y SSSE3 (no se implementa planificación para este chip). -march=nano-1000 -mtune=nano-1000
VIA Nano 2xxx con soporte de instrucciones x86-64, MMX, SSE, SSE2, SSE3 y SSSE3 (no se implementa planificación para este chip). -march=nano-2000 -mtune=nano-2000
VIA Nano 3xxx con soporte de instrucciones x86-64, MMX, SSE, SSE2, SSE3, SSSE3 y SSE4.1 (no se implementa planificación para este chip). -march=nano-3000 -mtune=nano-3000
VIA Nano Dual Core con soporte de instrucciones x86-64, MMX, SSE, SSE2, SSE3 y SSSE3 (no se implementa planificación para este chip). -march=nano-x2 -mtune=nano-x2
VIA Nano Quad Core con soporte de instrucciones x86-64, MMX, SSE, SSE2, SSE3 y SSSE3 (no se implementa planificación para este chip). -march=nano-x4 -mtune=nano-x4

Se rompe la compatibilidad de libgcc hacia abajo en sistemas de 32 bits, a partir de GCC 7, por la introducción de una nueva función, "__divmoddi4()" que conlleva un cambio de ABI

A partir de GCC 7 se ha introducido una nueva función ("__divmoddi4()") en libgcc para poder dividir un entero de 64 bits en sistemas de 32 bits (en los de 64 no es necesaria porque ya lo hace la CPU), rompiendo la compatibilidad de esta librería con versiones anteriores de GCC, e impidiendo una correcta compilación y ejecución de los binarios escritos en C, que requieran de un enlazado contra libgcc_s.so. Ni siquiera el establecimiento de un RPATH en el proceso de compilación, garantiza una compilación exitosa, ya que en el mismo momento que una dependencia esté enlazada contra la versión principal de libgcc del sistema o cualquier otra de otra versión, la compilación no se podrá llevar a cabo, mostrando mensajes de error similares al siguiente:

/opt/gcc44/lib/libgcc_s.so.1: version `GCC_7.0.0' not found (required by /usr/lib/libcairo.so.2)

La única solución posible a esto pasa por recompilar todo el código escrito en C que esté enlazado contra la versión de libgcc que tengamos en nuestro sistema, estableciendo esta versión como la principal, y sustituyendo el enlace simbólico de libgcc_s.so ubicado en /usr/lib por otro que apunte a la ruta de instalación de GCC 7. La solución es drástica, pero no existe otra posible. Bueno, sí existe, pasarnos a un sistema de 64 bits, con el trabajo extra que conlleva tener que compilar librerías duplicadas, o simplemente, no utilizar esta versión de GCC para compilar programas o librerías.



Configurar el sistema para el uso de GCC 7.2.0  Nota importante

1) /etc/ld.so.conf

Añadimos la ruta a las librerías en el archivo /etc/ld.so.conf.

include ld.so.conf.d/*.conf
/usr/X11R6/lib
/usr/lib
/usr/lib/qt3/lib
/usr/local/lib
/opt/e17/lib
/opt/gcc7/lib


Cuando lo hayamos editado y guardado ejecutamos la actualización de la caché de las librerías compartidas.

$ su -c "ldconfig -v"

2) Añadir la ruta a los binarios y las páginas de manual a nuestro PATH

2a) Variable de entorno PATH de usuario

Editamos el archivo de nuestro home, ~/.bashrc (si no existe lo creamos) y añadimos lo siguiente al final del mismo.

export PATH=/opt/gcc7/bin:$PATH
export MANPATH=/opt/gcc7/share/man:$MANPATH


2b) Variable de entorno PATH del sistema

Si queremos establecer una variable de entorno global del sistema, abrimos un editor de texto y añadimos lo siguiente:

#!/bin/sh

export PATH=/opt/gcc7/bin:$PATH
export MANPATH=/opt/gcc7/share/man:$MANPATH


Lo guardamos con el nombre gcc.sh, y lo instalamos en /etc/profile.d.

$ su -c "install -m755 gcc.sh /etc/profile.d"

Tenemos que cerrar el emulador de terminal y volverlo a abrir para que la variable de entorno aplicada sea efectiva. Es conveniente guardar una copia de este script para posteriores instalaciones de nuestro sistema. La ventaja de utilizar el directorio /etc/profile.d es que es común a todas las distribuciones y nos evita tener que editar otros archivos del sistema como por ejemplo, /etc/profile.

Para comprobar que la nueva versión aparece en el PATH basta teclear la palabra gcc, y pulsar el tabulador (la tecla de las dos flechas que está al lado de la letra Q en el teclado) para que autocomplete la lista de ejecutables disponibles relacionados con este comando, ejemplo:

[jose@localhost ~]$ gcc
gcc           gcc44         gcc49         gcc-ar49      gccbug43      gcc-nm47      gcc-ranlib47
gcc32         gcc45         gcc5          gcc-ar5       gccbug44      gcc-nm48      gcc-ranlib48
gcc34         gcc46         gcc-ar        gccbug32      gccbug45      gcc-nm49      gcc-ranlib49
gcc42         gcc47         gcc-ar47      gccbug34      gccmakedep    gcc-nm5       gcc-ranlib5
gcc43         gcc48         gcc-ar48      gccbug42      gcc-nm        gcc-ranlib

En mi caso no aparece el número del compilador porque siempre lo coloco como compilador principal del sistema, es decir, no lo instalo con la opción del sufijo correspondiente. En el caso de que queramos que nuestra flamante versión sea la que utilice el sistema por defecto (cuidado con esto, leerse la sección del RPATH), sólo tenemos que editar los enlaces simbólicos que las distribuciones (no sé si todas) suelen crear a los binarios de sus respectivos compiladores, pongo el ejemplo de Mandriva, pero es perfectamente válido para todas.

Sobreescribo los enlaces pertinentes en el directorio /usr/bin, en el caso de Mandriva también se puede hacer en /etc/alternatives que es a donde apuntan los que están en /usr/bin.

# ln -sf /opt/gcc7/bin/gcc /usr/bin/gcc
# ln -sf /opt/gcc7/bin/g++ /usr/bin/g++
# ln -sf /opt/gcc7/bin/cpp /usr/bin

Antes de sobreescribirlos comprobar visualmente que son enlaces simbólicos, que cada distribución es un mundo. Y ahora cuando teclee en la ventana de terminal, gcc --version, me saldrá la que he instalado. Podemos comprobar también que el binario g++ funciona sin ningún problema.

[jose@localhost ~]$ gcc --version
gcc (GCC) 7.2.0
Copyright (C) 2017 Free Software Foundation, Inc.
Esto es software libre; vea el código para las condiciones de copia.  NO hay
garantía; ni siquiera para MERCANTIBILIDAD o IDONEIDAD PARA UN PROPÓSITO EN
PARTICULAR

[jose@localhost ~]$ g++ --version
g++ (GCC) 7.2.0
Copyright (C) 2017 Free Software Foundation, Inc.
Esto es software libre; vea el código para las condiciones de copia.  NO hay
garantía; ni siquiera para MERCANTIBILIDAD o IDONEIDAD PARA UN PROPÓSITO EN
PARTICULAR

En el caso de que no existan los enlaces simbólicos cc y c++ apuntando a /usr/bin/gcc y /usr/bin/g++, ya sea de forma directa o a través de los enlaces simbólicos, /etc/alternatives/cc y /etc/alternatives/c++, los creamos dentro del directorio /usr/bin.

# ln -sf /usr/bin/gcc /usr/bin/cc
# ln -sf /usr/bin/g++ /usr/bin/c++

Y comprobamos que funcionan correctamente.

[jose@localhost ~]$ cc --version
cc (GCC) 7.2.0
Copyright (C) 2017 Free Software Foundation, Inc.
Esto es software libre; vea el código para las condiciones de copia.  NO hay
garantía; ni siquiera para MERCANTIBILIDAD o IDONEIDAD PARA UN PROPÓSITO EN
PARTICULAR

[jose@localhost ~]$ c++ --version
c++ (GCC) 7.2.0
Copyright (C) 2017 Free Software Foundation, Inc.
Esto es software libre; vea el código para las condiciones de copia.  NO hay
garantía; ni siquiera para MERCANTIBILIDAD o IDONEIDAD PARA UN PROPÓSITO EN
PARTICULAR

En cambio, si no queremos que la versión instalada sea la que usamos por defecto, cada vez que queramos hacer uso de la misma deberemos de ejecutar las variables de entorno pertinentes, aunque esto no siempre es efectivo con todos los programas y puede que algunas veces tengamos que editar directamente los archivos Makefile, edición que explico en este mismo apartado.

a) Antes de ejecutar el script configure

$ export CC=gcc7; export CXX=g++7; export {FC,F90,F95,F77}=gfortran7

Que podemos convertir en un alias de Bash, para reducir el comando. Abrimos con un editor de texto, el archivo de configuración personal, ~/.bashrc, si no existe lo creamos, y añadimos lo siguiente al final del contenido del mismo:

alias envgcc7="export CC=gcc7; export CXX=g++7; export {FC,F90,F95,F77}=gfortran7"

Ahora bastará teclear el comando envgcc7, para establecer las variables de entorno pertinentes.

[jose@localhost ~]$ envgcc7
[jose@localhost ~]$ echo $CC $CXX $FC
gcc7 g++7 gfortran7

Esto lo podemos aplicar con todas las versiones de GCC tratadas en este manual. Sólo hay que cambiar el número del sufijo de la versión, y el número del alias a utilizar.

En el caso particular de Fortran existe un problema, y es que los scripts de configuración tipo GNU Autotools, hacen caso omiso a las variables de entorno de uso de compilador Fortran y buscan siempre el binario ejecutable gfortran. Para solventar esto nos creamos un alias de Bash, que crea una variable de entorno PATH temporal en el directorio /tmp, y enlaza el binario ejecutable numerado de la versión correspondiente del compilador. También nos creamos otro alias que deshace lo que el primero realiza.

Abrimos con un editor de texto, el archivo de configuración personal, ~/.bashrc, si no existe lo creamos, y añadimos lo siguiente al final del contenido del mismo:

alias envgfortran7="mkdir -p /tmp/bin; ln -sf /opt/gcc7/bin/gfortran7 /tmp/bin/gfortran; export PATH=/tmp/bin:$PATH"
alias ungfortran7="rm -rf /tmp/bin"

Ahora bastará teclear el comando envgfortran7, para que éste sea el utilizado por el correspondiente script de configuración.

[jose@localhost ~]$ envgfortran7
[jose@localhost ~]$ gfortran --version
GNU Fortran (GCC) 7.2.0
Copyright (C) 2017 Free Software Foundation, Inc.

GNU Fortran viene SIN GARANTÍA, a la extensión permitida por ley.
Puede distribuir copias de GNU Fortran
bajo los términos de la Licencia Pública General GPL.
Para más información sobre estos asuntos, vea el fichero llamado COPYING

En lo que concierne a la compilación de código escrito en Java (retirado a partir de GCC 7), tendremos que editar los correspondientes archivos Makefile que contenga el paquete, y sustituir el nombre del binario ejecutable (si está numerado), la ruta a la librería de ejecución (libgcj) y las CLASSPATH (/opt/gcc6/share/java), para que apunten al directorio de instalación de esta versión de GCC. La compilación con Java, admite las mismas optimizaciones de CPU y optimizaciones adicionales que el resto de lenguajes de programación soportados por el compilador, además de otros parámetros específicos que podemos consultar en la correspondiente página de manual (man gcj6), o en la documentación en línea del mismo. 

b) Comprobar que se ha establecido la variable y está usando la versión 7.2.0

Existen muchas maneras pero hay una que no falla y es la salida de información en la ventana de terminal cuando ejecutamos el script configure, y la ejecución del comando make que pone en marcha a GCC, más ejemplos: 

Ejemplo 1: Salida de información cuando ejecutamos el script de configuración

[jose@localhost e16-0.16.8.15]$ ./configure
checking for a BSD-compatible install... /bin/install -c
checking whether build environment is sane... yes
checking for gawk... gawk
checking whether make sets $(MAKE)... yes
checking whether to enable maintainer-specific portions of Makefiles... no
checking for gcc... gcc7

un poquito más abajo comprueba la existencia de g++

checking whether we are using the GNU C++ compiler... yes
checking whether g++7 accepts -g... yes
checking dependency style of g++7... gcc3
checking how to run the C++ preprocessor... g++7 -E


Ejemplo 2: El proceso de compilación nos quita las últimas dudas que tengamos

if gcc7 -DHAVE_STRERROR -DFATAL_EXIT_CODE=1 -DSUCCESS_EXIT_CODE=1 -DGCC_INCLUDE_DIR=\"/usr/include\" -DGPLUSPLUS_INCLUDE_DIR=\"/usr/include\" -DTOOL_INCLUDE_DIR=\"/usr/bin\" -DHOST_BITS_PER_LONG=32 -DBITS_PER_UNIT=8 -DHOST_BITS_PER_INT=32 -DBITS_PER_WORD=16 -DTARGET_BELL=7 -DTARGET_BS=8 -DTARGET_FF=12 -DTARGET_NEWLINE=10 -DTARGET_CR=13 -DTARGET_TAB=9 -DTARGET_VT=11 -I. -I. -I.. -I.. -I..  -I/usr/X11R6/include   -g -O2 -MT cpplib.o -MD -MP -MF ".deps/cpplib.Tpo" -c -o cpplib.o cpplib.c; \

2c) Lectura de las páginas de manual

$ man gcc7
$ man gfortran7
$ man gcj7



Establecer el RPATH correspondiente para una correcta compilación de los binarios escritos en C++ y Fortran, o binarios que contengan código OpenMP

El RPATH es la ruta preferente de búsqueda de directorios que contengan librerías de ejecución contra las que se enlazarán los binarios resultantes de un proceso de compilación. Cuando existen en nuestro sistema librerías de ejecución con el mismo nombre pero con diferente ABI, tendremos que establecer un RPATH en el proceso de compilación, que enlace de forma correcta el binario compilado contra la librería de ejecución que le corresponda. En el caso de GCC, los binarios escritos en C++, tenemos que enlazarlos contra la versión de libstdc++.so del compilador utilizado, los binarios escritos en Fortran, contra la versión de libgfortran.so y los binarios que contengan código OpenMP, contra la versión de libgomp.so del mismo compilador utilizado.

El establecimiento de un RPATH en el proceso de compilación que produzca un resultado exitoso, estará siempre condicionado por las dependencias del paquete a compilar. Si queremos compilar por ejemplo, qBittorrent con una versión diferente a la principal del sistema, no nos resultará posible, porque sus dependencias escritas en C++: Qt, Boost y Libtorrent-rasterbar, estarán enlazadas contra la versión de libstdc++.so proporcionada por la distribución de turno. La recompilación de esas dependencias nos llevaría de facto, a la actualización completa de los paquetes escritos en dichos lenguajes de programación, e implicaría convertir la versión instalada por nosotros, en la versión principal del sistema.

Dicho de una manera muy escueta: Todas las librerías compartidas de un sistema GNU/Linux por más de una aplicación, que estén escritas en C++ y Fortran, o contengan código OpenMP, tendrán que haber sido compiladas por una misma versión de GCC, si no queremos volvernos locos, y hacer el sistema completamente inoperativo. Por otra parte, el RPATH establecido por el usuario puede ser sobreescrito por otros establecidos por el script de configuración del paquete. De ahí, que en muchos manuales de esta web, se sugiera el renombrado temporal de la versión de libstdc++.so proporcionada por la distribución de turno, antes de compilar el paquete e instalarlo, para posteriormente volver a restaurar dicho enlace.

Otro recurso final cuando no resultan posibles otros, es recurrir a la utilidad PatchELF para añadir el RPATH a los binarios resultantes de la compilación cuando los tengamos ya instalados en nuestro sistema. Dicho esto, a continuación explico cómo establecer el RPATH con los sistemas de compilación más habituales de nuestro sistema. A pesar de esta información, siempre nos encontraremos con problemas, que pondrán a prueba nuestra experiencia como usuarios compiladores de código fuente y nuestro ingenio e imaginación como seres presuntamente inteligentes que somos. 

1) GNU Autotools

C++
$ export LDFLAGS="-Wl,-rpath,/opt/gcc7/lib -lstdc++"
$ ./configure

Fortran
$ export LDFLAGS="-Wl,-rpath,/opt/gcc7/lib -lgfortran"
$ ./configure

OpenMP
$ export LDFLAGS="-Wl,-rpath,/opt/gcc7/lib -lgomp"
$ ./configure

2) GNU Makefile

En este caso, comprobamos primero que el archivo o archivos Makefile contiene la variable LDFLAGS, y si es así, le añadimos el signo +, para que no sea fija, y poder establecer nuestras propias variables de entorno. Un ejemplo:

Antes
LDFLAGS = -L/usr/X11R6/lib -lImlib2 -lm -g -ggdb

Después
LDFLAGS += -L/usr/X11R6/lib -lImlib2 -lm -g -ggdb

Cuando lo tengamos editado, establecemos el RPATH correspondiente y ejecutamos el comando make.

export LDFLAGS="-Wl,-rpath,/opt/gcc7/lib -lstdc++"
$ make

3) CMake

Establecemos el RPATH y ejecutamos el comando correspondiente de configuración. Las versiones más antiguas de CMake no sincronizan de forma automática la variable de entorno LDFLAGS con las variables equivalentes de CMake.

$ export LDFLAGS="-Wl,-rpath,/opt/gcc7/lib -lstdc++"
$ cmake ..

Recordar que el código fuente de los programas y librerías escritos en C++ se distinguen por la extensión de archivo que puede ser:

archivo.cc
archivo.cp
archivo.cxx
archivo.cpp
archivo.CPP
archivo.c++
archivo.C


Y en el caso de Fortran, pueden ser:

archivo.f90
archivo.f95
archivo.f03
archivo.f
archivo.for

Y también lo podemos saber por los mensajes que se muestran en la terminal en el proceso de compilación, al utilizarse g++ para el mismo:

if g++ -DHAVE_CONFIG_H -I. -I. -I..   -I/usr/local/include -I/usr/X11R7/include -DSHAPE -DXFT  -DNLS -DLOCALEPATH=\"/usr/local/share/blackbox/nls\" -DDEFAULTMENU=\"/usr/local/share/blackbox/menu\" -DDEFAULTSTYLE=\"/usr/local/share/blackbox/styles/Gray\" -I../lib  -O3 -march=k6-2 -mtune=k6-2 -mmmx -m3dnow 

Para facilitar las cosas, podemos crear alias de Bash, como hemos hecho anteriormente para el uso de compilador. Un ejemplo:

alias lstdc++6="export LDFLAGS+=" -Wl,-rpath,/opt/gcc7/lib -lstdc++"
alias lgfortran6="export LDFLAGS+=" -Wl,-rpath,/opt/gcc7/lib -lgfortran"
alias lgomp6="export LDFLAGS+=" -Wl,-rpath,/opt/gcc7/lib -lgomp"



Optimizaciones de CPU para GCC

El parámetro más común utilizado en la mayor parte de los manuales ubicados en esta web, es el siguiente, lo cual no significa que sea el único posible. En determinados procesos de compilación, el uso del nivel '-O3' puede provocar la típica 'violación de segmento', cuando vayamos a ejecutar el programa.

En sistemas de 32 bits, y en paquetes de código fuente específico (en código escrito en Fortran sobre todo), el uso de optimizaciones de cpu para procesadores de 64 bits, puede provocar errores en el proceso de compilación. Para evitar esto, basta añadir el parámetro '-m32', a la variable de optimización establecida previamente. Un ejemplo:

$ export {C,CXX}FLAGS+=' -m32'

En la mayoría de los casos, y desde GCC 4.2, el parámetro 'native' hace uso de la instrucción 'cpuid' que detecta la cpu que tengamos en nuestro ordenador y aplica las optimizaciones referentes a la misma. Algunos paquetes de código fuente (mplayer, gmp, etc.) utilizan este sistema, en los scripts de configuración de los mismos.

$ export {C,CXX}FLAGS='-O3 -march=amdfam10 -mtune=amdfam10'

Donde pone amdfam10 se indica el procesador respectivo de cada sistema seleccionándolo de la siguiente tabla:
* La opción '-march=' establece el procesador mínimo con el que funcionará el programa compilado, la opción '-mtune=' el procesador específico para el que será optimizado. 

* Los valores separados por comas, son equivalentes, es decir, que lo mismo da poner '-march=k8' que '-march=athlon64'.

* En versiones de GCC 3.2 e inferiores se utiliza la opción '-mcpu=' en lugar de '-mtune='.
Valores CPU
Genéricos
generic Produce un código binario optimizado para la mayor parte de procesadores existentes. Utilizar este valor si no sabemos el nombre del procesador que tenemos en nuestro equipo. Este valor sólo es aplicable en la opción '-mtune=', si utilizamos GCC. Esta opción está disponible a partir de GCC 4.2.
native Produce un código binario optimizado para el procesador que tengamos en nuestro sistema, siendo éste detectado utilizando la instrucción cpuid. Procesadores antiguos pueden no ser detectados utilizando este valor. Esta opción está disponible a partir de GCC 4.2.
Intel
atom Intel Atom con soporte de instrucciones MMX, SSE, SSE2, SSE3, SSSE3 y extensiones 64-bit. Esta opción está disponible desde GCC 4.6, hasta GCC 4.8. A partir de GCC 4.9 se utiliza la definición bonnell.
bonnell Intel Bonnell con soporte de instrucciones MOVBE, MMX, SSE, SSE2, SSE3, SSSE3 y extensiones 64-bit. Esta opción está disponible a partir de GCC 4.9.
broadwell Intel Broadwell con soporte de instrucciones MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, AVX, AVX2, AES, PCLMUL, FSGSBASE, RDRND, FMA, BMI, BMI2, F16C, RDSEED, ADCX, PREFETCHW y extensiones 64-bit. Esta opción está disponible a partir de GCC 4.9.
core2 Intel Core2 con soporte de instrucciones MMX, SSE, SSE2, SSE3, SSSE3 y extensiones 64-bit. Esta opción está disponible a partir de GCC 4.3.
core-avx2 Intel Core (Haswell). Esta opción está disponible desde GCC 4.6, hasta GCC 4.8. A partir de GCC 4.9 se utiliza la definición haswell.
core-avx-i Intel Core (ivyBridge) con soporte de instrucciones MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, AVX, AES, PCLMUL, FSGSBASE, RDRND, F16C y extensiones 64-bit. Esta opción está disponible desde GCC 4.6, hasta GCC 4.8. A partir de GCC 4.9 se utiliza la definición ivybridge.
corei7 Intel Core i7 con soporte de instrucciones MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1 y SSE4.2 y extensiones 64-bit. Soporta también los procesadores Intel Core i3 e i5. Esta opción está disponible desde GCC 4.6, hasta GCC 4.8. A partir de GCC 4.9 se utiliza la definición nehalem.
corei7-avx Intel Core i7 con soporte de instrucciones MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, AVX, AES y PCLMUL y extensiones 64-bit. Soporta también los procesadores Intel Core i3 e i5. Esta opción está disponible desde GCC 4.6, hasta GCC 4.8. A partir de GCC 4.9 se utiliza la definición sandybridge.
haswell Intel Haswell con soporte de instrucciones MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, AVX, AVX2, AES, PCLMUL, FSGSBASE, RDRND, FMA, BMI, BMI2, F16C y extensiones 64-bit. Esta opción está disponible a partir de GCC 4.9.
i386 Intel i386.
i486 Intel i486.
i586, pentium Intel Pentium sin soporte de instrucciones MMX.
i686 Produce un código binario optimizado para la mayor parte de procesadores compatibles con la serie 80686 de Intel. Todos los actuales lo son.
intel Intel Haswell y Silvermont. Este valor sólo es aplicable en la opción '-mtune='. Esta opción está disponible a partir de GCC 4.9.
ivybridge Intel Ivy Bridge con soporte de instrucciones MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, AVX, AES, PCLMUL, FSGSBASE, RDRND, F16C y extensiones 64-bit. Esta opción está disponible a partir de GCC 4.9.
knl Intel Knights Landing con soporte de instrucciones MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, AVX, AVX2, AES, PCLMUL, FSGSBASE, RDRND, FMA, BMI, BMI2, F16C, RDSEED, ADCX, PREFETCHW, AVX512F, AVX512PF, AVX512ER y extensiones 64-bit. Esta opción está disponible a partir de GCC 5.
lakemont Intel Quark Lakemont MCU, basado en el procesador Intel Pentium. Esta opción está disponible a partir de GCC 6.
nehalem Intel Nehalem con soporte de instrucciones MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT y extensiones 64-bit. Esta opción está disponible a partir de GCC 4.9.
nocona Versión mejorada de Intel Pentium4 con soporte de instrucciones MMX, SSE, SSE2, SSE3 y extensiones 64-bit.
pentiumpro Intel PentiumPro.
pentium2 Intel Pentium2 basado en PentiumPro con soporte de instrucciones MMX.
pentium3, pentium3m Intel Pentium3 basado en PentiumPro con soporte de instrucciones MMX y SSE.
pentium4, pentium4m Intel Pentium4 con soporte de instrucciones MMX, SSE y SSE2.
pentium-m Versión de bajo consumo de Intel Pentium3 con soporte de instrucciones MMX, SSE y SSE2. Utilizado por los portátiles Centrino.
pentium-mmx Intel PentiumMMX basado en Pentium con soporte de instrucciones MMX.
prescott Versión mejorada de Intel Pentium4 con soporte de instrucciones MMX, SSE, SSE2 y SSE3.
sandybridge Intel Sandy Bridge con soporte de instrucciones MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, AVX, AES, PCLMUL y extensiones 64-bit. Esta opción está disponible a partir de GCC 4.9.
silvermont Intel Silvermont con soporte de instrucciones MOVBE, MMX, SSE, MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, AES, PCLMU, RDRND y extensiones 64-bit. Esta opción está disponible a partir de GCC 4.9.
skylake Intel Skylake con soporte de instrucciones MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, AVX, AVX2, AES, PCLMUL, FSGSBASE, RDRND, FMA, BMI, BMI2, F16C, RDSEED, ADCX, PREFETCHW, CLFLUSHOPT, XSAVEC, XSAVES y extensiones 64-bit. Esta opción está disponible a partir de GCC 6.
skylake-avx512 Intel Skylake Server con soporte de instrucciones MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, AVX, AVX2, AES, PCLMUL, FSGSBASE, RDRND, FMA, BMI, BMI2, F16C, RDSEED, ADCX, PREFETCHW, CLFLUSHOPT, XSAVEC, XSAVES, AVX512F, AVX512VL, AVX512BW, AVX512DQ, AVX512CD y extensiones 64-bit. Esta opción está disponible a partir de GCC 6.
westmere Intel Westmere con soporte de instrucciones MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, AES, PCLMUL y extensiones 64-bit. Esta opción está disponible a partir de GCC 4.9.
AMD
amdfam10, barcelona Procesadores basados en AMD Family 10h core con soporte de instrucciones x86-64 (MMX, SSE, SSE2, SSE3, SSE4A, 3DNow!, enhanced 3DNow!, ABM y extensiones 64-bit). Esta opción está disponible a partir de GCC 4.3.
athlon, athlon-tbird AMD Athlon con soporte de instrucciones MMX, 3DNow!, enhanced 3DNow! y SSE prefetch.
athlon4, athlon-xp, athlon-mp Versiones mejoradas de AMD Athlon con soporte de instrucciones MMX, 3DNow!, enhanced 3DNow! y full SSE.
bdver1 Procesadores basados en AMD Family 15h core con soporte de instrucciones x86-64 (FMA4, AVX, XOP, LWP, AES, PCL_MUL, CX16, MMX, SSE, SSE2, SSE3, SSE4A, SSSE3, SSE4.1, SSE4.2, ABM y extensiones 64-bit). Esta opción está disponible a partir de GCC 4.7.
bdver2 Procesadores basados en AMD Family 15h core con soporte de instrucciones x86-64 (BMI, TBM, F16C, FMA, LWP, AVX, XOP, LWP, AES, PCL_MUL, CX16, MMX, SSE, SSE2, SSE3, SSE4A, SSSE3, SSE4.1, SSE4.2, ABM y extensiones 64-bit). Esta opción está disponible a partir de GCC 4.7.
bdver3 Procesadores basados en AMD Family 15h core con soporte de instrucciones x86-64 (FMA4, AVX, XOP, LWP, AES, PCL_MUL, CX16, MMX, SSE, SSE2, SSE3, SSE4A, SSSE3, SSE4.1, SSE4.2, ABM y extensiones 64-bit). Esta opción está disponible a partir de GCC 4.8.
bdver4 Procesadores basados en AMD Family 15h core con soporte de instrucciones x86-64 (BMI, BMI2, TBM, F16C, FMA, FMA4, FSGSBASE, AVX, AVX2, XOP, LWP, AES, PCL_MUL, CX16, MOVBE, MMX, SSE, SSE2, SSE3, SSE4A, SSSE3, SSE4.1, SSE4.2, ABM y extensiones 64-bit). Esta opción está disponible a partir de GCC 4.9.
btver1 Procesadores basados en AMD Family 14h core con soporte de instrucciones x86-64 (MMX, SSE, SSE2, SSE3, SSE4A, CX16, ABM y extensiones 64-bit). Esta opción está disponible a partir de GCC 4.6.
btver2 Procesadores basados en AMD Family 16h core con soporte de instrucciones x86-64 (MOVBE, F16C, BMI, AVX, PCL_MUL, AES, SSE4.2, SSE4.1, CX16, ABM, SSE4A, SSSE3, SSE3, SSE2, SSE, MMX y extensiones 64-bit). Esta opción está disponible a partir de GCC 4.8.
geode AMD integrado con soporte de instrucciones MMX y 3DNow!. Esta opción está disponible a partir de GCC 4.3.
k6 AMD K6 con soporte de instrucciones MMX.
k6-2, k6-3 Versiones mejoradas de AMD K6 con soporte de instrucciones MMX y 3DNow!.
k8, opteron, athlon64, athlon-fx Procesadores basados en AMD K8 core con soporte de instrucciones x86-64 (MMX, SSE, SSE2, 3DNow!, enhanced 3DNow! y extensiones 64-bit).
k8-sse3, opteron-sse3, athlon64-sse3 Versiones mejoradas de AMD K8 core con soporte de instrucciones SSE3. Esta opción está disponible a partir de GCC 4.3.
znver1 Procesadores basados en AMD Family 17h core con soporte de instrucciones x86-64 (BMI, BMI2, F16C, FMA, FSGSBASE, AVX, AVX2, ADCX, RDSEED, MWAITX, SHA, CLZERO, AES, PCL_MUL, CX16, MOVBE, MMX, SSE, SSE2, SSE3, SSE4A, SSSE3, SSE4.1, SSE4.2, ABM, XSAVEC, XSAVES, CLFLUSHOPT, POPCNT y extensiones 64-bit). Esta opción está disponible a partir de GCC 6.
VIA
c3 VIA C3 con soporte de instrucciones MMX y 3DNow! (no se implementa planificación para este chip).
c3-2 VIA C3-2 (Nehemiah/C5XL) con soporte de instrucciones MMX y SSE (no se implementa planificación para este chip).
c7 VIA C7 (Esther) con soporte de instrucciones MMX, SSE, SSE2 y SSE (no se implementa planificación para este chip). Esta opción está disponible a partir de GCC 7.
eden-x2 VIA Eden X2 con soporte de instrucciones x86-64, MMX, SSE, SSE2 y SSE3 (no se implementa planificación para este chip). Esta opción está disponible a partir de GCC 7.
eden-x4 VIA Eden X4 con soporte de instrucciones MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, AVX y AVX2 (no se implementa planificación para este chip). Esta opción está disponible a partir de GCC 7.
esther VIA Eden Esther con soporte de instrucciones MMX, SSE, SSE2 y SSE3 (no se implementa planificación para este chip). Esta opción está disponible a partir de GCC 7.
nano VIA Nano genérico con soporte de instrucciones x86-64, MMX, SSE, SSE2, SSE3 y SSSE3 (no se implementa planificación para este chip). Esta opción está disponible a partir de GCC 7.
nano-1000 VIA Nano 1xxx con soporte de instrucciones x86-64, MMX, SSE, SSE2, SSE3 y SSSE3 (no se implementa planificación para este chip). Esta opción está disponible a partir de GCC 7.
nano-2000 VIA Nano 2xxx con soporte de instrucciones x86-64, MMX, SSE, SSE2, SSE3 y SSSE3 (no se implementa planificación para este chip). Esta opción está disponible a partir de GCC 7.
nano-3000 VIA Nano 3xxx con soporte de instrucciones x86-64, MMX, SSE, SSE2, SSE3, SSSE3 y SSE4.1 (no se implementa planificación para este chip). Esta opción está disponible a partir de GCC 7.
nano-x2 VIA Nano Dual Core con soporte de instrucciones x86-64, MMX, SSE, SSE2, SSE3 y SSSE3 (no se implementa planificación para este chip). Esta opción está disponible a partir de GCC 7.
nano-x4 VIA Nano Quad Core con soporte de instrucciones x86-64, MMX, SSE, SSE2, SSE3 y SSSE3 (no se implementa planificación para este chip). Esta opción está disponible a partir de GCC 7.
IDT
winchip2 IDT Winchip2, que equivale a un i486 con soporte de instrucciones MMX y 3DNow!.
winchip-c6 IDT Winchip C6, que equivale a un i486 con soporte de instrucciones MMX.

Niveles de optimización soportados por GCC

Niveles de optimización soportados por GCC
-O Produce un binario de tamaño reducido, sin aplicar optimizaciones que alarguen el proceso de compilación, con la idea de hacer que se ejecute más rápido.
-O1
El proceso de compilación requiere de más tiempo y memoria para llevarse a cabo.
-O2 En comparación con -O Incrementa el tiempo de compilación para realizar un mayor número de optimizaciones en el binario generado.
-O3
Activa todas las optimizaciones soportadas por el nivel -O2, además de añadir 9 parámetros más de optimización.
-O0
Sin optimizaciones. Es el nivel más rápido para compilar programas y genera el código más depurable. Es el nivel predefinido de GCC.
-Os
Lo mismo que -O2, con optimizaciones adicionales para reducir el tamaño del binario resultante.
-Ofast
Activa todas las optimizaciones de -O3, junto con otras optimizaciones agresivas que pueden violar el estricto cumplimiento de los estándares del lenguaje de programación. Esta opción está disponible a partir de GCC 4.6.
-Og Activa todas las optimizaciones que no interfieran en la generación de un código binario más depurable.

Para saber exactamente las optimizaciones activadas y desactivadas según el nivel de optimización aplicado, ejecutamos el siguiente comando en una ventana de terminal. Sustituir lo que está en rojo, por el nivel de optimización del que se desee saber, las optimizaciones aplicadas.

$ gcc -O3 -Q --help=optimizers

Optimizaciones adicionales para GCC

Optimizaciones adicionales para GCC
Graphite
-floop-interchange -ftree-loop-distribution -floop-strip-mine -floop-block Activa la optimización Graphite. Puede provocar errores de compilación y de ejecución en determinados paquetes. Para poder hacer uso de la misma, GCC tiene que haberse compilado con soporte de ISL. El soporte de la optimización Graphite fue introducido a partir de GCC 4.4.

La optimización Graphite consiste en utilizar la representación de la figura geométrica del poliedro para ejecutar en paralelo los bucles de programación que contenga el código fuente de un programa, en el binario resultante del proceso de compilación, acelerando de forma considerable el tiempo de ejecución del mismo.
LTO
-fuse-linker-plugin -flto
Activa la optimización LTO. Pueden provocar errores de compilación y de ejecución en determinados paquetes. El soporte de optimizaciones LTO fue introducido a partir de GCC 4.5.

Si tenemos un procesador multinúcleo, podemos activar el uso de hilos, pasándole al parámetro el número de núcleos que tenga nuestro procesador. Si por ejemplo es un Dual-Core, utilizaremos el parámetro -flto=2.

Tener en cuenta que el uso de esta optimización ralentiza el proceso de compilación, sobre todo cuando se tiene que procesar gran cantidad de archivos objeto (*.o), para generar un binario compartido.

Para hacer un uso correcto de esta optimización es necesario utilizar como enlazador dinámico predefinido, el binario ejecutable ld.gold, cuya instalación se explica en el manual de instalación de Binutils. Aunque la optimización también funciona con el normal, siempre y cuando haya sido compilado con soporte de plugins, pero es menos efectiva.
Preguntas y Respuestas sobre las optimizaciones LTO
¿En qué consiste la aplicación de las optimizaciones LTO?
LTO son las siglas del inglés Link Time Optimization, en español comprensible y extendido, optimización del tiempo de enlazado en un proceso de compilación de binarios ejecutables. Cuando se produce el proceso de crear un archivo binario ejecutable, con los correspondiente archivos objeto, el compilador vuelca en el disco la representación interna (GIMPLE) del programa compilado en secciones especiales, tratando un conjunto de archivos objeto (*.o), requerido para crear el ejecutable, como si fuera un único archivo objeto, y aplicando la correspondiente optimización al mismo. Esto conlleva una considerable reducción del tamaño final del binario ejecutable compilado, que es básicamente la principal cualidad de esta optimización, cuando se utiliza sin el parámetro -fuse-linker-plugin.
¿Por qué tengo que utilizar el enlazador dinámico ld.gold?
Porque es más potente (multihilo) y rápido que el tradicional ld, para realizar este tipo de tareas. Además, con el uso del enlazador dinámico ld.gold y el parámetro -fuse-linker-plugin, permitimos a GCC poder extraer también archivos objeto (*.o) con GIMPLE, de las librerías de ejecución que intervienen en el proceso de enlazado, ampliando el código a optimizar y aumentando la calidad del ejecutable generado. 
¿Por qué cuando compilo un programa con optimizaciones LTO me muestra los siguientes mensajes de aviso?
BFD: obt/obt_libobt_la-display.o: plugin needed to handle lto object
BFD: obt/obt_libobt_la-keyboard.o: plugin needed to handle lto object
A partir de la versión 2.25 de Binutils se ha introducido un mensaje de aviso, que nos indica cuándo en un proceso de compilación con optimizaciones LTO y generación añadida de librerías estáticas, los programas ar, ranlib y nm del paquete de Binutils no cargan correctamente el plugin proporcionado por GCC para este cometido, requerido para que estos programas puedan manejar archivos objeto con código LTO.

Para solventar este problema, GCC desde la versión 4.7, proporciona unos ejecutables intermedios (gcc-ar, gcc-ranlib y gcc-nm) que se encargan de enviar los correspondientes parámetros de ubicación del plugin, a estos programas. Pero claro, para que estos ejecutables puedan intervenir en el proceso de compilación, tendremos que establecer las correspondientes variables de entorno AR, RANLIB y NM. Variables de entorno, que no todos los paquetes permiten cambiar al vuelo, sobre todo la primera, obligándonos a tener que modificar posteriormente los correspondientes archivos Makefile de turno. Las variables de entorno a establecer nos quedarían así:
$ export AR=gcc-ar; export RANLIB=gcc-ranlib; export NM=gcc-nm
Si la versión de GCC a utilizar es una diferente a la principal que tengamos en el sistema, o en el caso particular de este manual, fuera otra de las versiones tratadas en el mismo, las variables de entorno nos quedarían así, Un ejemplo con GCC 4.9.
$ export AR=gcc-ar49; export RANLIB=gcc-ranlib49; export NM=gcc-nm49
Si por ejemplo, utilizamos esto con Fluxbox, la variable AR permanece inalterable porque en el archivo Makefile.in, el archivo base de configuración tomado para crear el archivo Makefile correspondiente, viene de forma fija el programa a utilizar, es decir, el comando ar de Binutils. Esto lo solucionamos de forma rápida añadiendo una interrogación delante del término AR, cómo se ve en el ejemplo siguiente:
AR? = ar
¿Por qué cuando compilo un programa o librería que incluye librerías estáticas, con optimizaciones LTO, y lo instalo con el comando 'make install-strip', me muestra los siguientes mensajes de aviso?
libtool: install: strip --strip-debug /usr/local/lib/libtorrent-rasterbar.a
BFD: /usr/local/lib/stBfRbEY/web_connection_base.o: plugin needed to handle lto object
BFD: /usr/local/lib/stBfRbEY/alert.o: plugin needed to handle lto object
BFD: /usr/local/lib/stBfRbEY/allocator.o: plugin needed to handle lto object
BFD: /usr/local/lib/stBfRbEY/asio.o: plugin needed to handle lto object
El programa strip de Binutils, no está diseñado para poder eliminar símbolos de depuración en librerías estáticas que contengan archivos objeto con código LTO, es decir, no soporta la carga de plugins. La única solución posible a esto, si queremos eliminar dichos símbolos, porque el archivo es relativamente grande, pasa por realizar una segunda compilación del paquete sin las optimizaciones LTO activadas y con el parámetro --disable-shared, para que sólo compile las librerías estáticas. Pero existe un problema importante: si hacemos una segunda compilación del paquete, sólo en modo estático, la instalación del mismo también será en modo estático, sobreescribiendo los archivos de información (*.la) y (*.pc) que utilizan otros paquetes para saber qué tipo de librerías (compartidas o estáticas) están instaladas en nuestro sistema.

Aunque tengamos instaladas las librerías compartidas, éstas no aparecerán en los archivos de información pertinentes, y por lo tanto, las compilaciones en las que intervengan estas dependencias, la integración de los mismas, siempre será estática, aumentando de forma considerable el tamaño del binario ejecutable generado.

Así que el único método posible, es la instalación manual de las librerías estáticas, sin ejecutar el comando 'make install-strip'. A continuación pongo un ejemplo de proceso de configuración e instalación con el paquete de Libtorrent-rasterbar, en lo que concierne a la instalación manual en modo estático.
$ ./configure --disable-dependency-tracking --disable-shared
$ make
$ su
# install -sm644 src/.libs/libtorrent-rasterbar.a /usr/local/lib
# ranlib /usr/local/lib/libtorrent-rasterbar.a
Hacer sólo esto en procesos de compilación, con librerías estáticas relativamente grandes. Con archivos pequeños no merece la pena alargar el proceso de compilación del paquete, para obtener una reducción de tamaño ridícula.

Tener en cuenta que por norma general, las librerías estáticas que contienen código LTO, ocupan mucho más espacio que las normales. En el caso particular del ejemplo de libtorrent-rasterbar.a, el aumento es de 40 MB más de tamaño, respecto a la compilada de forma normal. Hasta que el programa strip no sea modificado para poder manejar código LTO, esto representa un problema añadido en el uso de estas optimizaciones.
OpenMP
-ftree-parallelize-loops=2 OpenMP es una API de programación creada única y exclusivamente para aprovechar la potencia de los procesadores multinúcleo, si el nuestro no lo es, no es necesario seguir leyendo esto. Esta optimización sólo es operativa en aquellos paquetes de código fuente que están previamente preparados para utilizarla, ImageMagick, Blender, Inkscape, etc.

El script de configuración comprueba si el compilador soporta el parámetro -fopemp y lo activa por defecto, con lo que nosotros sólo necesitamos añadir de forma opcional el parámetro -ftree-parallelize-loops=2, cambiando el número 2 por el número de núcleos que tenga nuestro procesador.

El uso de esta optimización requiere, si utilizamos una versión de GCC diferente a la principal del sistema, que el binario resultante de la compilación se enlace contra la librería libgomp de la versión de GCC con la que hemos compilado el paquete. Un ejemplo de variable de entorno a utilizar:

$ export LDFLAGS+=' -Wl,-rpath,/opt/gcc7/lib -lgomp'
PGO
-fprofile-generate=ruta a directorio

-fprofile-use=ruta a directorio
PGO son las siglas con las que se conoce a la optimización Profile Guided Optimization (Optimización Guiada por Perfiles). El compilador recopila información del total de funciones y bloques de datos que contiene el binario ejecutable, tanto en el proceso de compilación como en una posterior ejecución del mismo. Dichos datos serán utilizados en un segundo proceso de compilación, pudiendo utilizarlos en posteriores procesos de compilación, siempre y cuando, el código fuente no sea alterado de forma significativa.

A diferencia de las otras optimizaciones explicadas en este manual, ésta requiere de un proceso más elaborado para su aplicación, que explico a continuación:

1) Creamos un directorio de ubicación de los perfiles de optimización guiada con permisos de escritura para todos los usuarios.

$ su
# mkdir -p /var/pgo
# chmod 777 /var/pgo

2) Establecemos la variable de entorno de generación del perfil de optimización con la ruta del directorio de perfiles de optimización que hemos creado, más el nombre del paquete que vamos a compilar, por ejemplo, mc.

$ export {C,CXX}FLAGS+=' -fprofile-generate=/var/pgo/mc

3) Ejecutamos el script de configuración pertinente y compilamos el paquete. Cuando el programa esté en ejecución, realizar las acciones más habituales con el mismo (abrir ventanas, desplegar menús, etc), para que esta información sea recogida en el perfil creado.

4) Volvemos a recompilar el paquete. Tenemos dos opciones, una es empezar de cero con las variables de entorno y añadir la siguiente, volviendo a ejecutar el script de configuración, después de haber limpiado el directorio de compilación con el comando make distclean o make clean según esté configurado:

$ export {C,CXX}FLAGS+=' -fprofile-use=/var/pgo/mc

La otra más rápida consiste en modificar los archivos Makefile de forma masiva, modificando el parámetro aplicado, con el siguiente comando:

$ find . -name 'Makefile' | xargs sed -i 's:fprofile-generate:fprofile-use:g'

Una vez los hayamos modificado, ejecutamos make clean; make y volvemos a instalar el paquete. El perfil de optimización creado lo podemos cargar de forma directa en la siguiente compilación, siempre y cuando el código fuente no haya sido alterado de forma significativa. Ya se encargará el compilador de avisarnos de esto.

$ export {C,CXX}FLAGS+=' -fprofile-use=/var/pgo/mc

Para acelerar todo esto, siempre es bueno crearse unas funciones de Bash. Abrimos con un editor de texto, el archivo ~/.bashrc, si no existe lo creamos y añadimos lo siguiente al final del mismo:

optgcc-gpgo () { dir="$1"; export {C,CXX}FLAGS+=" -fprofile-generate=/var/pgo/$dir"; }

optgcc-upgo () { dir="$1"; export {C,CXX}FLAGS+=" -fprofile-use=/var/pgo/$dir"; }


Guardamos el archivo, abrimos una ventana de terminal, y ahora simplemente basta ejecutar el alias correspondiente para añadir la variable de entorno de esta optimización más el nombre del directorio que definamos para ubicar los datos del perfil.

Primer proceso de compilación
$ optgcc-gpgo mc

Segundo proceso de compilación
$ optgcc-upgo mc

Por último, es harto recomendable utilizar Ccache, para que esta optimización, aplicada en un principio, no se convierta en un tedioso proceso.

Para añadirlas a las variables de entorno de optimización de CPU que hayamos establecido, basta ejecutar los comandos siguientes:

Graphite
$ export {C,CXX}FLAGS+=' -floop-interchange -ftree-loop-distribution -floop-strip-mine -floop-block'

LTO
$ export {C,CXX}FLAGS+=' -fuse-linker-plugin -flto'

OpenMP (sólo en aquellos paquetes en los que se active por defecto el parámetro -fopenmp)
$ export {C,CXX}FLAGS+=' -ftree-parallelize-loops=2'

Donde pone 2 se indica el número de núcleos de nuestro procesador, si sólo tiene uno, no utilizar esta optimización. 



Instalar GCC 6.4.0

Instalación

Dependencias

Herramientas de Compilación


Entre paréntesis la versión con la que se ha compilado GCC 6.4.0 para la elaboración de este documento.

* GCC - (7.1.0)
* Gawk - (4.1.4)
* M4 - (1.4.18)
* Libtool - (2.4.6)
* Make - (4.2.1)
* Bison - (3.0.4)
* Flex - (2.6.4)
* Automake - (1.15)
* Autoconf - (2.69)
* Gettext - (0.19.8.1)
* Gperf - (3.1)
* Texinfo - (6.4)

Librerías de Desarrollo

* Gmp - (6.1.2)
* Mpfr - (3.1.5)
* Mpc - (1.0.3)
* ISL - (0.16.1)
* GTK+ - (2.24.31)
* Libart - (2.3.17)



Descarga

gcc-6.4.0.tar.xz  |  ecj-4.9.jar

Extracción y Configuración  Bloc de Notas Información general sobre el uso de los comandos

$ tar Jxvf gcc-6.4.0.tar.xz
$ cp ecj-4.9.jar gcc-6.4.0/ecj.jar
$ mkdir gcc-build_6.4.0
$ cd gcc-build_6.4.0
$ ../gcc-6.4.0/configure --enable-shared --enable-threads=posix --enable-__cxa_atexit \
--enable-clocale=gnu --enable-languages=fortran,java,objc --enable-java-awt=gtk \
--prefix=/opt/gcc6 --program-suffix=6


Explicación de los comandos

cp ecj-4.9.jar gcc-6.4.0/ecj.jar : Copiamos el archivo jar que contiene el compilador Java de Eclipse al directorio raíz del código fuente de GCC. Dicho compilador es utilizado por GCJ para analizar los archivos de código fuente escritos en Java. En el proceso de instalación, dicho archivo será ubicado en /opt/gcc6/share/java/ecj.jar, y GCJ lo utilizará a través de un ejecutable binario ubicado en la ruta /opt/gcc6/libexec/gcc/i686-pc-linux-gnu/6.4.0/ecj1.

mkdir gcc-build_6.4.0
: Creamos un directorio de compilación, ya que GCC no permite que se compile directamente en el directorio de las fuentes.
--enable-shared : Compila las librerías compartidas.
--enable-threads=posix : Selecciona la librería genérica POSIX/Unix98 para el soporte de hilos.
--enable-__cxa_atexit : Opción necesaria para una correcta compilación de c++.
--enable-clocale=gnu : Evita un error en la generación de las locales, en el caso de que estén incompletas.
--enable-languages=fortran,java,objc : Compila los lenguajes de programación Fortran, Java, y Objetive C, además de los predefinidos, C y C++.
--enable-java-awt=gtk : Añade el soporte de AWT con GTK+ como librería de interfaz gráfica a Libgcj.
--prefix=/opt/gcc6 : Instala el compilador en /opt/gcc6.

--program-suffix=6 : Añadimos un sufijo a los binarios ejecutables instalados para poder diferenciarlos de otras versiones de GCC que tengamos instaladas en nuestro sistema, empezando por la principal del mismo.

Parámetros de configuración opcionales

--disable-bootstrap : Si por la razón que sea, tenemos que volver a recompilar el paquete, utilizando el mismo compilador de la versión que vamos a instalar, añadiendo esta opción evitaremos que los lenguajes C y C++ se recompilen a sí mismos, y anularemos el proceso predefinido de compilación en tres fases. Si la versión utilizada es de la misma serie, como es en este caso en el manual, también se puede utilizar esta opción. Realizar antes una copia de seguridad de la versión instalada, porque la instalación de la nueva versión sobreescribirá los archivos de la misma.

--with-default-libstdcxx-abi=gcc4-compatible : Añadiendo esta opción, evitamos tener que añadir la macro -D_GLIBCXX_USE_CXX11_ABI=0 a la variable de entorno CXXFLAGS, para poder compilar código escrito en C++ de forma indistinta con GCC 5 y superiores, o Clang, compatibilidad que se rompió a partir de la versión 5 de GCC, al introducir una nueva ABI en Libstdc++. El parche no oficial existente, ha sido aceptado por los programadores de Clang, para la versión 3.9.0, pero dado lo experimental del mismo, es muy recomendable seguir utilizando esta opción.

Compilación

$ make

Parámetros de compilación opcionales  

-j2 : Si tenemos un procesador de doble núcleo (dual-core), y el kernel está optimizado para el mismo y es SMP, con este parámetro aumentaremos el número de procesos de compilación simultáneos a un nivel de 2 y aceleraremos el tiempo de compilación del programa de forma considerable.
-j4 : Lo mismo que arriba pero con procesadores de 4 núcleos (quad-core).

Instalación como root

$ su -c "make install-strip"

Borrar las locales adicionales instaladas

$ su
# for i in be ca da de el eo fi fr hr id ja nl pt_BR ru sr sv tr tk uk vi zh_CN zh_TW ; do \
rm -rf /opt/gcc6/share/locale/$i &> /dev/null ; \
done

Estadísticas de Compilación e Instalación de GCC 6.4.0

Estadísticas de Compilación e Instalación de GCC 6.4.0
CPU AMD Athlon(tm) II X2 260 Processor
MHz 3214.610
RAM 2048 MB
Sistema de archivos XFS
Versión de Glibc 2.25
Enlazador dinámico GNU gold (Binutils 2.28) 1.14
Compilador GCC 7.1.0 + Ccache 3.3.4
Parámetros de compilación -j2
Ocupación de espacio en disco del proceso de compilación 4,2 GB
Tiempo de compilación 1h 54' 26"
Archivos instalados 5.204
Mostrar/Ocultar la lista de archivos instalados
Enlaces simbólicos creados 39
Mostrar/Ocultar la lista de enlaces simbólicos creados
Ocupación de espacio en disco 259,6 MB

Desinstalación como root

1) MODO TRADICIONAL

En el directorio de compilación ejecutamos el siguiente comando:

$ su -c "make uninstall"

2) MODO MANUALINUX

El principal inconveniente del comando anterior es que tenemos que tener el directorio de compilación en nuestro sistema para poder desinstalar el programa. En algunos casos esto supone muchos megas de espacio en disco. Con el paquete de scripts que pongo a continuación logramos evitar el único inconveniente que tiene la compilación de programas, y es el tema de la desinstalación de los mismos sin la necesidad de tener obligatoriamente una copia de las fuentes compiladas.

gcc-6.4.0-scripts.tar.gz

$ su
# tar zxvf gcc-6.4.0-scripts.tar.gz
# cd gcc-6.4.0-scripts
# ./Desinstalar_gcc-6.4.0

La desinstalación del compilador no incluye las librerías compartidas (.so) para evitar problemas de dependencias en el caso de que hayamos compilado algún programa con esta versión de GCC.

Copia de Seguridad como root

Con este otro script creamos una copia de seguridad de los binarios compilados, recreando la estructura de directorios de los mismos en un directorio de copias de seguridad (copibin) que se crea en el directorio /var. Cuando se haya creado el paquete comprimido de los binarios podemos copiarlo como usuario a nuestro home y borrar el que ha creado el script de respaldo, teniendo en cuenta que si queremos volver a restaurar la copia, tendremos que volver a copiarlo al lugar donde se ha creado.

$ su
# tar zxvf gcc-6.4.0-scripts.tar.gz
# cd gcc-6.4.0-scripts
# ./Respaldar_gcc-6.4.0

Restaurar la Copia de Seguridad como root

Y con este otro script (que se copia de forma automática cuando creamos la copia de respaldo del programa) restauramos la copia de seguridad como root cuando resulte necesario.

$ su
# cd /var/copibin/restaurar_copias
# ./Restaurar_gcc-6.4.0

Soporte de optimizaciones para nuevos procesadores en GCC 6

En GCC 6 se añade soporte de optimizaciones para los siguientes procesadores:

Procesadores Parámetros de optimización
Intel
Intel Quark Lakemont MCU, basado en el procesador Intel Pentium. -march=lakemont -mtune=lakemont
Intel Skylake con soporte de instrucciones MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, AVX, AVX2, AES, PCLMUL, FSGSBASE, RDRND, FMA, BMI, BMI2, F16C, RDSEED, ADCX, PREFETCHW, CLFLUSHOPT, XSAVEC, XSAVES y extensiones 64-bit. -march=skylake -mtune=skylake
Intel Skylake Server con soporte de instrucciones MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, AVX, AVX2, AES, PCLMUL, FSGSBASE, RDRND, FMA, BMI, BMI2, F16C, RDSEED, ADCX, PREFETCHW, CLFLUSHOPT, XSAVEC, XSAVES, AVX512F, AVX512VL, AVX512BW, AVX512DQ, AVX512CD y extensiones 64-bit. -march=skylake-avx512 -mtune=skylake-avx512
AMD
Procesadores basados en AMD Family 17h core con soporte de instrucciones x86-64 (BMI, BMI2, F16C, FMA, FSGSBASE, AVX, AVX2, ADCX, RDSEED, MWAITX, SHA, CLZERO, AES, PCL_MUL, CX16, MOVBE, MMX, SSE, SSE2, SSE3, SSE4A, SSSE3, SSE4.1, SSE4.2, ABM, XSAVEC, XSAVES, CLFLUSHOPT, POPCNT y extensiones 64-bit). -march=znver1 -mtune=znver1



Configurar el sistema para el uso de GCC 6.4.0

1) /etc/ld.so.conf

Añadimos la ruta a las librerías en el archivo /etc/ld.so.conf.

include ld.so.conf.d/*.conf
/usr/X11R6/lib
/usr/lib
/usr/lib/qt3/lib
/usr/local/lib
/opt/e17/lib
/opt/gcc7/lib
/opt/gcc6/lib


Cuando lo hayamos editado y guardado ejecutamos la actualización de la caché de las librerías compartidas.

$ su -c "ldconfig -v"

2) Añadir la ruta a los binarios y las páginas de manual a nuestro PATH

2a) Variable de entorno PATH de usuario

Editamos el archivo de nuestro home, ~/.bashrc (si no existe lo creamos) y añadimos lo siguiente al final del mismo.

export PATH=/opt/gcc6/bin:$PATH
export MANPATH=/opt/gcc6/share/man:$MANPATH


Si estamos siguiendo el manual lo añadimos a la variable de entorno anterior.

export PATH=/opt/gcc7/bin:/opt/gcc6/bin:$PATH
export MANPATH=/opt/gcc7/share/man:/opt/gcc6/share/man:$MANPATH

2b) Variable de entorno PATH del sistema

Si queremos establecer una variable de entorno global del sistema, abrimos un editor de texto y añadimos lo siguiente.

#!/bin/sh

export PATH=/opt/gcc6/bin:$PATH
export MANPATH=/opt/gcc6/share/man:$MANPATH


Si estamos siguiendo el manual lo añadimos a la variable de entorno anterior.

#!/bin/sh

export PATH=/opt/gcc7/bin:/opt/gcc6/bin:$PATH
export MANPATH=/opt/gcc7/share/man:/opt/gcc6/share/man:$MANPATH

Lo guardamos con el nombre gcc.sh, y lo instalamos en /etc/profile.d.

$ su -c "install -m755 gcc.sh /etc/profile.d"

Tenemos que cerrar el emulador de terminal y volverlo a abrir para que la variable de entorno aplicada sea efectiva. Es conveniente guardar una copia de este script para posteriores instalaciones de nuestro sistema. La ventaja de utilizar el directorio /etc/profile.d es que es común a todas las distribuciones y nos evita tener que editar otros archivos del sistema como por ejemplo, /etc/profile.

2c) Lectura de las páginas de manual

$ man gcc6
$ man gfortran6
$ man gcj6

3) Uso de GCC 6.4.0

Esto está ampliamente explicado en este apartado, sólo cambia el número del sufijo de la versión a utilizar.

$ export CC=gcc6; export CXX=g++6; export {FC,F90,F95,F77}=gfortran6

En cuanto a la creación de los alias de Bash para facilitar la ejecución de las variables. Abrimos con un editor de texto, el archivo de configuración personal, ~/.bashrc, si no existe lo creamos, y añadimos lo siguiente al final del contenido del mismo:

alias envgcc6="export CC=gcc6; export CXX=g++6; export {FC,F90,F95,F77}=gfortran6"

Para el caso específico que ya explico más arriba de uso de compilador Fortran con las GNU Autotools, añadimos lo siguiente:

alias envgfortran6="mkdir -p /tmp/bin; ln -sf /opt/gcc6/bin/gfortran6 /tmp/bin/gfortran; export PATH=/tmp/bin:$PATH"
alias ungfortran6="PATH=`echo $PATH | sed -e 's:/tmp/bin::'`; rm -rf /tmp/bin"

Y si queremos añadir también alias para las variables de entorno LDFLAGS para establecer el RPATH correspondiente, en compilación de código escrito en C++, Fortran, y compatible con OpenMP, nos quedaría así:

alias lstdc++6="export LDFLAGS+=" -Wl,-rpath,/opt/gcc6/lib -lstdc++"
alias lgfortran6="export LDFLAGS+=" -Wl,-rpath,/opt/gcc6/lib -lgfortran"
alias lgomp6="export LDFLAGS+=" -Wl,-rpath,/opt/gcc6/lib -lgomp"



Instalar GCC 5.4.0

Instalación

Dependencias

Herramientas de Compilación


Entre paréntesis la versión con la que se ha compilado GCC 5.4.0 para la elaboración de este documento.

* GCC - (7.1.0)
* Gawk - (4.1.4)
* M4 - (1.4.18)
* Libtool - (2.4.6)
* Make - (4.2.1)
* Bison - (3.0.4)
* Flex - (2.6.4)
* Automake - (1.15)
* Autoconf - (2.69)
* Gettext - (0.19.8.1)
* Gperf - (3.1)
* Texinfo - (6.3)

Librerías de Desarrollo

* Gmp - (6.1.2)
* Mpfr - (3.1.5)
* Mpc - (1.0.3)
* ISL - (0.16.1)
* GTK+ - (2.24.31)
* Libart - (2.3.17)



Descarga

gcc-5.4.0.tar.bz2  |  ecj-4.9.jar

Extracción y Configuración  Bloc de Notas Información general sobre el uso de los comandos

$ tar jxvf gcc-5.4.0.tar.bz2
$ cp ecj-4.9.jar gcc-5.4.0/ecj.jar
$ mkdir gcc-build_5.4.0
$ cd gcc-build_5.4.0
$ ../gcc-5.4.0/configure --enable-shared --enable-threads=posix --enable-__cxa_atexit \
--enable-clocale=gnu --enable-languages=fortran,java,objc --enable-java-awt=gtk \
--prefix=/opt/gcc5 --program-suffix=5


Explicación de los comandos

cp ecj-4.9.jar gcc-5.4.0/ecj.jar : Copiamos el archivo jar que contiene el compilador Java de Eclipse al directorio raíz del código fuente de GCC. Dicho compilador es utilizado por GCJ para analizar los archivos de código fuente escritos en Java. En el proceso de instalación, dicho archivo será ubicado en /opt/gcc5/share/java/ecj.jar, y GCJ lo utilizará a través de un ejecutable binario ubicado en la ruta /opt/gcc5/libexec/gcc/i686-pc-linux-gnu/5.4.0/ecj1.

mkdir gcc-build_5.4.0
: Creamos un directorio de compilación, ya que GCC no permite que se compile directamente en el directorio de las fuentes.
--enable-shared : Compila las librerías compartidas.
--enable-threads=posix : Selecciona la librería genérica POSIX/Unix98 para el soporte de hilos.
--enable-__cxa_atexit : Opción necesaria para una correcta compilación de c++.
--enable-clocale=gnu : Evita un error en la generación de las locales, en el caso de que estén incompletas.
--enable-languages=fortran,java,objc : Compila los lenguajes de programación Fortran, Java, y Objetive C, además de los predefinidos, C y C++.
--enable-java-awt=gtk : Añade el soporte de AWT con GTK+ como librería de interfaz gráfica a Libgcj.
--prefix=/opt/gcc5 : Instala el compilador en /opt/gcc5.

--program-suffix=5 : Añadimos un sufijo a los binarios ejecutables instalados para poder diferenciarlos de otras versiones de GCC que tengamos instaladas en nuestro sistema, empezando por la principal del mismo.

Parámetros de configuración opcionales

--disable-bootstrap : Si por la razón que sea, tenemos que volver a recompilar el paquete, utilizando el mismo compilador de la versión que vamos a instalar, añadiendo esta opción evitaremos que los lenguajes C y C++ se recompilen a sí mismos, y anularemos el proceso predefinido de compilación en tres fases.

--with-default-libstdcxx-abi=gcc4-compatible : Añadiendo esta opción, evitamos tener que añadir la macro -D_GLIBCXX_USE_CXX11_ABI=0 a la variable de entorno CXXFLAGS, para poder compilar código escrito en C++ de forma indistinta con GCC 5 y superiores, o Clang, compatibilidad que se rompió a partir de la versión 5 de GCC, al introducir una nueva ABI en Libstdc++. El parche no oficial existente, ha sido aceptado por los programadores de Clang, para la versión 3.9.0, pero dado lo experimental del mismo, es muy recomendable seguir utilizando esta opción.

Compilación

$ make

Parámetros de compilación opcionales

Instalación como root

$ su -c "make install-strip"

Borrar las locales adicionales instaladas

$ su
# for i in be ca da de el eo fi fr hr id ja nl pt_BR ru sr sv tr tk uk vi zh_CN zh_TW ; do \
rm -rf /opt/gcc5/share/locale/$i &> /dev/null ; \
done

Estadísticas de Compilación e Instalación de GCC 5.4.0

Estadísticas de Compilación e Instalación de GCC 5.4.0
CPU AMD Athlon(tm) II X2 260 Processor
MHz 3214.610
RAM 2048 MB
Sistema de archivos XFS
Versión de Glibc 2.25
Enlazador dinámico GNU gold (Binutils 2.28) 1.14
Compilador GCC 7.1.0 + Ccache 3.3.4
Parámetros de compilación -j2
Ocupación de espacio en disco del proceso de compilación 3,6 GB
Tiempo de compilación 1h 51' 38"
Archivos instalados 5.152
Mostrar/Ocultar la lista de archivos instalados
Enlaces simbólicos creados 40
Mostrar/Ocultar la lista de enlaces simbólicos creados
Ocupación de espacio en disco 239,9 MB

Desinstalación como root

1) MODO TRADICIONAL

En el directorio de compilación ejecutamos el siguiente comando:

$ su -c "make uninstall"

2) MODO MANUALINUX

gcc-5.4.0-scripts.tar.gz

$ su
# tar zxvf gcc-5.4.0-scripts.tar.gz
# cd gcc-5.4.0-scripts
# ./Desinstalar_gcc-5.4.0

La desinstalación del compilador no incluye las librerías compartidas (.so) para evitar problemas de dependencias en el caso de que hayamos compilado algún programa con esta versión de GCC.

Copia de Seguridad como root

$ su
# tar zxvf gcc-5.4.0-scripts.tar.gz
# cd gcc-5.4.0-scripts
# ./Respaldar_gcc-5.4.0

Restaurar la Copia de Seguridad como root

$ su
# cd /var/copibin/restaurar_copias
# ./Restaurar_gcc-5.4.0

Soporte de optimizaciones para nuevos procesadores en GCC 5

En GCC 5 se añade soporte de optimizaciones para los siguientes procesadores:

Procesadores Parámetros de optimización
Intel
Intel Knights Landing con soporte de instrucciones MOVBE, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, AVX, AVX2, AES, PCLMUL, FSGSBASE, RDRND, FMA, BMI, BMI2, F16C, RDSEED, ADCX, PREFETCHW, AVX512F, AVX512PF, AVX512ER y extensiones 64-bit. -march=knl -mtune=knl



Configurar el sistema para el uso de GCC 5.4.0

1) /etc/ld.so.conf

Añadimos la ruta a las librerías en el archivo /etc/ld.so.conf.

include ld.so.conf.d/*.conf
/usr/X11R6/lib
/usr/lib
/usr/lib/qt3/lib
/usr/local/lib
/opt/e17/lib
/opt/gcc7/lib
/opt/gcc6/lib
/opt/gcc5/lib


Cuando lo hayamos editado y guardado ejecutamos la actualización de la caché de las librerías compartidas.

$ su -c "ldconfig -v"

2) Añadir la ruta a los binarios y las páginas de manual a nuestro PATH

2a) Variable de entorno PATH de usuario

Editamos el archivo de nuestro home, ~/.bashrc (si no existe lo creamos) y añadimos lo siguiente al final del mismo.

export PATH=/opt/gcc5/bin:$PATH
export MANPATH=/opt/gcc5/share/man:$MANPATH


Si estamos siguiendo el manual lo añadimos a la variable de entorno anterior.

export PATH=/opt/gcc7/bin:/opt/gcc6/bin:/opt/gcc5/bin:$PATH
export MANPATH=/opt/gcc7/share/man:/opt/gcc6/share/man:/opt/gcc5/share/man:$MANPATH

2b) Variable de entorno PATH del sistema

Si queremos establecer una variable de entorno global del sistema, abrimos un editor de texto y añadimos lo siguiente.

#!/bin/sh

export PATH=/opt/gcc5/bin:$PATH
export MANPATH=/opt/gcc5/share/man:$MANPATH


Si estamos siguiendo el manual lo añadimos a la variable de entorno anterior.

#!/bin/sh

export PATH=/opt/gcc7/bin:/opt/gcc6/bin:/opt/gcc5/bin:$PATH
export MANPATH=/opt/gcc7/share/man:/opt/gcc6/share/man:/opt/gcc5/share/man:$MANPATH

Lo guardamos con el nombre gcc.sh, y lo instalamos en /etc/profile.d.

$ su -c "install -m755 gcc.sh /etc/profile.d"

Tenemos que cerrar el emulador de terminal y volverlo a abrir para que la variable de entorno aplicada sea efectiva. Es conveniente guardar una copia de este script para posteriores instalaciones de nuestro sistema. La ventaja de utilizar el directorio /etc/profile.d es que es común a todas las distribuciones y nos evita tener que editar otros archivos del sistema como por ejemplo, /etc/profile.

2c) Lectura de las páginas de manual

$ man gcc5
$ man gfortran5
$ man gcj5

3) Uso de GCC 5.4.0

Esto está ampliamente explicado en este apartado, sólo cambia el número del sufijo de la versión a utilizar.

$ export CC=gcc5; export CXX=g++5; export {FC,F90,F95,F77}=gfortran5

En cuanto a la creación de los alias de Bash para facilitar la ejecución de las variables. Abrimos con un editor de texto, el archivo de configuración personal, ~/.bashrc, si no existe lo creamos, y añadimos lo siguiente al final del contenido del mismo:

alias envgcc5="export CC=gcc5; export CXX=g++5; export {FC,F90,F95,F77}=gfortran5"

Para el caso específico que ya explico más arriba de uso de compilador Fortran con las GNU Autotools, añadimos lo siguiente:

alias envgfortran5="mkdir -p /tmp/bin; ln -sf /opt/gcc5/bin/gfortran5 /tmp/bin/gfortran; export PATH=/tmp/bin:$PATH"
alias ungfortran5="PATH=`echo $PATH | sed -e 's:/tmp/bin::'`; rm -rf /tmp/bin"

Y si queremos añadir también alias para las variables de entorno LDFLAGS para establecer el RPATH correspondiente, en compilación de código escrito en C++, Fortran, y compatible con OpenMP, nos quedaría así:

alias lstdc++5="export LDFLAGS+=" -Wl,-rpath,/opt/gcc5/lib -lstdc++"
alias lgfortran5="export LDFLAGS+=" -Wl,-rpath,/opt/gcc5/lib -lgfortran"
alias lgomp5="export LDFLAGS+=" -Wl,-rpath,/opt/gcc5/lib -lgomp"




Foro Galería Blog


Página - 1Página - 2Página - 3Página - 4

Actualizado el 14-08-2017

Instalar GCC desde cero

Instalar Dependencias para GCCInstalar Java en GNU/Linux