如何检测CMake中使用了指定最低版本不支持的新特性?
如何检测CMakeLists.txt中使用了指定最低版本不支持的特性?
先看一个典型场景:
有如下CMakeLists.txt文件:
cmake_minimum_required(VERSION 3.10) project(foo) add_executable(foo foo.cpp) add_compile_definitions(BAR=123)
其中add_compile_definitions是CMake 3.12新增的命令,但文件里指定的最低支持版本是3.10。用3.10版本CMake处理时会直接报错:
CMake Error at CMakeLists.txt:4 (add_compile_definitions): Unknown CMake command "add_compile_definitions".
但用3.12及以上版本CMake构建时不会有任何错误或警告,导致高版本环境下无法提前发现这个兼容性问题。修改旧代码库时很容易遇到这类情况。
针对这个问题,有几种可行的检测方式,不用只能依赖安装指定版本CMake:
1. 用目标最低版本的CMake直接构建(最可靠)
这是最准确的方式,只有对应版本的CMake才能精准识别自身不支持的命令、变量或特性。如果不想在本地安装多个版本,可以用Docker容器快速切换:拉取对应版本的CMake镜像,挂载代码目录后运行cmake配置命令,就能直接看到兼容性问题。
2. 用高版本CMake的警告参数增强检测
高版本CMake(3.19及以上)提供了--warn-dev参数,会对使用了高于cmake_minimum_required指定版本的特性发出警告。在高版本环境下运行:
cmake .. --warn-dev
就能提前发现代码中使用了低版本不支持的命令,不用切换到旧版本CMake。
3. 使用静态检查工具
比如cmake-lint(属于cmake-format工具集),可以静态扫描CMakeLists.txt,指定目标CMake版本后,直接找出不符合版本要求的代码点。安装后运行:
cmake-lint --cmake-version 3.10 CMakeLists.txt
它会列出所有使用了3.10版本不支持的命令、变量等内容。
另外,修改旧代码库时,还可以在CI流程中加入低版本CMake的构建检查,从源头避免这类问题。如果要主动兼容不同版本,也可以在代码中加入版本判断:
cmake_minimum_required(VERSION 3.10) project(foo) add_executable(foo foo.cpp) if(CMAKE_VERSION VERSION_LESS 3.12) add_compile_options(-DBAR=123) else() add_compile_definitions(BAR=123) endif()
内容的提问来源于stack exchange,提问作者kakkoko
相关产品推荐
相关产品推荐

