Cómo usar "ccache" para compilar en PkgSrc de SmartOS

Utilizo muy frecuentemente el entorno de compilación PkgSrc para SmartOS y voy personalizándolo poco a poco para mejorar mi experiencia y ajustarlo mejor a mi forma de trabajar.

Estudiando la documentación de PkgSrc, me encuentro un capítulo interesante: Speeding up pkgsrc builds with ccache and distcc. Yo utilizo ccache en muchos de mis entornos y poder utilizarlo también en PkgSrc me resulta atractivo.

Los pasos descritos en esa web son generales para PkgSrc, pero, en el caso concreto de SmartOS, sus actualizaciones trimestrales, su entorno chroot, etc, encuentro más fácil meter esos cambios como variables de entorno que modificar ficheros de configuración (tendría que cambiar un fichero en cada uno de los branches que utilizo). Una forma simple de hacerlo en SmartOS es modificar el fichero /data/pkgbuild/scripts/run-sandbox [1] y añadirle lo siguiente en la creación del fichero .bashrc para el entorno chroot:

# Ver el comentario en
# https://wiki.netbsd.org/tutorials/pkgsrc/build_ccache_distcc/
export CCACHE_DIR=/root/.ccache/
export PKGSRC_COMPILER=ccache gcc

Obsérvese el detalle de definir CCACHE_DIR de forma explícita. La razón se explica en el comentario de Speeding up pkgsrc builds with ccache and distcc que, resumiendo, indica que si no se hace así, cada compilación utiliza una caché separada y, por tanto, no se reutiliza y no sirve de nada.

Con estos cambios, cuando intentemos compilar algo, se instalará ccache y se utilizará automáticamente.

Advertencia

Por algún motivo, la primera vez que compilamos algo con esta configuración nos va a salir el siguiente error:

checking for x86_64-sun-solaris2.11-gcc... gcc
checking whether the C compiler works... no
configure: error: C compiler cannot create executables
See `config.log' for more details
*** Error code 77

Haciendo bmake clean y volviéndolo a intentar, ya funciona bien.

Esto es algo a estudiar en el futuro.

¿Cuánto ganamos utilizando ccache? El efecto se nota más cuanto más larga es la compilación:

  normal ccache
Apache 1:29 0:49
tor 3:25 1:02
python39 6:02 1:36
[1] Para estos cambios utilizo Ansible. No los hago a mano, que sería un coñazo cada vez que reprovisiono la zona SmartOS.

Actualización 20220824: Tal vez te interese leer "ccache" persistente en el PkgSrc de SmartOS.

Actualización 20230123: Más sobre este tema en Cómo usar "ccache" para compilar en PkgSrc de SmartOS (II).