"ccache" persistente en el PkgSrc de SmartOS

En Cómo usar "ccache" para compilar en PkgSrc de SmartOS describo cómo configurar el entorno PkgSrc de SmartOS para que utilice ccache y así beneficiarnos de una mayor velocidad de recompilación.

El problema que tenemos es que la caché de ccache se guarda dentro del entorno chroot y esto tiene dos efectos:

  1. No podemos beneficiarnos del uso de ccache entre dos branches PkgSrc diferentes, algo que uso con frecuencia en SmartOS.
  2. Cuando cerramos en entorno chroot, este se destruye. Esto elimina también la caché de ccache.

Cuando estoy trabajando en un proyecto largo, es común que lance el entorno chroot de forma pesistente dentro de una sesión screen, por lo que puede sobrevivir a lo largo de varias jornadas de trabajo, pero al terminar la tarea la cerraré y perderé la caché del ccache.

Lo ideal sería que la caché ccache se almacenase fuera del entorno chroot. Eso se puede hacer con facilidad de esta manera [1]:

  1. Creamos un directorio /root/.chroot/ en la zona SmartOS.

  2. Editamos los ficheros /data/pkgbuild/scripts/mksandbox y /data/pkgbuild/scripts/rmsandbox, buscamos la línea que pone for mount in ${LOFS_RW_MOUNTS}; do y la cambiamos por lo siguiente: for mount in ${LOFS_RW_MOUNTS} "/root/.ccache=/root/.ccache"; do.

    Lo que estamos haciendo es añadir un loopback hacia /root/.ccache a la hora de crear el entorno chroot y desmontarlo a la hora de destruirlo.

De esta manera, los usos de ccache dentro de los diferentes entornos chroot utilizarán todos la misma caché y esta es persistente e independiente de la existencia de dichos entornos chroot.

[1] Para estos cambios utilizo Ansible. No los hago a mano, que sería un coñazo cada vez que reprovisiono la zona SmartOS.