如何在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的文档:

另一答案

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

另一答案

你不能跨平台做这个。 -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中配置可移植并行版本?的主要内容,如果未能解决你的问题,请参考以下文章

将 libgfortran 与 CMAKE 链接的可移植方式

ffmpeg系列之移植到安卓中调用

如何知道 CMake 找到的库版本?

移植opencv3.4到Nanopi NEO 交叉编译

centos 安装Mysql

如何配置 CMake 目标或命令来预处理 C 文件?