如何让CMake通过ExternalProject_Add将并行构建转发给Autotools项目的make
让ExternalProject_Add自动继承
cmake --build -j的并行任务数 要让Autotools生成的Makefile(比如QEMU)在通过ExternalProject_Add构建时,自动使用cmake --build指定的并行任务数,不用硬编码-j16,可以利用CMake的生成器表达式和CMAKE_BUILD_PARALLEL_LEVEL变量来实现,具体方案如下:
核心思路
CMAKE_BUILD_PARALLEL_LEVEL是CMake 3.12+引入的变量,会在cmake --build阶段自动设置为你指定的-j参数值。由于这个变量在配置阶段(cmake -B)不可用,需要用生成器表达式延迟到构建阶段求值,把任务数传递给make命令。
修改后的CMake代码
# 要求CMake 3.12或更高版本,因为CMAKE_BUILD_PARALLEL_LEVEL从该版本开始支持 cmake_minimum_required(VERSION 3.12 FATAL_ERROR) find_program(MAKE_COMMAND NAMES make REQUIRED) # 预获取CPU核心数,作为未指定-j参数时的默认值 execute_process(COMMAND nproc OUTPUT_VARIABLE DEFAULT_PARALLEL_LEVEL OUTPUT_STRIP_TRAILING_WHITESPACE) 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" # 生成器表达式逻辑:如果指定了CMAKE_BUILD_PARALLEL_LEVEL则用它,否则用CPU核心数 BUILD_COMMAND ${MAKE_COMMAND} -j$<IF:$<BOOL:${CMAKE_BUILD_PARALLEL_LEVEL}>,${CMAKE_BUILD_PARALLEL_LEVEL},${DEFAULT_PARALLEL_LEVEL}> INSTALL_COMMAND ${MAKE_COMMAND} install )
关键说明
- 版本依赖:必须指定
cmake_minimum_required(VERSION 3.12),否则CMAKE_BUILD_PARALLEL_LEVEL变量无法被识别。 - 默认值兜底:通过
execute_process(COMMAND nproc)获取系统CPU核心数,当用户未通过cmake --build -j指定并行数时,自动使用核心数作为默认值,避免串行构建。 - 动态参数传递:
$<CMAKE_BUILD_PARALLEL_LEVEL>生成器表达式会在构建阶段动态替换为实际的并行任务数,完美匹配你执行cmake --build -j<n>时的参数,和CMake原生构建部分的并行数保持一致。
测试验证
执行你原来的构建命令:
cmake -B~/builds -S~/my_project -DCMAKE_INSTALL_PREFIX=~/installs cmake --build ~/builds -j`nproc`
此时QEMU的构建会自动使用nproc返回的核心数;如果指定-j8,QEMU也会同步用8个任务并行构建。
内容的提问来源于stack exchange,提问作者Leonardo
相关产品推荐
相关产品推荐

