cmake:cmake策略

cmake在添加新特性之后可能不会完全兼容旧的CMake版本,这就导致了在新版本的CMake使用旧的 CMakeLists 文件时可能会存在一些问题。策略大的引入就是帮助用户和开发者解决这些问题,它是CMake中用来改善向后兼容性和追踪兼容性的一种机制。CMake中的所有策略都被赋予一个CMPNNNN格式的识别符,其中NNNN时一个整数值

策略通常既保留了用于保持旧版本兼容性的旧行为,又包含了让用户在新项目中优先使用的正确的新行为。每个策略相关的文档都会描述旧行为和新行为,以及引入该策略的原因。

设置策略

工程可以设置各种策略来选择新的或旧的行为。当 CMake 遇到会被特殊策略影响的用户代码时,它会检查工程是否设置了策略。如果没有设置策略,工程会使用旧行为,并会给出警告要求项目作者设置工程的策略。

有许多方法设置一个策略的行为,最快速的方式是设置所有的策略版本与编写项目的 CMake 版本一致,设置策略的版本会获取所有指定的版本或更早的版本中引入的策略。所有指定的版本之后引入的策略会标记为未设置,这是为了输出这些新策略合适的警告信息。设置策略版本的命令为:

cmake_policy (VERSION major.minor[.patch[.tweak]])

同时,cmake_minimum_required 命令也会设置策略的版本,该命令用在 CMakeLists 文件的最顶端。一个 CMakeLists 文件开始的几行通常为如下所示:

cmake_minimum_required (VERSION 2.6)
project (projectname)
#...code using CMake 2.6 policies

每个策略也可以单独设置,cmake_policy 命令的 SET 选项可以用来明确地指定一个特定策略是使用新的行为还是旧的行为。

cmake_policy (SET CMPNNNN OLD)

使用 OLD 选项的 cmake_policy 命令明确告诉 CMake 使用策略的旧行为。

cmake_policy (SET CMPNNNN NEW)

使用 NEW 选项的 cmake_policy 命令明确告诉 CMake 使用策略的新行为。

设置栈

CMake 将策略设置保存在一个栈结构中,当进入一个项目的子目录时,就会在策略栈中入栈新的一层元素,离开子目录时就会出栈这层元素。因此在一个项目的子目录中设置策略并不会影响父目录以及同层路径,但会影响子目录。这在一个项目包含了多个分别维护的子目录但在一起编译时非常有用,它可以让不同的子目录使用不同的策略版本。用户可以使用 cmake_policy 命令来入栈出栈自己的临时策略层,只要入栈和出栈是成对出现的,这对于临时对一小段代码改变策略设置时
比较有用。

cmake_policy (PUSH)
#change cmake policy
#do something
cmake_policy (POP)

升级项目到新版本的 CMake

当新版本的 CMake 引入了新的策略时,一些旧的项目可能会产生提示信息用来指示项目需要进行修改来适应新的策略。有两种方法将旧项目进行策略版本升级:一次性方法和增量式方法。采用哪种方式取决于项目的规模以及新策略产生的提示信息。

一次性方法

将一个项目升级到新版的 CMake 最简单的方法是修改项目 CMakeLists 文件最开头的策略版本,尝试使用最新版本的 CMake 进行编译并修复问题。例如命令:

cmake_minimum_required (VERSION 2.8)

以上命令告诉 CMake 对每个策略使用2.8以及之前版本的引入的新行为。当使用 CMake 2.8 来编译项目时策略不会产生任何提示信息因为没有任何新的策略在后来的版本中引入。但是如果这个项目依赖某个策略的旧行为时编译可能不会成功,因为 CMake 现在使用的时没有提醒的新行为。

增量式方法

将项目升级到新的 CMake 版本的另一个方法是根据提示信息一个一个的进行修改,这个方法的优点是项目在这个过程中可以持续的编译,所以这个修改是增量式的。当 CMake 遇到需要确定使用策略的旧行为还是新行为的情形时,CMake 获取检查项目是否设置了这个策略,如果设置了 CMake 就使用设定的行为,如果没有设置,CMake 会使用旧的行为并提示策略没有设置。

猜你喜欢

转载自blog.csdn.net/zhizhengguan/article/details/115322913