2010-05-31 7 views
13

Je suis en train d'installer un parallèle build basé sur CMake pour mon arbre source, mais quand je lanceCMake et la construction parallèle à « faire -JN »

$ cmake . 
$ make -j2 

-je obtenir un avertissement jobserver unavailable: using -j1. Add '+' to parent make rule. Est-ce que quelqu'un a une idée s'il est possible de le réparer d'une manière ou d'une autre?

Répondre

1

ressemble ce n'est pas un problème de CMake, mais seulement faire.

+0

Il s'est avéré être le cas, donc j'accepte cette réponse;) –

+7

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

+1

Ceci est correct, mais pas instructif de quelque façon que ce soit ou utile .. ▼ – ulidtko

-1

juste de googler il semble que vous utilisez distcc (par exemple here)

+0

Non, je ne le fais pas. Je suppose que la solution à mon problème se trouve quelque part dans CMake, c'est-à-dire que je dois le convaincre de transmettre les bons paramètres à la marque. –

+2

vous pouvez exécuter "VERBOSE = 1 make 'pour voir ce qui fait exactement l'exécution – dimba

22

Dans le Makefile généré, lorsque vous appelez dans un sous-make, il doit utiliser $ (MAKE) (pas seulement 'make') ou bien précéder la ligne d'un +. Autrement dit, une règle devrait ressembler à ceci:

mysubdir: 
    $(MAKE) -C mysubdir 

ou comme ceci:

mysubdir: 
    +make -C mysubdir 

Si vous ne le faites pas une de ces deux façons, faire vous donnera cet avertissement.

Je ne sais rien à propos de cmake, alors peut-être que cela génère des Makefiles qui ne sont pas corrects. Ou peut-être que vous avez fait quelque chose de mal de votre côté.

+1

Je reçois cette erreur même si J'utilise '$ (MAKE) -C mysubdir' – Walter

3

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.

+0

Cela fonctionne très bien sauf sur Windows, où la syntaxe confuse make et provoque l'échec de la commande avec l'erreur" '+ env' n'est pas reconnu comme interne ou commande externe. " – taranaki

+0

Je dirais que ... trop de logiciels fonctionnent très bien" sauf sur Windows ". – ulidtko

Questions connexes