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

问题描述 投票:0回答:1

我试图让 CMake 在使用

make
时以并行模式调用
ExternalProject_Add
,但是 external project 的 makefile 不是由 CMake 生成的,而是由 Autotools 生成的。我不想硬编码作业数量,而是由 CMake 控制它。

我用

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`

效果非常好,项目已配置、构建和安装。

但我注意到,如果我将构建命令更改为

BUILD_COMMAND ${MAKE_COMMAND}
,构建外部项目需要更长的时间。对我来说,这意味着 make 不使用并行构建。我也不想在构建命令中硬编码多个并行构建,因为正在构建的其他部分是 CMake 原生的。

CMAKE_BUILD_PARALLEL_LEVEL
变量决定了当省略
-j
时 CMake 将使用的最大并行作业数,而我想要完全相反:找出当 CMake 时
num_jobs
的值是多少称为
cmake --build -jnum_jobs

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

欢迎任何意见!干杯!

cmake makefile autotools
1个回答
0
投票

事实证明@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
)
© www.soinside.com 2019 - 2024. All rights reserved.