Modern CMake能否通过CMakePresets.json实现外部项目批量构建?
纯CMake落地方案
你需要的「新增依赖仅新增对应目录、不改动现有逻辑」的需求,完全可以基于CMake原生功能实现,不需要复杂的跨项目变量传递:
- 要求所有子库目录下必须有
CMakePresets.json(你示例里的txt属于笔误,preset标准格式为json),文件内自行配置该库的源码地址、Git标签、编译参数、安装路径等所有专属配置,根目录逻辑完全不需要感知子库的实现细节 - 根目录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})
- 子库目录下甚至不需要额外写CMakeLists.txt,直接在preset的
cacheVariables里配置FetchContent拉取对应源码的逻辑即可,增删依赖只需要新增/删除对应目录,完全不会影响现有构建逻辑。
CI/CD适配逻辑
- 流水线按目标平台分别执行构建,不同架构的编译产物输出到带平台标识的目录,打包为
库名-版本号-平台架构命名格式的压缩包 - 内部使用侧可以直接对接内部制品库,按名称和版本检索下载对应平台的预编译包即可。
可选优化方案
如果后续出现依赖嵌套的场景(比如A库依赖B库),纯CMake处理依赖排序比较繁琐,可以补充百行以内的Python脚本做依赖拓扑排序,核心构建逻辑还是走CMake preset,和你偏好的技术栈一致,不会引入额外复杂度。
内容的提问来源于stack exchange,提问作者jacky la mouette
相关产品推荐
相关产品推荐

