seguidores - ¿Cómo configurar compilaciones paralelas portátiles en CMake?
porque mis hashtags no aparecen en instagram (4)
Como esta publicación ya es un poco vieja:
Mi enfoque al que me he acostumbrado es escribir un script parallelmake.sh
para generadores basados en Unix Makefiles
Esto se hace aquí: https://github.com/gabyx/ApproxMVBB
Y las partes relevantes en el archivo 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()
# ========================================================================================================================================
¿Es de alguna manera posible tener una compilación paralela sin importar qué herramienta de compilación se use?
En Unix podemos agregar make -jN
donde N es el número de subprocesos y en Windows agregué al CXX_FLAG "/MP"
que luego se usa en Visual Studio para construir en paralelo ...? ¿Cómo puedo crear mi versión de modo que CMAKE_MAKE_PROGRAM
no siempre se extienda cuando ejecuto CMake?
¿Qué es una solución general?
Se me ocurrió esto:
#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()
Con CMake 3.12 esto es posible. De las notas de la versión:
El modo de herramienta de compilación "cmake (1)" ("cmake -build") obtuvo las opciones "- parallel []" y "-j []" para especificar un nivel de compilación paralelo. Se asignan a las opciones correspondientes de la herramienta de construcción nativa.
No puedes hacer esto multiplataforma. La opción -jN es un parámetro para crear, y no es parte del Makefile generado. Sin embargo, puede hacer que CMake genere un script de bash que ejecute make para su proyecto usando -jN (donde el script busca la cantidad de núcleos que tiene).
Si tienes cmake
v2.8.8 o superior, puedes usar ninja
como una 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
Como puede ver, no es necesario usar CMAKE_MAKE_PROGRAM
, la construcción se ejecuta en paralelo de forma predeterminada, optimizando la cantidad de trabajos en función de los núcleos de CPU disponibles.
ninja
se basa en una configuración JSON de bajo nivel para acelerar la fase de inicio. Por lo tanto, su configuración JSON no es fácil de escribir a mano y siempre la genero utilizando una herramienta de alto nivel / IDE:
- CMake v2.8.8 (2012)
- Qt Creator v2.6 (2012)
- KDevelop v4.6 (2013)
- ... ver los generadores de configuración
ninja
en https://github.com/ninja-build/ninja/wiki/List-of-generators-producing-ninja-build-files
Como la compilación de C ++ a menudo requiere mucha memoria, su computadora debe proporcionar tanta memoria como la cantidad de núcleos de CPU.