Как настроить портативные параллельные сборки в CMake?
возможно ли как-то иметь параллельную сборку независимо от того, какой инструмент сборки используется?
под Unix мы можем добавить make -jN
где N-количество потоков
и под Windows я добавил к CXX_FLAG "/MP"
, которая затем используется в Visual Studio для параллельной сборки...? Как я могу сделать свою версию такой, что CMAKE_MAKE_PROGRAM
не всегда расширяется, когда я запускаю CMake?
что такое общее решение?
Я придумал это:
#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()
4 ответов
если у вас cmake
v2.8.8 или выше, вы можете использовать ninja
в качестве альтернативы GNU make
mkdir build
cd build
cmake -G Ninja ..
ninja # Parallel build (no need -j12)
или
mkdir build
cd build
cmake -G Ninja ..
cmake --build . # Parallel build using ninja
как вы можете видеть, нет необходимости использовать CMAKE_MAKE_PROGRAM
, сборка выполняется параллельно по умолчанию, оптимизируя количество заданий в зависимости от доступных ядер процессора.
ninja
основан на конфигурации JSON низкого уровня для ускорения фазы запуска. Поэтому его Конфигурация JSON нелегко писать вручную, и я всегда генерирую ее с помощью инструмента высокого уровня / IDE:
- CMake, например, В2.8.8 (2012)
- Qt Creator v2.6 (2012)
- KDevelop v4.6 (2013)
- ... смотрите генераторы
ninja
конфигурация на https://github.com/ninja-build/ninja/wiki/List-of-generators-producing-ninja-build-files
As Для сборки C++ часто требуется много памяти, ваш компьютер должен предоставить столько же памяти, сколько и количество ядер процессора.
вы не можете сделать это кросс-платформенный. Параметр-jN является параметром для создания, а не частью созданного файла Makefile. Однако вы можете создать сценарий bash, который запускает make для вашего проекта с помощью-jN (где скрипт ищет количество ядер, которые у вас есть).
поскольку этот пост уже немного старый:
мой подход, который я обосновался, - это написание parallelmake.sh
скрипт Unix Makefiles
генераторы
Это делается здесь:https://github.com/gabyx/ApproxMVBB
и соответствующие части в файле 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()
# ========================================================================================================================================
с CMake 3.12 это возможно. Из примечаний к выпуску:
" cmake(1) "режим сборки инструмента ("cmake –build") получил " - parallel [] "и "-j [] " параметры для указания уровня параллельной сборки. Они сопоставляются с соответствующими параметрами собственного инструмента сборки.