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

CMake:为多个外部项目批量配置ProjectSettings.cmake的通配符方案

解决多外部项目传递ProjectSettings.cmake的重复配置问题

首先得明确:没有通配符可以替代CMAKE_PROJECT__INCLUDE中的部分,因为这个变量是完全针对每个外部项目的名称来定义的——每个外部项目在CMake中都会有自己的项目名,对应的CMAKE_PROJECT_xxx_INCLUDE变量也必须匹配这个名称才能生效。

不过你不用重复编写这段配置,我们可以通过自定义CMake函数来封装重复逻辑,让代码更简洁。下面是具体的实现思路:


步骤1:定义通用CMAKE_ARGS变量

先把所有外部项目共享的CMake参数统一定义好:

set(COMMON_CMAKE_ARGS
  "-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}"
  "-DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}"
  "-DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}"
  # 这里可以添加其他所有外部项目都需要的通用参数
)

步骤2:封装自定义函数自动生成项目专属参数

创建一个自定义函数,它会接收外部项目的名称,自动生成对应的CMAKE_PROJECT_xxx_INCLUDE参数,然后和通用参数合并后传递给ExternalProject_Add:

function(add_my_external_project PROJECT_NAME)
  # 动态生成当前项目专属的INCLUDE参数
  set(PROJECT_INCLUDE_ARG "-DCMAKE_PROJECT_${PROJECT_NAME}_INCLUDE=${CMAKE_CURRENT_SOURCE_DIR}/ProjectSettings.cmake")
  
  # 合并通用参数和项目专属参数
  set(COMBINED_CMAKE_ARGS ${COMMON_CMAKE_ARGS} ${PROJECT_INCLUDE_ARG})
  
  # 调用原生ExternalProject_Add,传入合并后的参数和其他自定义配置
  ExternalProject_Add(${PROJECT_NAME}
    ${ARGN}
    CMAKE_ARGS ${COMBINED_CMAKE_ARGS}
  )
endfunction()

步骤3:使用自定义函数添加外部项目

现在添加每个外部项目时,只需要调用我们的自定义函数,传入项目名称和该项目特有的配置(比如仓库地址、版本标签等)即可,不用再重复写INCLUDE参数:

# 添加第一个外部项目
add_my_external_project(MyExternalProject1
  GIT_REPOSITORY "https://example.com/repo1.git"
  GIT_TAG "v1.0"
  # 这里放该项目专属的其他配置
)

# 添加第二个外部项目
add_my_external_project(MyExternalProject2
  URL "https://example.com/repo2.zip"
  URL_HASH SHA256=abcdef123456...
  # 这里放该项目专属的其他配置
)

这样做的好处是:

  • 避免了重复编写CMAKE_PROJECT_xxx_INCLUDE的代码
  • 后续添加新的外部项目时,只需要调用这个函数,逻辑统一且易于维护
  • 如果需要修改ProjectSettings.cmake的路径,只需要在函数里改一次即可

内容的提问来源于stack exchange,提问作者Ganesh Sathyanarayanan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:18:11