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

Modern CMake能否通过CMakePresets.json实现外部项目批量构建?

纯CMake落地方案

你需要的「新增依赖仅新增对应目录、不改动现有逻辑」的需求,完全可以基于CMake原生功能实现,不需要复杂的跨项目变量传递:

  1. 要求所有子库目录下必须有CMakePresets.json(你示例里的txt属于笔误,preset标准格式为json),文件内自行配置该库的源码地址、Git标签、编译参数、安装路径等所有专属配置,根目录逻辑完全不需要感知子库的实现细节
  2. 根目录CMakeLists.txt仅做自动扫描和目标注册逻辑,核心代码参考:
cmake_minimum_required(VERSION 3.21) # 最低版本要求对应CMakePresets v2格式支持
project(internal_prebuilt_libs NONE)

# 扫描所有带CMakePresets.json的一级子目录,自动注册为构建目标
file(GLOB LIB_CONFIGS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} */CMakePresets.json)
set(LIB_TARGETS "")
foreach(CFG_PATH ${LIB_CONFIGS})
    get_filename_component(LIB_NAME ${CFG_PATH} DIRECTORY)
    list(APPEND LIB_TARGETS ${LIB_NAME})
    add_custom_target(${LIB_NAME}
        COMMAND cmake --preset default -S ${CMAKE_CURRENT_SOURCE_DIR}/${LIB_NAME} -B ${CMAKE_CURRENT_BINARY_DIR}/${LIB_NAME}/build
        COMMAND cmake --build --preset default
        COMMAND cmake --install --preset default --prefix ${CMAKE_CURRENT_BINARY_DIR}/output/${LIB_NAME}
        COMMENT "Building prebuilt library: ${LIB_NAME}"
    )
endforeach()

# 全局构建目标
add_custom_target(all DEPENDS ${LIB_TARGETS})
  1. 子库目录下甚至不需要额外写CMakeLists.txt,直接在preset的cacheVariables里配置FetchContent拉取对应源码的逻辑即可,增删依赖只需要新增/删除对应目录,完全不会影响现有构建逻辑。

CI/CD适配逻辑

  • 流水线按目标平台分别执行构建,不同架构的编译产物输出到带平台标识的目录,打包为库名-版本号-平台架构命名格式的压缩包
  • 内部使用侧可以直接对接内部制品库,按名称和版本检索下载对应平台的预编译包即可。

可选优化方案

如果后续出现依赖嵌套的场景(比如A库依赖B库),纯CMake处理依赖排序比较繁琐,可以补充百行以内的Python脚本做依赖拓扑排序,核心构建逻辑还是走CMake preset,和你偏好的技术栈一致,不会引入额外复杂度。

内容的提问来源于stack exchange,提问作者jacky la mouette

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 08:24:06