我试图让 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 论坛帖子,但无济于事。
欢迎任何意见!干杯!
事实证明@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
)