CMake 转发并行构建,以便在 Autotools 生成的项目上使用 ExternalProject_Add 时进行

CMake forwarding parallel builds to make when using ExternalProject_Add on a Autotools-generated project

提问人:Leonardo 提问时间:11/16/2023 更新时间:11/16/2023 访问量:11

问:

我正在尝试让 CMake 在使用 时以并行模式调用,但外部项目的 makefile 不是由 CMake 生成的,而是使用 Autotools 生成的。我不想对作业数量进行硬编码,而是让它由 CMake 控制。makeExternalProject_Add

我正在用这样的方式包装外部项目:ExternalProject_Add


find_program(MAKE_COMMAND NAMES make REQUIRED)

ExternalProject_Add(qemu
    SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}
    BINARY_DIR ${PROJECT_BINARY_DIR}
    CONFIGURE_COMMAND
    ${CMAKE_CURRENT_SOURCE_DIR}/qemu/configure --prefix="${CMAKE_INSTALL_PREFIX}/qemu"
    BUILD_COMMAND ${MAKE_COMMAND} -j16
    INSTALL_COMMAND ${MAKE_COMMAND} install
)

我是这样称呼CMake的:

cmake -B~/builds -S~/my_project -DCMAKE_INSTALL_PREFIX=~/installs
cmake --build ~/builds -j`nproc`

这非常有效,项目得到配置、构建和安装。

不过我注意到的是,如果我将构建命令更改为 ,构建外部项目需要更长的时间。对我来说,这意味着 make 没有使用并行构建。我也不想只是在构建命令中对一些并行构建进行硬编码,因为还有其他正在构建的部分是 CMake 原生的。BUILD_COMMAND ${MAKE_COMMAND}

CMAKE_BUILD_PARALLEL_LEVEL变量决定了 CMake 在省略时总体上将使用的最大并行作业数,而我则恰恰相反:弄清楚 CMake 被调用时的值是多少。-jnum_jobscmake --build -jnum_jobs

此答案对作业数进行硬编码,并使用 CMake 作为生成器。我也检查了这个 CMake 论坛帖子,但无济于事。

欢迎任何意见!干杯!

cmake makefile 自动工具

评论


答:

0赞 Leonardo 11/16/2023 #1

事实证明,@fdk1342的答案是正确的方法。即使外部项目使用 Autotools 作为生成器而不是 CMake,CMake 也可以构建它:

ExternalProject_Add(qemu
    SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}
    BINARY_DIR ${PROJECT_BINARY_DIR}
    CONFIGURE_COMMAND
    ${CMAKE_CURRENT_SOURCE_DIR}/qemu/configure --prefix="${CMAKE_INSTALL_PREFIX}/qemu"
    BUILD_COMMAND ${CMAKE_COMMAND} --build ${PROJECT_BINARY_DIR} -j
    INSTALL_COMMAND ${CMAKE_COMMAND} --build ${PROJECT_BINARY_DIR} --target install
)