build-process makefile gnu-make

build process - Hacer(trabajos paralelos) en Windows



build-process makefile (5)

¿Qué configuración funciona para que GNU realice trabajos paralelos (-j) en Windows?

He intentado configurar el shell en cmd.exe usando MinGW make 3.81, esto funciona en la creación de los múltiples procesos, pero hace que falle con el mensaje "esperando trabajo".

¿Puede esto funcionar y cuál es la mejor configuración? (MinGW / Cygwin / ???) ¿Puede alguien indicarme un ejemplo práctico para probar?


Encontré esta entrada de blog de Danny Thorpe que explica los problemas con la compilación paralela de Windows. Básicamente, lo que sugiere es establecer primero la siguiente variable de entorno:

set SHELL=cmd.exe

Con eso, pude ejecutar el comando de estilo make -j , pero desafortunadamente no el comando de estilo make -jN controlado.


Hasta donde puedo entender, los trabajos paralelos de GNU Make dependen de la plataforma subyacente para suministrar información de carga (CPU). Desafortunadamente, esto se hace de una manera no compatible con Windows, y solo el comando "make -j" hace algo a escala. Ese comando (sin el número máximo de trabajos) es potencialmente peligroso, ya que se comerá la memoria como un perro hambriento rabioso (lo probé en Qt y se estrelló en QtWebkit, el proyecto más grande en Qt, 4GB RAM, Win7).

Pensándolo bien, tengo la sensación de que make -j3 corre más rápido que make, pero a la luz de lo que puedo encontrar en la web (foros, manuales ...) parece una funcionalidad muy específica de POSIX / linux.

Por cierto, me sorprende que su pregunta haya sido rechazada.


He resuelto este problema, así que comparto la solución para todos.

Puede probar MinGW-TDM (Página de inicio: http://tdm-gcc.tdragon.net/ ) o MinGW-Equation (Página de descarga: http://www.equation.com/servlet/equation.cmd?fa=fortran ).

Instale la versión de 32 bits en D:/MinGW/MinGW32 por ejemplo (y la versión de 64 bits en D: / MinGW / MinGW64 si desea usar archivos binarios de compilación de 64 bits)

Cree un archivo por lotes de la siguiente manera y luego ejecútelo en el directorio de compilación:

Set MinGW_bin=D:/MinGW/MinGW32/bin Set MSys_bin=D:/MinGW/msys/bin Set Path=%MSys_bin%;%MinGW_bin% mingw32-make SHELL=CMD.exe -j6 -f makefile

Puede descargar MSYS desde http://sourceforge.net/apps/trac/mingw-w64/wiki/MSYS . Tiene muchas utilidades similares a UNIX que requerían la creación de muchas bibliotecas y aplicaciones de código abierto.

Donde -j6 es la opción para ejecutar 6 trabajos de compilación en paralelo.

SUGERENCIA: puede configurar la opción -jN donde N = sus números de núcleos de CPU (subprocesos) múltiples por 1.5. En mi caso, mi CPU tiene 4 subprocesos, así que establezco este valor en 6.

Nota: puedes correr

make.exe -jN -f makefile

sin la opción SHELL=CMD.exe y su compilación se ejecuta en paralelo, pero en algunos casos no es compatible (donde make.exe proviene del directorio MSYS).

Saludos,


Un consejo que podría ayudar a los usuarios de CMake.

La opción -jN no funciona cuando las llamadas a makefile se hacen recursivamente como normalmente lo hacen cmake-makefiles. Pero hay un remedio que nuevamente funciona porque en los makefiles generados se hacen llamadas CMake a través de tal sintaxis.

$(MAKE) -f CMakeFiles/Makefile2 <subproject>

Esto significa que puedes modificar la variable MAKE:

mingw32-make "MAKE=mingw32-make -j3"

Ahora, cada vez que se inicia un subproyecto-make, vuelve a aparecer la opción "-j3". Pero tenga en cuenta que esto efectivamente no limita el número de compilaciones paralelas a 3 como podría esperar. Si tiene más de 3 proyectos que no dependen unos de otros de la misma jerarquía, los 3 proyectos se construirán en paralelo y cada uno de ellos inicia 3 pasos de compilación. Resultando en 9 pasos de compilación en paralelo.

Cuando echamos otra ojeada al Makefile superior generado por cmake, vemos que el objetivo "todos" esencialmente solo inicia una sub-marca.

$(MAKE) -f CMakeFiles/Makefile2 all

Así que podemos eliminar una capa de paralelismo de subproyecto llamando a

mingw32-make "MAKE=mingw32-make -j3" -f CMakeFiles/Makefile2 all

Pero esto sacrifica los informes de progreso.

Espero que esto ayude sin embargo.


Nunca he tenido ningún problema usando make -jn bajo Cygwin. Funciona bastante bien. Lo uso regularmente con el compilador cl.exe de Microsoft. Simplemente funciona fuera de la caja para mí. Muy parecido a UNIX, que es una buena cosa ™. Construye scripts para portar muy bien a Linux y Mac. Muy recomendable.

Nunca me gustó hacer MinGW desde que llegué a un lugar donde 5 barras diagonales eran muy pocas, pero seis eran demasiadas. ¡Suspiro! (Para hacer con los hacks MinGW para hacer que los nombres de las rutas separadas por barra diagonal estén permitidos en hacer AFAIK).