提问人:Leonardo 提问时间:11/16/2023 更新时间:11/16/2023 访问量:11
CMake 转发并行构建,以便在 Autotools 生成的项目上使用 ExternalProject_Add 时进行
CMake forwarding parallel builds to make when using ExternalProject_Add on a Autotools-generated project
问:
我正在尝试让 CMake 在使用 时以并行模式调用,但外部项目的 makefile 不是由 CMake 生成的,而是使用 Autotools 生成的。我不想对作业数量进行硬编码,而是让它由 CMake 控制。make
ExternalProject_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 被调用时的值是多少。-j
num_jobs
cmake --build -jnum_jobs
此答案对作业数进行硬编码,并使用 CMake 作为生成器。我也检查了这个 CMake 论坛帖子,但无济于事。
欢迎任何意见!干杯!
答:
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
)
评论