En mi caso (con CMake 3.5.2) el trivial cd build && cmake .. && make -j5
funciona bien.
Pero, yo obtener el error JobServer disponible en la construcción de objetivos personalizados (dependencias de otros objetivos) a través del lenguaje cmake --build . --target foo
.
De esta manera:
add_custom_target(buildroot
COMMAND ${CMAKE_COMMAND} --build . --target install
COMMENT "Populating buildroot..."
)
add_dependencies(deb buildroot)
add_dependencies(rpm buildroot) #... etc
- de modo que el usuario puede make deb
y simplemente funciona. CMake regenerará los archivos make si es necesario, ejecutará la compilación, install
todo exactamente igual que con make install
, y luego ejecutará mis scripts personalizados para empacar la raíz de construcción poblada en cualquier forma o forma que necesite.
Efectivamente, me gustaría make -j15 deb
- pero eso falla.
Ahora, como explained en la lista de correo de desarrolladores CRealice, la causa se encuentra, sorprendentemente (o no), dentro de GNU Make; hay una solución.
La causa principal es que make
no pasará su entorno de servidor de trabajos a procesos secundarios que cree que no son make
.
Para ilustrar, aquí hay un árbol de procesos (ps -A f
) rama: … \_ bash \_ make -j15 deb \_ make -f CMakeFiles/Makefile2 deb \_ make -f CMakeFiles/buildroot.dir/build.make CMakeFiles/buildroot.dir/build \_ /usr/bin/cmake --build . --target install ⦿ \_ /usr/bin/gmake install …
En ⦿ punto, make
gotas JobServer medio ambiente, causando finalmente la compilación de un solo subproceso.
La solución , que funcionó muy bien para mí, como cedido en el correo electrónico relacionado, es el prefijo todos los comandos a medida con +env
. De esta manera:
add_custom_target(buildroot
#-- this ↓↓↓ here -- https://stackoverflow.com/a/41268443/531179
COMMAND +env ${CMAKE_COMMAND} --build . --target install
COMMENT "Populating buildroot..."
)
add_dependencies(deb buildroot)
add_dependencies(rpm buildroot) #... etc
Al final, esto aparece en la regla para buildroot
en el makefile apropiado (CMake genera un montón de ellos), y causa GNU Make a comportarse adecuadamente y respeto -j
.
Espero que esto ayude.
Resultó ser el caso, entonces estoy aceptando esta respuesta;) –
.... pero .... cmake es la herramienta que _generated_ su Makefile. Por lo tanto, si CMake está produciendo Makefiles que no se pueden paralelizar, entonces solucionar el problema requiere corregir sus CMakeLists, no? –
Esto es correcto, pero no ilustrativo de ninguna manera o útil. ▼ – ulidtko