CMake如何将通用编译器配置抽离为共享脚本供多C++项目使用
结论
这段编译器配置应当封装为CMake模块,这是CMake生态下跨项目共享编译规则的标准实现方案,具体操作步骤如下:
操作步骤
1. 抽离配置为独立CMake模块
新建一个独立的Git仓库用于托管公共CMake配置(比如仓库命名为common-cmake-modules),在仓库中创建模块文件CompilerConfig.cmake,将你现有的编译器配置代码放入该文件即可,也可以按现代CMake规范优化原有代码:
if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") # using Clang elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") # 使用GCC的优化写法,避免旧接口的兼容性问题 add_compile_options(-Wall -Wextra -Wno-unused-function -pedantic) find_package(Threads REQUIRED) elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Intel") # using Intel C++ elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC") # using Visual Studio C++ add_compile_options("/Zc:__cplusplus" "/W4") add_compile_definitions(_UNICODE) add_compile_options("/MP") endif()
如果不想配置全局生效,也可以把上述逻辑封装为函数,仅对指定目标生效,避免配置泄露到引入的第三方依赖中。
2. 三个项目引入公共模块
针对你三个项目独立托管的场景,最轻量化的引入方式是用Git子模块:
- 在A、B、C三个项目的根目录下,将公共CMake模块仓库添加为子模块,存放路径统一为
cmake/modules - 在三个项目的
CMakeLists.txt中,project()指令之后、定义编译目标之前,加入以下代码引入模块:
# 添加公共CMake模块的搜索路径 set(CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake/modules" ${CMAKE_MODULE_PATH}) # 引入编译器配置 include(CompilerConfig)
后续如果要修改编译配置,只需要修改公共模块仓库的内容,三个项目各自更新子模块即可同步配置,不用逐个修改每个仓库的代码。
其他可选引入方案
如果你的团队已经有内部CMake包管理体系,也可以把公共模块打包为标准CMake包,上传到内部包源,三个项目直接用find_package(CommonCompilerConfig REQUIRED)引入即可,适合多项目规模更大的场景使用。
内容的提问来源于stack exchange,提问作者Dmitriano
相关产品推荐
相关产品推荐

