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

Entornos GráficosAplicaciones

DesarrolloEmuladoresInternetJuegosMultimediaSistema

Compiladores Caché - F90cache

Compiladores Caché - Ccache




Compiladores Caché - Ccache




Copyright

Copyright © José Luis Lara Carrascal  2008-2018   http://manualinux.eu



Sumario

Introducción
Instalación
Configuración
Enlaces



 
Introducción

Ccache es un compilador caché que puede llegar a acelerar hasta 10 veces la recompilación (esto implica también una instalación de versiones futuras del programa cacheado, pero con un mayor tiempo de compilación) de cualquier programa cuyo código fuente esté escrito en C, C++, Objetive-C y Objetive-C++. La forma de trabajar de Ccache consiste en detectar si el código que se está compilando es el mismo que se ha compilado anteriormente. Para ello se sirve de los siguientes métodos:

* La información de salida del preprocesador cuando el compilador se está ejecutando con la opción -E.
* Las opciones de línea de comandos.
* El tamaño real de los archivos compilados y el tiempo de modificación.
* Toda la información de salida estándar de errores (stderr) que genera el compilador.

Por lo tanto y, que nadie piense lo contrario, en ningún momento Ccache crea una copia exacta de los binarios generados en el proceso de compilación (la caché que necesitaríamos sería enorme) sino lo que hace es almacenar toda la información que el compilador genera en dicho proceso, cuando esta información coincide con la salida del compilador en una futura recompilación, Ccache la sustituye por la que tiene almacenada en la caché, con lo que la generación de los archivos binarios se acelera considerablemente.

En este manual trataremos su instalación desde código fuente y su configuración para que todos los procesos de compilación que llevemos a cabo en nuestro sistema sean cacheados por Ccache.



Instalación

Dependencias

Herramientas de Compilación


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

* GCC - (8.2.0) o Clang - (7.0.0)
* Make - (4.2.1)
* Automake - (1.16.1)
* Autoconf - (2.69)

Librerías de Desarrollo

* Zlib - (1.2.11)



Descarga

ccache-3.5.tar.xz

Optimizaciones

$ 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:
Nota informativa sobre las optimizaciones para GCC
* 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='.
Nota informativa sobre las optimizaciones para Clang
* La opción '-mtune=' está soportada a partir de la versión 3.4 de Clang.

* Los valores de color azul no son compatibles con Clang.

* Las filas con el fondo de color amarillo son valores exclusivos de Clang, y por lo tanto, no son aplicables con GCC.
Valores CPU
Genéricos
Intel
AMD
VIA
IDT

Optimizaciones adicionales

Optimizaciones adicionales
GCC
Graphite
$ export {C,CXX}FLAGS+=' -floop-interchange -ftree-loop-distribution -floop-strip-mine -floop-block'
LTO
$ export {C,CXX}FLAGS+=' -fuse-linker-plugin -flto=2'
Donde pone 2 se indica el número de núcleos de nuestro procesador, si sólo tiene uno, utilizar el parámetro -flto

Clang
Polly
$ export {C,CXX}FLAGS+=' -O3 -mllvm -polly -mllvm -polly-vectorizer=stripmine'
LTO
$ export {C,CXX}FLAGS+=' -flto'
ThinLTO
$ export {C,CXX}FLAGS+=' -flto=thin'
La aplicación de esta optimización es alternativa a la tradicional LTO, a partir de Clang 3.9, y por lo tanto, no es combinable con la misma.

Parámetros adicionales

Parámetros adicionales de eliminación de avisos en el proceso de compilación
$ export {C,CXX}FLAGS+=' -w'

Establecer la ruta de búsqueda de directorios de librerías en sistemas de 64 bits multiarquitectura
$ export LDFLAGS+=" -L/usr/lib64 -L/usr/local/lib64"

Establecer el uso de enlazador dinámico para LLD
$ export LDFLAGS+=' -fuse-ld=lld'
Optimizaciones complementarias LTO de LLD
$ export LDFLAGS+=' -Wl,--lto-partitions=2'
Optimizaciones complementarias ThinLTO de LLD
$ export LDFLAGS+=' -Wl,--thinlto-jobs=2'
Donde pone 2 se indica el número de núcleos de nuestro procesador, si sólo tiene uno, no es necesario añadir el parámetro en cuestión.

Establecer la variable de entorno de uso de compilador para Clang
$ export {CC,CXX}=clang

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

$ tar Jxvf ccache-3.5.tar.xz
$ cd ccache-3.5
$ ./configure --prefix=/usr --mandir=/usr/share/man --sysconfdir=/etc

Explicación de los comandos

--prefix=/usr : Instala Ccache en el directorio principal /usr.
--mandir=/usr/share/man : Instala la página de manual del programa en /usr/share/man, en lugar de /usr/man.

--sysconfdir=/etc
: Establecemos el directorio /etc en lugar de /usr/etc, como directorio de ubicación secundaria del archivo de configuración, ccache.conf. El directorio de ubicación primaria es siempre el directorio de ubicación de la caché.

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
# make install
# ln -s /usr/bin/ccache /bin/gcc
# ln -s /usr/bin/ccache /bin/g++
# ln -s /usr/bin/ccache /bin/cc
# ln -s /usr/bin/ccache /bin/c++

Con la creación de los enlaces simbólicos lo que hacemos es que Ccache gestione todas las compilaciones que vayamos a realizar en nuestro sistema, utilizamos el directorio /bin, porque éste siempre aparece por delante del directorio /usr/bin en la configuración del PATH en los sistemas GNU/Linux, directorio éste último, que es el habitual de ubicación de los ejecutables de la versión de GCC que tengamos en nuestro sistema.

Para comprobar que estamos utilizando estos enlaces simbólicos, nada mejor que utilizar el programa which, que se encarga de buscar el binario que le indiquemos previamente. Por último recordar que la ejecución de Ccache es completamente transparente en los procesos de compilación, es decir, no vamos a notar que se está ejecutando cuando compilemos un programa, la única manera de saberlo es comprobar con cualquier administrador de archivos que el directorio de la caché, tiene actividad.

[jose@localhost ~]$ which gcc
/bin/gcc

Estadísticas de Compilación e Instalación de Ccache

Estadísticas de Compilación e Instalación de Ccache
CPU AMD Phenom(tm) II X4 965 Processor
MHz 3415.709
RAM 4096 MB
Sistema de archivos XFS
Versión del Kernel 4.18.16-ck1 SMP PREEMPT x86_64
Modo de frecuencia de la CPU ondemand
Versión de Glibc 2.28
Enlazador dinámico LLD 7.0.0
Compilador Clang 7.0.0
Parámetros de optimización -03 -march=amdfam10 -mtune=amdfam10 -mllvm -polly -mllvm -polly-vectorizer=stripmine -flto=thin
Parámetros de compilación -j4
Tiempo de compilación 3"
Archivos instalados 2
Mostrar/Ocultar la lista de archivos instalados
Enlaces simbólicos creados 4
Mostrar/Ocultar la lista de enlaces simbólicos creados
Ocupación de espacio en disco 252 KB

Desinstalación como root

1) MODO TRADICIONAL

Este programa no tiene soporte para desinstalación con el comando '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.

ccache-3.5-scripts.tar.gz

$ su
# tar zxvf ccache-3.5-scripts.tar.gz
# cd ccache-3.5-scripts
# ./Desinstalar_ccache-3.5

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 ccache-3.5-scripts.tar.gz
# cd ccache-3.5-scripts
# ./Respaldar_ccache-3.5

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_ccache-3.5



Configuración de Ccache  

1) El directorio por defecto de ubicación de la caché

~/.ccache

Tanto en nuestro directorio personal, como en el directorio del root, el tamaño máximo definido por defecto de la caché es de 5 GB, tamaño que podemos modificar desde la línea de comandos, con el siguiente comando, un ejemplo estableciéndola en 500 MB.

[jose@localhost ~]$ ccache -M 500M
Set cache size limit to 512000k

También podemos utilizar G (para GB) y K (para KB), otro ejemplo, esta vez la pongo en 2 GB.

[jose@localhost ~]$ ccache -M 2G
Set cache size limit to 2097152k

2) Establecer un directorio único de caché para todos los usuarios

La única condición que debe de tener este directorio es que sea accesible para lectura y escritura por todos los usuarios. La ventaja mayor es que nos ahorramos una duplicación de directorios, el del root y el nuestro propio. Lo primero que debemos de hacer es crear el directorio con los permisos correspondiente de acceso y escritura.

$ su -c "install -dm777 /.ccache"

Luego, movemos como usuario, el contenido de la caché ubicada en nuestro directorio personal, al nuevo directorio.

$ mv ~/.ccache/* /.ccache

La que tengamos en el directorio del root, que siempre será de menor tamaño, simplemente la borramos.

$ su -c "ccache -C"

Posteriormente, abrimos un editor de texto y añadimos lo siguiente:

#!/bin/sh

export CCACHE_DIR=/.ccache

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

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

Tenemos que cerrar el emulador de terminal y volverlo a abrir para que la variable de entorno aplicada sea efectiva. 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.

3) Limpiar la caché

 Para ajustar el tamaño de la caché al máximo establecido en su configuración, ejecutamos el siguiente comando, aunque esto no es necesario hacerlo ya que el programa lo hace de forma automática.

$ ccache -c

Para borrarla por completo, el siguiente:

$ ccache -C

4) Estadísticas de uso

Como cualquier aplicación caché que se precie, Ccache también nos muestra estadísticas de uso, con el siguiente comando:

$ ccache -s

Y yo en estos momentos las tengo así,

[jose@localhost scripts]$ ccache -s
cache directory                     /mnt/mageia/.ccache
primary config                      /mnt/mageia/.ccache/ccache.conf
secondary config      (readonly)    /etc/ccache.conf
cache hit (direct)                222614
cache hit (preprocessed)          234643
cache miss                        944564
cache hit rate                     32.62 %
called for link                   257395
called for preprocessing          132487
multiple source files                147
compiler produced stdout              10
compiler produced empty output        24
compile failed                     28357
ccache internal error                  4
preprocessor error                 20647
can't use precompiled header       75981
couldn't find the compiler             3
bad compiler arguments             21389
unsupported source language          143
autoconf compile/link             163700
unsupported compiler option         4830
unsupported code directive           380
output to stdout                      45
no input file                      74406
cleanups performed                  1102
files in cache                    209333
cache size                           4.8 GB
max cache size                       5.0 GB

Lo único que nos debe de interesar de todo esto, son los dos últimos datos, cache size, que nos indica el espacio que está ocupando en estos momentos, y max cache size, que nos indica el tamaño máximo que tenemos configurado. Para poner a cero las estadísticas, ejecutamos el siguiente comando:

$ ccache -z

5) Uso de otras versiones de GCC con Ccache

Además de leernos el correspondiente manual acerca de la instalación de otras versiones de GCC en nuestro sistema, la forma de hacer funcionar Ccache con otras versiones de GCC es muy simple, ejecutando la correspodiente variable de entorno, un ejemplo:

$ export CCACHE_COMPILER=gcc34

Ahora ejecutamos gcc --version y comprobamos que nos sale la versión que le hemos pasado mediante la variable de entorno anteriormente ejecutada.

[jose@localhost ~]$ gcc --version
gcc34 (GCC) 3.4.6
Copyright (C) 2006 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

Tener en cuenta que el nombre del ejecutable del compilador (en este caso gcc34) no aparecerá nunca en los mensajes que se muestren en el proceso de compilación, ya que estamos utilizando como puente a Ccache y los pertinentes enlaces simbólicos que hemos creado.

La variable de entorno CCACHE_CC, utilizada en versiones anteriores, se establece como obsoleta a partir de la versión 3.5 del programa, pero se puede seguir utilizando como un alias de CCACHE_COMPILER, como así sucede en todos los manuales ubicados en esta web, pendientes de actualizarlos a esta nueva variable de entorno.

6) Uso de Clang

Para utilizar Ccache con Clangsimplemente tiene que establecer la variable de entorno correspondiente:

$ export CCACHE_COMPILER=clang

Tener en cuenta que el nombre de clang, no aparecerá en el proceso de compilación, como se ve en el ejemplo del manual de Clang.

7) Desactivar el uso de Ccache

Esto es útil si por ejemplo, queremos saber el tiempo real de compilación de un paquete determinado. Con la siguiente variable de entorno, Ccache actuará como un simple intermediario sin almacenar dato alguno del proceso de compilación en curso.

$ export CCACHE_DISABLE=true

8) Volver a almacenar una compilación determinada

La siguiente variable de entorno es similar a la anterior, en lo que respecta al tiempo real de compilación. La diferencia radica en que en este caso, sí se almacenan los datos del proceso de compilación en curso, empezando desde cero, y sobreescribiendo los que hubiera en la caché relativos al paquete en cuestión.

$ export CCACHE_RECACHE=true



Enlaces


http://ccache.samba.org >> La web de Ccache.


Foro Galería Blog


Actualizado el 21-10-2018

Compiladores Caché - Ccache

Compiladores Caché - F90cache