2010-05-31 3 views
13

sto cercando di impostare una build basata su CMake parallelo per il mio albero di origine, ma quando ho emettoCMake e la costruzione parallelo con "fare -jn"

$ cmake . 
$ make -j2 

Ho ricevuto un avviso jobserver unavailable: using -j1. Add '+' to parent make rule. Qualcuno ha un'idea se è possibile risolverlo in qualche modo?

risposta

1

appare come questo non è un problema CMake, ma solo fare.

+0

È risultato essere il caso, quindi sto accettando questa risposta;) –

+7

.... ma .... cmake è lo strumento che _generated_ Quindi, se CMake produce Makefile che non possono essere parallelizzati, risolvere il problema richiede di correggere le tue CMakeLists, no? –

+1

Questo è corretto, ma non illuminante in alcun modo o utile. ▼ – ulidtko

-1

Proprio da googling sembra che si sta utilizzando distcc (ad esempio here)

+0

No, non lo faccio. Immagino che la soluzione al mio problema si trovi da qualche parte nel profondo di CMake, cioè devo convincerlo a passare i parametri giusti alla marca. –

+2

è possibile eseguire "VERBOSE = 1 make" per vedere cosa rende esattamente l'esecuzione – dimba

22

Nel Makefile generato, quando si chiama in un sotto-make deve usare $ (MAKE) (non solo 'make') o precedere la linea con un +. Cioè, una regola dovrebbe essere simile a questo:

mysubdir: 
    $(MAKE) -C mysubdir 

o come questo:

mysubdir: 
    +make -C mysubdir 

Se non lo fai uno di questi due modi, rendere vi darà quell'avvertimento.

Non so nulla di cmake, quindi forse sta generando Makefile che non sono corretti. O forse hai fatto qualcosa di sbagliato nella tua parte.

+1

Ho ricevuto un errore anche se Io uso '$ (MAKE) -C mysubdir'. Cosa c'è che non va qui? – Walter

3

Nel mio caso (con CMake 3.5.2) il banale cd build && cmake .. && make -j5 funziona perfettamente.

Ma, io capisco l'errore Jobserver disponibile quando si costruisce obiettivi personalizzati (come dipendenze di altri obiettivi) attraverso il cmake --build . --target foo idioma.

Ti piace questa:

add_custom_target(buildroot 
    COMMAND ${CMAKE_COMMAND} --build . --target install 
    COMMENT "Populating buildroot..." 
) 
add_dependencies(deb buildroot) 
add_dependencies(rpm buildroot) #... etc 

- in modo che l'utente può make deb e funziona da solo. CMake rigenererà i makefile se necessario, eseguirà la compilazione, install esattamente come con make install, quindi eseguirà i miei script personalizzati per impacchettare il buildroot popolato in qualsiasi forma o forma di cui ho bisogno.

Abbastanza sicuro, mi piacerebbe make -j15 deb - ma che fallisce.


Ora, come explained sulla mailing list per sviluppatori CMake, la causa principale risiede, a sorpresa (o non), all'interno di GNU Make; c'è una soluzione.

La causa principale è che make non passa il proprio ambiente del server di lavoro ai processi figlio che ritiene non siano make.

Per illustrare, qui un albero processo (ps -A f) ramo: … \_ 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 gocce Jobserver ambiente, in ultima analisi, causando compilazione thread singolo.


Il soluzione che ha lavorato molto per me, come dato via nel email collegato, è quello di precedere tutti i comandi personalizzati con +env. Come questo:

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 

Alla fine, questo compare nella regola per buildroot nel makefile appropriato (CMake genera un gruppo di loro), e fa sì che GNU Make a comportarsi correttamente e il rispetto -j.

Spero che questo aiuti.

+0

Funziona alla grande tranne su Windows, dove la sintassi genera confusione e fa fallire il comando con l'errore" '+ env' non è riconosciuto come interno o comando esterno. " – taranaki

+0

Direi ... troppi software funzionano alla grande" tranne su Windows ". – ulidtko