如何在CMake中配置可移植并行构建?

1tu0hz3e  于 2022-11-11  发布在  其他
关注(0)|答案(6)|浏览(375)

无论使用哪种构建工具,是否都有可能进行并行构建?
在Unix下,我们可以添加make -jN,其中N是线程数,在Windows下,我添加了CXX_FLAG "/MP",然后在Visual Studio中使用它来并行构建...(?)我如何才能使我的版本在运行CMake时不总是扩展CMAKE_MAKE_PROGRAM
什么是一般解决方案?
我想到了这个:


# 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()
hjqgdpho

hjqgdpho1#

在CMake 3.12中,这是可能的。
cmake(1) Build a Project(cmake --build)获得了--parallel [<jobs>]-j [<jobs>]选项,用于指定并行生成级别。它们Map到本机生成工具的相应选项。
正如dkg所提到的,您还可以设置环境变量CMAKE_BUILD_PARALLEL_LEVEL
CMake文档的链接:

    • 建立项目 *

fbcarpbf

fbcarpbf2#

如果您有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来生成它:

由于C++构建通常需要大量内存,因此您的计算机必须提供与CPU内核数量一样多的内存。
正如Ruslan所指出的,CMake 3.12(2018)有一个新的选项cmake --build -j <N>,以限制构建到<N>内核(作业)从而限制内存消耗如果您使用的是旧版本的CMake,您仍然可以使用cmake --build -- -j <N>。选项--告诉CMake将剩余的代码直接传递给底层的构建器工具,这是忍者。

qfe3c7zg

qfe3c7zg3#

现在用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可用来限制为单一工作。

xa9qqrwz

xa9qqrwz4#

如上所述,可以使用CMake --parallel [<jobs>](或-j [<jobs>])选项来并行地构建解决方案。
但我想指出的是,在Windows中,

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

会使用下列参数启动根MSBuild行程序:

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

这表示根MSBuild行程序会因为/m:<jobs>(或/maxcpucount:<jobs>)而启动多个子MSBuild行程序。但是,因为/p:CL_MPCount=1参数(如需详细信息,请参阅this link),每个子MSBuild最多只能执行一个编译器行程序。换句话说,每个MSBuild最多只能同时编译一个原始程式档。
要克服此限制,可以按以下方式调用CMake:

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

此方法设置/MP option,从而允许在每个MSBuild示例下执行多个编译器进程。
为了记录在案,要配置从Visual Studio GUI运行的构建,需要转到 * 设置 *:

  • 选项 “项目和解决方案→构建并运行→构建最大并行项目数”maxcpucount有影响。
  • 选项 “项目和解决方案→ VC项目设置→构建→最大并发C编译” 表示默认边界为/MP
nxagd54h

nxagd54h5#

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

8ehkhllq

8ehkhllq6#

我已经开始为基于Unix Makefiles的生成器编写一个parallelmake.sh脚本。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()

# ========================================================================================================================================

相关问题