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.
Via le paramètre CMAKE_MAKE_PROGRAM variable que vous souhaitez affecter au processus de construction. Mais:
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.
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)
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.
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))
Vous pouvez définir la variable env MAKEFLAGS en utilisant cette commande
export MAKEFLAGS=-j$(nproc)
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()