Como faço para configurar o portátil construções paralelas no CMake?
-
12-12-2019 - |
Pergunta
É de alguma forma possível para ser capaz de ter uma compilação paralela não importa qual ferramenta de compilação é utilizado?
Sob Unix, podemos adicionar make -jN
onde N é o número de linhas, e no Windows eu adicionados ao CXX_FLAG "/MP"
qual é, então, usado no Visual Studio para compilação paralela...(?) Como posso fazer a minha versão, tais que CMAKE_MAKE_PROGRAM
não é sempre estendidas quando eu executar o CMake?
O que é uma solução geral?
Me veio com essa:
# 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()
Solução
Com o CMake 3.12 isso é possível.Partir das notas de lançamento:
O "cmake(1)" Ferramenta de Compilação de Modo ("cmake –build"), adquirida "– paralelo []" e "-j []" opções para especificar um paralelo nível de compilação.Eles mapa para opções correspondentes do nativo ferramenta de compilação.
Como mencionado por dkg, você também pode definir a variável de ambiente CMAKE_BUILD_PARALLEL_LEVEL
.
Links para o CMake documentação:
Outras dicas
Se você tem o CMake v2.8.8 ou superior, você pode usar Ninja como uma alternativa de GNU make
:
mkdir build
cd build
cmake -G Ninja ..
ninja # Parallel build (no need -j12)
ou
mkdir build
cd build
cmake -G Ninja ..
cmake --build . # Parallel build using Ninja
Como você pode ver, não há necessidade de usar CMAKE_MAKE_PROGRAM
, a compilação é executado em paralelo por padrão, otimizando o número de postos de trabalho, dependendo de núcleos de CPU disponíveis.
Ninja é baseado em um baixo nível de JSON configuração para acelerar a fase de inicialização.Por conseguinte, a sua JSON configuração não é fácil escrever com a mão, e eu sempre geram-lo usando uma ferramenta de alto nível,/IDE:
- O CMake v2.8.8 (2012)
- Qt Creator v2.6 (2012)
- KDevelop v4.6 (2013)
- Meson no Linux (2013)
- ...veja os geradores de Ninja configuração https://github.com/ninja-build/ninja/wiki/List-of-generators-producing-ninja-build-files
Como uma compilação do C++, muitas vezes, requer muita memória, o computador tem de fornecer o máximo de memória como o número de núcleos de CPU.
Como apontado por Ruslan, CMake 3.12 (2018) tem um nova opção cmake --build -j <N>
para limitar a construir a <N>
núcleos (postos de trabalho), assim, limitar o consumo de memória (consulte também o documentação).Se você usar um velho CMake versão, você ainda pode usar cmake --build -- -j <N>
.A opção --
diz para o CMake para passar o resto diretamente para o subjacente ferramenta de construtor, aqui é Ninja.
Você não pode fazer isso de plataforma cruzada.O jN opção é um parâmetro para fazer, e não faz parte do Makefile gerado.No entanto, você pode ter o CMake gera um Bash script que executa fazer para o seu projeto utilizando -jN (onde o script procura o número de núcleos que você tem).
Eu tenho acomodou-se para escrever uma parallelmake.sh
script para Unix Makefiles
baseado em geradores.Isto é feito aqui: https://github.com/gabyx/ApproxMVBB
E as partes relevantes da o CMake arquivo:
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()
# ========================================================================================================================================