如何在CMake中配置可移植并行版本?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在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()
使用CMake 3.12,这是可能的。从发行说明:
“cmake(1)”构建工具模式(“cmake -build”)获得了“ - parallel []”和“-j []”选项以指定并行构建级别。它们映射到本机构建工具的相应选项。
编辑:正如@dkg所提到的,您还可以设置环境变量CMAKE_BUILD_PARALLEL_LEVEL
。
链接到CMake的文档:
- https://cmake.org/cmake/help/latest/manual/cmake.1.html#build-tool-mode
- https://cmake.org/cmake/help/latest/envvar/CMAKE_BUILD_PARALLEL_LEVEL.html
如果你有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
,默认情况下,构建是并行运行的,根据可用的CPU内核优化作业数量。
ninja
基于低级JSON配置,以加快启动阶段。因此,它的JSON配置不容易手工编写,我总是使用高级工具/ IDE生成它:
- CMake v2.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配置的发电机
由于C ++构建通常需要大量内存,因此您的计算机必须提供与CPU内核数量相同的内存。
你不能跨平台做这个。 -jN选项是要创建的参数,而不是生成的Makefile的一部分。但是,您可以让CMake生成一个bash脚本,该脚本使用-jN为您的项目运行make(脚本会查找您拥有的核心数)。
我已经安定下来为基于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中配置可移植并行版本?的主要内容,如果未能解决你的问题,请参考以下文章