You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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
)

关键说明

  1. 版本依赖:必须指定cmake_minimum_required(VERSION 3.12),否则CMAKE_BUILD_PARALLEL_LEVEL变量无法被识别。
  2. 默认值兜底:通过execute_process(COMMAND nproc)获取系统CPU核心数,当用户未通过cmake --build -j指定并行数时,自动使用核心数作为默认值,避免串行构建。
  3. 动态参数传递:$<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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 22:37:41