CMake:为多个外部项目批量配置ProjectSettings.cmake的通配符方案
解决多外部项目传递ProjectSettings.cmake的重复配置问题
首先得明确:没有通配符可以替代CMAKE_PROJECT_
不过你不用重复编写这段配置,我们可以通过自定义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
相关产品推荐
相关产品推荐

