Pregunta

Estoy tratando de configurar una construcción basada en CMake paralelo para mi árbol de código fuente, pero cuando emitir

$ cmake .
$ make -j2

Puedo obtener:

jobserver unavailable: using -j1.  Add '+' to parent make rule

como una advertencia. ¿Alguien tiene una idea de si es posible fijar de alguna manera?

¿Fue útil?

Solución

se parece a esto no es un problema, pero sólo cmake hacer.

Otros consejos

En el Makefile generado, al llamar a un sub-que sea necesario ya sea para uso $ (MAKE) (no sólo 'hacer') o preceder a otro de la línea con un signo +. Eso es, por regla general debería tener este aspecto:

mysubdir:
    $(MAKE) -C mysubdir

o como esto:

mysubdir:
    +make -C mysubdir

Si no lo hace una de esas dos formas, maquillaje le dará esa advertencia.

No sé nada acerca de cmake, así que quizás es la generación de Makefile que no son correctos. O tal vez usted ha hecho algo incorrecto en su final.

En mi caso (con CMake 3.5.2) del cd build && cmake .. && make -j5 trivial funciona muy bien.

Sin embargo, me pongo el JobServer disponible de error en la construcción de objetivos personalizados (dependencias de otros objetivos) a través de la expresión idiomática 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 se regenerará makefiles si es necesario, ejecutar la compilación, install todo exactamente igual que con make install y ejecute mis scripts personalizados para empaquetar el buildroot poblada en cualquiera de sus formas que necesito.

Efectivamente, me gustaría make -j15 deb -. Pero eso no


Ahora, como explicó en la lista de correo CMake proyectos de desarrollo, las mentiras de causa raíz, sorprendentemente (o no), dentro de GNU make; hay una solución.

La raíz del problema es que make no pasará a su entorno JobServer a procesos secundarios que considere no son make.

Para ilustrar, aquí hay un árbol de procesos (ps -A f) sucursal: … \_ 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 …

A ? punto, make gotas entorno JobServer, causando finalmente la compilación de una sola rosca.


La solución , que funcionó muy bien para mí, como cedido en el correo electrónico relacionado, es que delante de todos los comandos personalizados 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 -j respecto.

Espero que esto ayude.

Sólo a partir de googlear parece que estás usando distcc (por ejemplo aquí )

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top