65

无论使用哪种构建工具,是否有可能以某种方式进行并行构建?

在 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

6 回答 6

67

使用 CMake 3.12,这是可能的。从发行说明

获得的cmake(1)构建项目 ( cmake --build)--parallel [<jobs>]-j [<jobs>]指定并行构建级别的选项。它们映射到本机构建工具的相应选项。

正如 dkg 所提到的,您还可以设置环境变量CMAKE_BUILD_PARALLEL_LEVEL

CMake 文档的链接:

于 2018-06-15T22:49:35.053 回答
21

如果你有 CMake v2.8.8 或更高版本,你可以使用Ninja作为GNUmake的替代品:

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 生成它:

由于 C++ 构建通常需要大量内存,因此您的计算机必须提供与 CPU 内核数量一样多的内存。

正如Ruslan所指出的,CMake 3.12 (2018) 有一个新选项 cmake --build -j <N>,可以将构建限制为<N>核心(作业),从而限制内存消耗(另请参阅文档)。如果您使用较旧的 CMake 版本,您仍然可以使用cmake --build -- -j <N>. 该选项--告诉 CMake 将其余部分直接传递给底层构建器工具,这里是 Ninja。

于 2015-06-30T07:55:09.463 回答
5

现在使用 cmake 并行构建非常简单。您可以在使用“cmake --build”时添加“-j jobs_number”。例如:

cmake --build . -j 24

更多细节可以在 CMAKE 手册中找到:https ://cmake.org/cmake/help/latest/manual/cmake.1.html#build-tool-mode

--parallel [], -j [] 构建时使用的最大并发进程数。如果省略,则使用本机构建工具的默认编号。

如果设置了 CMAKE_BUILD_PARALLEL_LEVEL 环境变量,则在未给出此选项时指定默认并行级别。

一些原生构建工具总是并行构建。使用值 1 可用于限制单个作业。

于 2020-09-01T09:33:08.693 回答
2

你不能做这个跨平台。-jN 选项是 make 的一个参数,而不是生成的 Makefile 的一部分。但是,您可以让 CMake 生成一个 Bash 脚本,该脚本使用 -jN 为您的项目运行 make(该脚本在其中查找您拥有的内核数)。

于 2014-04-25T03:33:44.583 回答
1

我已经决定为基于 - 的生成器编写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()
# ========================================================================================================================================
于 2015-06-30T11:29:27.710 回答
1

正如上面已经提到的,可以使用--parallel [<jobs>](或-j [<jobs>])CMake 选项来并行构建解决方案。

但我想指出,在 Windows 中,一个命令

cmake.exe --build --parallel <jobs>

使用以下参数启动根 MSBuild 进程:

msbuild.exe /m:<jobs> /p:CL_MPCount=1 <another-useful-arguments>

这意味着将启动多个 MSBuild 进程——/maxcpucount:<jobs>也就是/m:<jobs>. 但是它们中的每一个都最多运行一个编译器进程(有关更多详细信息,请参见此链接)。换句话说,每个 MSBuild 最多可以同时编译一个源文件。

为了克服这一限制,可以通过以下方式调用 CMake:

cmake.exe --build --parallel <n_msbuild> -- /p:CL_MPcount=<n_cl>

这种方法设置/MP选项从而允许在每个 MSBuild 实例下有多个编译器进程。


并记录在案。要配置从 Visual Studio GUI 运行的构建,需要转到Settings

  • 选项“项目和解决方案 → 构建和运行 → 构建并行项目的最大数量”会影响maxcpucount.
  • Option "Projects and Solutions → VC++ Project Settings → Build → Maximum Concurrent C++ Compilations" represents the default boundary to /MP.
于 2021-11-24T20:32:17.687 回答