Dans mon cas (avec CMake 3.5.2) le trivial cd build && cmake .. && make -j5
fonctionne très bien. Mais, je reçois l'erreur jobserver indisponible lors de la construction de cibles personnalisées (en tant que dépendances d'autres cibles) via l'idiome cmake --build . --target foo
.
Comme ceci:
add_custom_target(buildroot
COMMAND ${CMAKE_COMMAND} --build . --target install
COMMENT "Populating buildroot..."
)
add_dependencies(deb buildroot)
add_dependencies(rpm buildroot) #... etc
- afin que l'utilisateur puisse make deb
et ça marche. CMake va regénérer makefiles si nécessaire, exécutez la compilation, install
tout exactement comme avec make install
, puis exécutez mes scripts personnalisés pour empaqueter le buildroot peuplé dans la forme ou la forme dont j'ai besoin.
Effectivement, je voudrais make -j15 deb
- mais cela échoue.
Maintenant, comme explained sur la liste de diffusion par CMake devs, la cause fondamentale est, de façon surprenante (ou non), dans GNU Make; il y a une solution de contournement.
La cause principale est que make
ne passera pas son environnement de serveur de jobs aux processus enfants qu'il pense ne sont pas make
.
Pour illustrer, voici un arbre de processus (ps -A f
) Branche: … \_ 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 …
À ⦿ moment, make
gouttes environnement jobserver, provoquant finalement la compilation mono-thread.
La solution qui fonctionnait très bien pour moi, donnés dans l'e-mail lié, est de préfixe toutes les commandes personnalisées avec +env
. Comme ceci:
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
En fin de compte, cela apparaît dans la règle de buildroot
dans le makefile approprié (CMake génère un tas d'entre eux), et provoque GNU Make à se comporter correctement et de respect -j
.
Espérons que cela aide.
Il s'est avéré être le cas, donc j'accepte cette réponse;) –
.... mais .... cmake est l'outil que _generated_ Donc, si CMake produit des Makefiles qui ne peuvent pas être parallélisés, alors la résolution du problème nécessite la correction de vos CMakeLists, non? –
Ceci est correct, mais pas instructif de quelque façon que ce soit ou utile .. ▼ – ulidtko