Domanda

È in qualche modo possibile avere una build parallela indipendentemente dallo strumento di build utilizzato?

Sotto Unix possiamo aggiungere make -jN dove N è il numero di thread e sotto Windows ho aggiunto al file CXX_FLAG "/MP" che viene poi utilizzato in Visual Studio per la compilazione parallela...(?) Come posso rendere la mia versione tale CMAKE_MAKE_PROGRAM non viene sempre esteso quando eseguo CMake?

Qual è una soluzione generale?

Mi è venuta in mente questa:

# Add some multithreaded build support
MARK_AS_ADVANCED(MULTITHREADED_BUILD)
set(MULTITHREADED_BUILD 12 CACHE STRING "How many threads are used to build the project")
if(MULTITHREADED_BUILD)
    if(${CMAKE_GENERATOR} MATCHES "Unix Makefiles")
            message(STATUS ${CMAKE_BUILD_TOOL})
            set(CMAKE_MAKE_PROGRAM "${CMAKE_MAKE_PROGRAM} -j${MULTITHREADED_BUILD}")
            message(STATUS "Added arguments to CMAKE_BUILD_TOOL: ${CMAKE_MAKE_PROGRAM}")
    elseif(MSVC)
      set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP")
      message(STATUS "Added parallel build arguments to CMAKE_CXX_FLAGS: ${CMAKE_CXX_FLAGS}")
    endif()
endif()
È stato utile?

Soluzione

Con CMake 3.12 questo è possibile.Dalle note di rilascio:

La modalità strumento di build "cmake (1)" ("cmake –build") ha guadagnato le opzioni "-parallele [] e "-j [] per specificare un livello di build parallelo.Si associano alle opzioni corrispondenti dello strumento di compilazione nativo.

Come accennato da dkg, puoi anche impostare la variabile di ambiente CMAKE_BUILD_PARALLEL_LEVEL.

Collegamenti alla documentazione di CMake:

Altri suggerimenti

Se hai CMake v2.8.8 o successiva, puoi utilizzare Ninja in alternativa a GNU make:

mkdir build
cd    build
cmake -G Ninja ..
ninja              # Parallel build (no need -j12)

O

mkdir build
cd    build
cmake -G Ninja ..
cmake --build .    # Parallel build using Ninja

Come puoi vedere, non è necessario utilizzarlo CMAKE_MAKE_PROGRAM, la build viene eseguita in parallelo per impostazione predefinita, ottimizzando il numero di lavori in base ai core della CPU disponibili.

Ninja si basa su una configurazione JSON di basso livello per velocizzare la fase di avvio.Pertanto la sua configurazione JSON non è facile da scrivere a mano e la genero sempre utilizzando uno strumento/IDE di alto livello:

Poiché una build C++ spesso richiede molta memoria, il tuo computer deve fornire tanta memoria quanto il numero di core della CPU.

Come sottolineato da Ruslan, CMake 3.12 (2018) ha un nuova opzione cmake --build -j <N> per limitare la compilazione a <N> core (jobs) limitando così il consumo di memoria (vedi anche il documentazione).Se utilizzi una versione precedente di CMake, puoi comunque utilizzare cmake --build -- -j <N>.L'opzione -- dice a CMake di passare il resto direttamente allo strumento di creazione sottostante, qui è Ninja.

Non puoi farlo multipiattaforma.L'opzione -jN è un parametro da creare e non fa parte del Makefile generato.Tuttavia, potresti fare in modo che CMake generi uno script Bash che esegua make per il tuo progetto utilizzando -jN (dove lo script cerca il numero di core che hai).

Mi sono deciso a scrivere a parallelmake.sh sceneggiatura per Unix Makefilesgeneratori basati su.Questo viene fatto qui: https://github.com/gabyx/ApproxMVBB

E le parti rilevanti nel file CMake:

https://github.com/gabyx/ApproxMVBB/blob/master/CMakeLists.txt#L89

# Add some multithreaded build support =====================================================================================================
MARK_AS_ADVANCED(MULTITHREADED_BUILD)
SET(MULTITHREADED_BUILD ON CACHE BOOL "Parallel build with as many threads as possible!")
if(MULTITHREADED_BUILD)
    if(${CMAKE_GENERATOR} MATCHES "Unix Makefiles")
            file(COPY ${ApproxMVBB_ROOT_DIR}/cmake/parallelmake.sh DESTINATION ${PROJECT_BINARY_DIR}
                FILE_PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE
                NO_SOURCE_PERMISSIONS
            )
            SET(CMAKE_MAKE_PROGRAM "${PROJECT_BINARY_DIR}/parallelmake.sh")
            MESSAGE(STATUS "Set make program to ${PROJECT_BINARY_DIR}/parallelmake.sh")
    elseif(MSVC)
      SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}" "/MP")
      MESSAGE(STATUS "Added parallel build arguments to CMAKE_CXX_FLAGS: ${CMAKE_CXX_FLAGS}")
    endif()
endif()
# ========================================================================================================================================
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top