Optimización de la compilación

TÍTULO:				Optimización de la compilación
VERSIÓN LFS:		Cualquiera
AUTOR:				Gerard Beekmans <gerard@linuxfromscratch.org>,
TRADUCTOR:		Proyecto LFS

SINOPSIS:
	Cómo usar las optimizaciones del compilador

RECETA:
Thomas -Balu- Walter <tw@itreff.de> es asimismo autor de esta receta, pero
debido a las restricciones en el formato se ha tenido que eliminar una de las dos
direcciones de correo en el campo AUTOR.  -SP

El origen de esta receta se encuentra en la versión 2.3.4 del libro, Capítulo 6. Lo he
modificado un poco para crear esta receta.

Muchos programas y librerías se compilan por defecto con optimización de nivel 2
(opciones -g y -O2 de gcc) y son compilados para un tipo específico de CPU. En 
plataformas Intel el software se compila por defecto para procesadores i386. Si no
deseas ejecutar el software en otras máquinas aparte de la tuya, puede que quieras
cambiar las opciones por defecto del compilador para que así se compilen con el nivel
de optimización más alto y se genere el código concreto para tu arquitectura.

Hay varias formas de cambiar las opciones de compilación. Un modo es editar cada
uno de los Makefile que se encuentren en un paquete, buscar las variables CFLAGS 
y CXXFLAGS (un paquete bien diseñado usa la variable CFLAGS para definir las 
opciones de compilación de gcc y CXXFLAGS para definir las de g++) y cambiar sus 
valores. Los paquetes como binutils, gcc, glibc y otros tienen un montón de ficheros 
Makefile en muchos subdirectorios, por lo que esto puede necesitar mucho tiempo.
En cambio, hay una forma fácil de hacerlo: crear las variables de entorno CFLAGS
y CXXFLAGS y usarlas en los Makefile. Unos cuantos paquetes no siguen esta 
convención y necesitan edición manual.

Para establecer estas variables puedes usar los siguientes comandos en bash (o en
tu .bashrc si quieres tenerlas activas siempre):

    export CFLAGS="-O3 -march=<arquitectura>" &&
    CXXFLAGS=$CFLAGS

Este es un ajuste mínimo de la optimización que seguro que funciona en casi
todas las plataformas. La opción march compilará los binarios con las instrucciones 
específicas para la CPU que especifiques. Esto significa que no puedes copiar el
binario en una CPU de clase inferior y ejecutarlo. Funcionaría de forma errática o no
funcionará en absoluto (dando errores como "Illegal Instruction, core dumped"). Debes
leer la página Info de GCC para encontrar más opciones de optimización. En las
anteriores variables de entorno debes sustituir <arquitectura> con el identificador de
CPU apropiado, como i586, i686, powerpc y otros. Sugiero que mires el manual de
gcc en http://gcc.gnu.org/onlinedocs/gcc_toc.html "Hardware Models and Configurations".

/*
 * Nota del editor
 * "Reboant" mandó una nota sobre cómo con el uso de -Os (optimización del tamaño)
 * se obtienen unos buenos resultados increíbles. Así que si prefieres tener binarios
 * de pequeño tamaño en lugar de rapidez en la ejecución, puede que quieras probarlo.
 */

Por favor, recuerda que si un paquete no compila o da errores como "segmentation
fault, core dumped" posiblemente se deba a estas optimizaciones. Prueba reduciendo
el nivel de optimización de -O3 a -O2. Si no funciona prueba -O o eliminalas por completo.
Prueba también cambiando la variable -march. Los compiladores son muy sensibles
a cierto hardware. Una mala memoria puede causar problemas de compilación cuando
se usa un alto nivel de optimización, como -O3. El hecho de que yo no tenga ningún
problema compilando todo con -O3 no significa que tú tampoco tengas problemas.
Otro problema puede ser la versión de binutils que tengas instalada en tu sistema, que
con frecuencia causa problemas compilando Glibc (notable es el caso de RedHat
porque con frecuencia usa software beta que todavía no es muy estable. "A RedHat
le gusta vivir en el lado oscuro, pero te deja a ti en la oscuridad" (Frase de alguien en la
lista de correo lfs-discuss).