CMake 在添加新特性后可能不会完全兼容旧的 CMake 版本,这导致了在新版本的 CMake 中使用旧的 CMakeLists 文件时可能会存在一些问题。策略的引入就是帮助用户和开发者解决这些问题,它是 CMake 中用来改善向后兼容性和追踪兼容性的一种机制。 CMake 中的所有策略都被赋予一个 CMPNNNN 格式的识别符,其中 NNNN 是一个整数值。策略通常既保留了用于保持旧版本兼容性的旧行为,又包含了让用户在新项目中优先使用的正确的新行为。每个策略相关的文档都会描述旧行为和新行为,以及引入该策略的原因。
1 设置策略
工程可以设置各种策略来选择新的或旧的行为。当 CMake 遇到会被特殊策略影响的用户代码时,它会检查工程是否设置了策略。如果没有设置策略,工程会使用旧行为,并会给出警告要求项目作者设置工程的策略。
有许多方法设置一个策略的行为,最快速的方式是设置所有的策略版本与编写项目的 CMake 版本一致,设置策略的版本会获取所有指定的版本或更早的版本中引入的策略。所有指定的版本之后引入的策略会标记为未设置,这是为了输出这些新策略合适的警告信息。设置策略版本的命令为:
cmake_policy (VERSION major.minor[.patch[.tweak]])
同时,cmake_minimum_required 命令也会设置策略的版本,该命令用在 CMakeLists 文件的最顶端。一个 CMakeLists 文件开始的几行通常为如下所示: