Cómo acelerar la compilación de aplicaciones de Ubuntu (make, cmake, gcc)

11

Estoy compilando algunos programas aquí y tengo 4 núcleos. ¿Hay una manera de contar make, cmakeo gcccompilar utilizando todos los núcleos o algo para que afectan?

Luis Alvarado
fuente

Respuestas:

13

Si un paquete lo admite, puede usar el -jindicador para permitir la ejecución de trabajos paralelos, por ejemplo:

make -j8

Se pueden encontrar más detalles sobre este indicador en la pregunta de Stackoverflow ¿Por qué make -j funciona mejor cuando se pasa un número mayor que el número de núcleos disponibles? .

Compilación distribuida

Si tiene varias máquinas, pruebe distcc . En las máquinas incluidas sudo apt-get install distcc. Suponiendo que su máquina de compilación es 192.168.1.1:

  • en las máquinas auxiliares, ejecute:

    sudo distccd --log-file=/tmp/distccd.log --daemon -a 192.168.1.1
    
  • En la máquina de compilación, antes de ejecutar configureo cmakedebe especificar los hosts que desea usar para el proceso de compilación. Opcionalmente, especifique el número de trabajos simultáneos después de una barra oblicua (el valor predeterminado es 4):

    export DISTCC_HOSTS='localhost/4 192.168.1.2/8 192.168.1.3/8'
    

    Haga que el compilador use distcc:

    export PATH="/usr/lib/distcc:$PATH"
    

    Ahora configureo cmakela aplicación y compilar con:

    make -j$(distcc -j)
    

    Tenga en cuenta que si ha puesto /usr/lib/distccdos veces en su RUTA, fallará. Asegúrese de configurar /usr/lib/distccsolo una vez en su PATH.

Para obtener más detalles, consulte las páginas del manual de distcc (1) y distccd (1) .

Lekensteyn
fuente
Dios mío, que J es bueno. Pasé de 15 minutos a menos de 1. gracias L.
Luis Alvarado
Puede ser más rápido con distcc, la compilación de PHP se realizó en 2 minutos, el núcleo se realizó en 3 minutos (tres máquinas i5)
Lekensteyn
Lo intentaré con distcc cuando llegue al trabajo. Estaba haciendo una pregunta similar sobre esto ayer. Tal vez pueda ayudar con esto aquí: askubuntu.com/questions/106810/…
Luis Alvarado
Ejecutar distccd como root parece un mal plan. No lo he usado por varias razones, pero cuando lo hice no pude haber usado root porque no tenía permiso en esas máquinas.
enms.
@ams No necesita ejecutarlo como root. Si lo ejecuta como root y desea cambiar de usuario, use distccd --user nobody. De lo contrario, se ejecutará bajo el usuario que lo ejecutó.
Lekensteyn