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.
È risultato essere il caso, quindi sto accettando questa risposta;) –
.... 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? –
Questo è corretto, ma non illuminante in alcun modo o utile. ▼ – ulidtko