web-dev-qa-db-fra.com

Depuis la configuration de CMake, 'make' utilise l'option '-j' par défaut

Je veux que mon projet CMake soit construit par make -j N, chaque fois que j'appelle make depuis le terminal. Je ne veux pas définir l'option -j manuellement à chaque fois.

Pour cela, je règle CMAKE_MAKE_PROGRAM variable sur la ligne de commande spécifique. J'utilise la fonction ProcessorCount(), qui donne le nombre de processeurs à effectuer en parallèle.

Quand je fais make, je ne vois aucune accélération. Cependant, si je fais make -j N, alors il est construit définitivement plus rapidement.

Voulez-vous m'aider s'il vous plaît sur cette question? (Je développe ceci sur Linux.)

Voici l'extrait du code que j'utilise dans CMakeList.txt:

include(ProcessorCount)
ProcessorCount(N)
message("number of processors: "  ${N})
if(NOT N EQUAL 0)
  set(CTEST_BUILD_FLAGS -j${N})
  set(ctest_test_args ${ctest_test_args} PARALLEL_LEVEL ${N})
  set(CMAKE_MAKE_PROGRAM "${CMAKE_MAKE_PROGRAM} -j ${N}")      
endif()
message("cmake make program" ${CMAKE_MAKE_PROGRAM})

Merci beaucoup.

9
BatiCode

Via le paramètre CMAKE_MAKE_PROGRAM variable que vous souhaitez affecter au processus de construction. Mais:

  1. Cette variable n'affecte que lors de la génération via cmake --build, pas lors de l'appel de outil natif} _ (make):

    La variable CMAKE_MAKE_PROGRAM est définie pour être utilisée par le code du projet. La valeur est également utilisée par les outils cmake (1) --build et ctest (1) --build-and-test pour lancer le processus de construction natif.

  2. Cette variable doit être CACHE un. Il est utilisé de la sorte par les générateurs make-:

    Ces générateurs stockent CMAKE_MAKE_PROGRAM dans le cache CMake afin qu'il puisse être édité par l'utilisateur.

    Autrement dit, vous devez définir cette variable avec

    set(CMAKE_MAKE_PROGRAM <program> CACHE PATH "Path to build tool" FORCE)
    
  3. Cette variable doit faire référence à un exécutable lui-même, pas à un programme avec des arguments:

    La valeur peut être le chemin d'accès complet à un exécutable ou simplement le nom de l'outil s'il est prévu qu'il soit dans le PATH.

    En d’autres termes, la valeur "make -j 2" ne peut pas être utilisée pour cette variable (fractionnement des arguments sous forme de liste).

    set(CMAKE_MAKE_PROGRAM make -j 2 CACHE PATH "Path to build tool" FORCE)
    

    ne serait pas aider aussi).

En résumé, vous pouvez redéfinir le comportement de l'appel cmake --build en définissant la variable CMAKE_MAKE_PROGRAM sur la variable script, qui appelle make avec des options parallèles. Mais vous ne pouvez pas affecter le comportement pour l'appel make direct.

2
Tsyvarev

Si vous souhaitez accélérer la construction, vous pouvez exécuter plusieurs processus de création en parallèle mais pas cmake . Pour effectuer chaque construction avec un nombre prédéfini de processus parallèles, vous pouvez définir ceci dansMAKEFLAGS.

Définissez MAKEFLAGS dans votre script d’environnement, par exemple. ~/.bashrc comme vous voulez:

export MAKEFLAGS=-j8

Sous Linux, le paramètre suivant définit MAKEFLAGS sur le nombre de CPU-1: (Laissez un CPU libre pour d’autres tâches lors de la construction) et est utile dans les environnements avec des ressources dynamiques, par exemple. VMware:

export MAKEFLAGS=-j$(($(grep -c ^processor /proc/cpuinfo) - 0))
5
Th. Thielemann

Vous pouvez définir la variable env MAKEFLAGS en utilisant cette commande

export MAKEFLAGS=-j$(nproc)
2
Herve Mutombo

Cette méthode peut-elle être utilisée pour appeler plusieurs fonctions? comme fonction1,2,3 en parallèle plutôt séquentiel, toutes les autres idées appréciées.

exemple:

 if(FLAG1)
#some variables/options settings
    function1(${OPTIONS})
    function2(${OPTIONS})
    function3(${OPTIONS})
     ....
endif()

function(fucntion1)
#some variables/options parsing and passed to command.
      execute_process(COMMAND COMMAND1
                    WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}
                    RESULT_VARIABLE res
                    TIMEOUT 60)
endfunction()
function(fucntion2)
#some variables/options parsing and passed to command.
      execute_process(COMMAND COMMAND2
                    WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}
                    RESULT_VARIABLE res
                    TIMEOUT 60)
endfunction()
0
Ramana