2010-05-31 8 views
13

estoy tratando de configurar una construcción basada en CMake paralelo para mi árbol de código fuente, pero cuando expidocmake y la construcción paralela a "hacer -Jn"

$ cmake . 
$ make -j2 

recibo una advertencia jobserver unavailable: using -j1. Add '+' to parent make rule. ¿Alguien tiene una idea si es posible arreglarlo de alguna manera?

Respuesta

1

parece que esto no es un problema, pero cmake hacer solamente.

+0

Resultó ser el caso, entonces estoy aceptando esta respuesta;) –

+7

.... 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? –

+1

Esto es correcto, pero no ilustrativo de ninguna manera o útil. ▼ – ulidtko

-1

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

+0

No, yo no. Supongo que la solución a mi problema se encuentra en algún lugar profundo de CMake, es decir, necesito convencerlo de pasar los parámetros correctos a la marca. –

+2

puede ejecutar "VERBOSE = 1 make" para ver qué es lo que hace que se ejecute exactamente – dimba

22

En el archivo Makefile generado, al llamar a una subcomposición necesita usar $ (MAKE) (no solo 'make') o bien anteponer la línea con un +. Esto 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, que le dará esa advertencia.

No sé nada sobre cmake, así que tal vez esté generando Makefiles que no son correctos. O tal vez hiciste algo incorrectamente de tu parte.

+1

Me sale dicho error aunque Yo uso '$ (MAKE) -C mysubdir'. ¿Qué ocurre aquí? – Walter

3

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.

+0

Funciona muy bien, excepto en Windows, donde la sintaxis confunde y hace que el comando falle con el error" '+ env' no se reconoce como un interno o comando externo. " – taranaki

+0

Yo diría ... demasiados softwares funcionan muy bien" excepto en Windows ". – ulidtko

Cuestiones relacionadas