如何在CMake中配置可移植并行版本?

时间:2012-05-21 15:58:06

标签: cmake parallel-builds

无论使用哪种构建工具,都能以某种方式实现并行构建吗?

在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()

5 个答案:

答案 0 :(得分:21)

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

  

“cmake(1)”构建工具模式(“cmake -build”)获得“ - 并行   []“和”-j []“用于指定并行构建级别的选项。   它们映射到本机构建工具的相应选项。

编辑:如@dkg所述,您还可以设置环境变量CMAKE_BUILD_PARALLEL_LEVEL

链接到CMake的文档:

答案 1 :(得分:11)

如果您有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内核数量相同的内存。

答案 2 :(得分:3)

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

答案 3 :(得分:2)

我已经决定为基于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()
# ========================================================================================================================================

答案 4 :(得分:0)

现在,使用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可以用于限制单个作业。