从CMake设置'make'到默认使用'-j'选项

Has*_*ein 11 cmake parallel-builds

make -j N每当我make从终端打电话时,我都想建立我的CMake项目.我不想-j每次都手动设置选项.

为此,我将CMAKE_MAKE_PROGRAM变量设置为特定的命令行.我使用该ProcessorCount()函数,它提供了并行执行构建的处理器数量.

当我这样做时make,我看不到任何加速.但是,如果我这样做make -j N,那么它的构建肯定会更快.

你能帮我解决这个问题吗?(我在Linux上开发这个.)

以下是我使用的代码片段CMakeList.txt:

include(ProcessorCount)
ProcessorCount(N)
message("number of processors: "  ${N})
if(NOT N EQUAL 0)
  set(CTEST_BUILD_FLAGS -j${N})
  set(ctest_test_args ${ctest_test_args} PARALLEL_LEVEL ${N})
  set(CMAKE_MAKE_PROGRAM "${CMAKE_MAKE_PROGRAM} -j ${N}")      
endif()
message("cmake make program" ${CMAKE_MAKE_PROGRAM})
Run Code Online (Sandbox Code Playgroud)

非常感谢你.

Th.*_*ann 6

如果您想加速构建,可以并行运行多个make进程,但不能运行cmake.要使用预定义数量的并行进程执行每个构建,您可以在MAKEFLAGS中定义它.

在您的环境脚本中设置MAKEFLAGS,例如〜/ .bashrc:

export MAKEFLAGS=-j8
Run Code Online (Sandbox Code Playgroud)

在Linux上,以下将MAKEFLAGS设置为CPU - 1的数量:(在构建时保留一个CPU可用于其他任务),并且在具有动态资源的环境中非常有用,例如VMware:

export MAKEFLAGS=-j$(($(grep -c ^processor /proc/cpuinfo) - 0))
Run Code Online (Sandbox Code Playgroud)


Tsy*_*rev 4

通过设置CMAKE_MAKE_PROGRAM变量,您希望影响构建过程。但:

  1. 该变量仅影响通过构建cmake --build,而不影响本机工具make)调用:

    CMAKE_MAKE_PROGRAM变量设置为供项目代码使用。--buildcmake(1)和 ctest(1)工具也使用该值--build-and-test来启动本机构建过程。

  2. 该变量应该是CACHE变量。它由类似make的生成器以这种方式使用:

    这些生成器将 CMAKE_MAKE_PROGRAM 存储在 CMake 缓存中,以便用户可以对其进行编辑。

    也就是说,您需要设置此变量

    set(CMAKE_MAKE_PROGRAM <program> CACHE PATH "Path to build tool" FORCE)
    
    Run Code Online (Sandbox Code Playgroud)
  3. 该变量应该引用可执行文件本身,而不是带有参数的程序:

    该值可以是可执行文件的完整路径,或者如果预期位于 PATH 中,则只是工具名称。

    也就是说,值“make -j 2”不能用于该变量(将参数分割为列表

    set(CMAKE_MAKE_PROGRAM make -j 2 CACHE PATH "Path to build tool" FORCE)
    
    Run Code Online (Sandbox Code Playgroud)

    也无济于事)。

总之,您可以通过将CMAKE_MAKE_PROGRAMcmake --build变量设置为script来重新定义调用的行为,该脚本使用并行选项进行调用。但可能不会影响你直接调用的行为makemake