CMake中的命令cmake_policy用于管理CMake策略设置(Manage CMake Policy settings)。它通常被添加到project的CMakeLists.txt文件中,以改变CMake本身的行为,通常能够用新版本的CMake处理旧版本CMakeLists.txt features
      CMake从2.6版本开始,每次发布的版本都会引入新的policy,格式为CMP<NNNN>,其中<NNNN>是CMake policy编号,一个整数索引,从0000开始逐次+1。policy从2.6版本的CMP0000开始,到3.24版本时最新的policy为CMP0139。
      CMake中的policy用于跨多个版本保持向后兼容的行为当引入新policy时,较新的CMake版本将开始警告向后兼容的行为。可以通过显式请求OLD或使用cmake_policy命令向后兼容的行为来禁用警告。也可以为policy请求NEW或非向后兼容的行为,也可以避免警告。每个policy也可以使用CMAKE_POLICY_DEFAULT_CMP<NNNN>变量在命令行上显示设置为NEW或OLD行为
      policy几乎不应该设置为OLD。每个policy的OLD行为都是不可取的,将在未来版本中替换为错误条件
      如果使用太旧的CMake版本来构建project,cmake_minimum_required命令不仅会报告错误,它还将CMake版本或更早版本中引入的所有policy设置为NEW行为。要在不增加所需的最低CMake版本的情况下(without increasing the minimum required CMake version)管理policy,可以使用if(POLICY)命令,如下:这具有将NEW行为与用户可能正在使用的较新CMake版本一起使用的效果,并且不发出兼容性警告

if(POLICY CMP0139) # 3.24, 当前的CMake是否设置了指定的policymessage("set policy cmp0139")cmake_policy(SET CMP0139 NEW)
else()message("no set policy cmp0139")# cmake_policy(SET CMP0139 OLD) # CMake Error at test_cmake_policy.cmake:48 (cmake_policy):#   Policy "CMP0139" is not known to this version of CMake.
endif()if(POLICY CMP0076) # 3.13message("set policy cmp0076")cmake_policy(SET CMP0076 NEW)cmake_policy(SET CMP0076 OLD) # CMake Deprecation Warning at test_cmake_policy.cmake:55 (cmake_policy):#   The OLD behavior for policy CMP0076 will be removed from a future version of CMake.
endif()

在某些情况下,policy的设置仅限于不传播到父范围(not propagate to the parent scope)。例如,如果include命令或find_package命令读取的文件包含对cmake_policy的使用,则默认情况下该policy不会影响调用者。两个命令都接受可选的NO_POLICY_SCOPE关键字来控制此行为。
      CMAKE_MINIMUM_REQUIRED_VERSION变量也可用于决定当使用已弃用的macro或function时是否触发error。

CMake policy机制旨在帮助在新版本的CMake引入行为变化时保持现有project的构建每个新policy(行为变化,behavioral change)都被赋予一个CMP<NNNN>形式的标识符,其中<NNNN>是一个整数索引,CMake policy编号。与每项policy相关的文档描述了OLD和NEW行为以及引入policy的原因。project可以设置每个policy来选择所需的行为。当CMake需要知道使用哪种行为时,它会检查project指定的设置。如果没有可用的设置,则假定为OLD行为,并生成警告要求设置policy。

通过CMake Version设置policy:cmake_policy命令用于将policy设置为OLD或NEW行为。虽然支持单独设置policy,但鼓励project根据CMake版本设置policy。

cmake_policy(VERSION <min>[...<max>])

<min>和可选的<max>都是major.minor[.patch[.tweak]]形式的CMake版本,而"..."是文字(literal)。<min>版本必须至少为2.4且最多为CMake的运行版本(running version)。如果指定<max>版本,则必须至少是<min>版本,但可能超过CMake的运行版本。如果CMake运行版本低于3.12,则额外的"..."点将被视为版本组件分隔符(version component separators)。

# cmake_policy(VERSION 2.3) # CMake Error at test_cmake_policy.cmake:8 (cmake_policy):
#                           #   Compatibility with CMake < 2.4 is not supported by CMake >= 3.0.  For
#                           #   compatibility with older versions please use any CMake 2.8.x release or lower.cmake_policy(VERSION 3.1...3.24)

CMake的运行版本已知的所有policy(policies),包括在<min>(或<max>,如果指定)版本或更早版本中引入的所有policy都将设置为使用NEW行为。更高版本中引入的所有policy都将取消设置(除非CMAKE_POLICY_DEFAULT_CMP<NNNN>变量设置了默认值)。这有效地请求了给定CMake版本的首选行为,并告诉较新的CMake版本警告它们的新policy。
      注意:cmake_minimum_required(VERSION)命令也隐式调用cmake_policy(VERSION)

​​​​​​​明确设置policy:policy的OLD行为根据定义已被弃用,并且可能会在CMake的以后版本中被删除。告诉CMake对给定policy使用OLD或NEW行为。依赖于给定policy的旧行为的project可以通过将policy状态设置为OLD来使policy警告静默(silence)。或者,可以修复project以使用新行为并将policy状态设置为NEW。

# cmake_policy(SET CMP0138 NEW) # 3.24
#                               # CMake Error at test_cmake_policy.cmake:14 (cmake_policy):
#                               #   Policy "CMP0138" is not known to this version of CMakecmake_policy(SET CMP0128 NEW) # 3.22
cmake_policy(SET CMP0065 OLD) # 3.4# CMake Deprecation Warning at test_cmake_policy.cmake:19 (cmake_policy):#   The OLD behavior for policy CMP0065 will be removed from a future version of CMake

​​​​​​​检查policy设置:检查给定policy是否设置为OLD或NEW行为。如果设置了policy,则输出<variable>值将为OLD或NEW,否则为空。

cmake_policy(GET CMP0127 var) # 3.22
message("var: ${var}") # var: NEW# cmake_policy(GET CMP0138 var) # 3.24
#                               # CMake Error at test_cmake_policy.cmake:26 (cmake_policy):
#                               #   cmake_policy GET given policy "CMP0138" which is not known to this version of CMake.cmake_policy(GET CMP0045 var) # 3.1
message("var: ${var}") # var: NEWcmake_policy(SET CMP0065 OLD) # 3.4# CMake Deprecation Warning at test_cmake_policy.cmake:33 (cmake_policy):#   The OLD behavior for policy CMP0065 will be removed from a future version of CMake.
cmake_policy(GET CMP0065 var) # 3.4
message("var: ${var}") # var: OLD

​​​​​​​CMake policy堆栈(stack):CMake将policy设置保留在堆栈上,因此cmake_policy命令所做的更改只影响堆栈的顶部(the top of the stack)。每个子目录自动管理在policy堆栈上的新条目(new entry),以保护其父目录和兄弟目录。CMake还为include和find_package命令加载的脚本管理一个新条目,使用NO_POLICY_SCOPE选项(请参阅policy CMP0011)调用时除外。cmake_policy命令提供了一个接口来管理policy堆栈上的自定义条目(custom entry):

cmake_policy(PUSH)
# other operate ...
cmake_policy(POP)

​​​​​​​每个PUSH必须有一个匹配的POP来删除任何更改。这对于临时更改policy设置很有用。调用cmake_minimum_required(VERSION), cmake_policy(VERSION), 或cmake_policy(SET)命令只影响policy堆栈的当前顶部。
      ​​​​​​​由function和macro命令创建的命令在创建时记录policy设置,并在调用它们时使用预记录(pre-record)policy。如果function或macro实现设置了policy,则更改会自动通过调用者向上传播,直到它们到达最近的嵌套policy堆栈条目为止。

​​​​​​​ 执行上述测试代码需要3个文件:build.sh, CMakeLists.txt, test_cmake_policy.cmake

​​​​​​​build.sh内容如下:

#! /bin/bash# supported input parameters(cmake commands)
params=(function macro cmake_parse_arguments \find_library find_path find_file find_program find_package \cmake_policy)usage()
{echo "Error: $0 needs to have an input parameter"echo "supported input parameters:"for param in ${params[@]}; doecho "  $0 ${param}"doneexit -1
}if [ $# != 1 ]; thenusage
fiflag=0
for param in ${params[@]}; doif [ $1 == ${param} ]; thenflag=1breakfi
doneif [ ${flag} == 0 ]; thenecho "Error: parameter \"$1\" is not supported"usageexit -1
fiif [[ ! -d "build" ]]; thenmkdir buildcd build
elsecd build
fiecho "==== test $1 ===="
cmake -DTEST_CMAKE_FEATURE=$1 ..

​​​​​​​CMakeLists.txt内容如下:

cmake_minimum_required(VERSION 3.22)
project(cmake_feature_usage)message("#### current cmake version: ${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}.${CMAKE_PATCH_VERSION}")
include(test_${TEST_CMAKE_FEATURE}.cmake)
message("==== test finish ====")

​​​​​​​test_cmake_policy.cmake内容:为上面所有的示例代码

​​​​​​​执行可能的结果如下图所示:

GitHub: https://github.com/fengbingchun/Linux_Code_Test​​​​​​​

CMake中cmake_policy的使用相关推荐

  1. CMake中file的使用

    CMake中的file命令用于文件操作,其文件格式如下:此命令专用于需要访问文件系统的文件和路径操作 Readingfile(READ <filename> <variable> ...

  2. CMake中foreach的使用

    CMake中的foreach命令为list中的每个值评估一组命令(Evaluate a group of commands for each value in a list),其格式如下:其中< ...

  3. CMake中option和cmake_dependent_option的使用

    CMake中的option命令为用户提供可以选择的布尔选项(boolean option),其格式如下: option(<variable> "<help_text> ...

  4. CMake中target_compile_features的使用

    CMake中的target_compile_features命令用向target添加预期的编译器功能(compiler features),其格式如下: target_compile_features ...

  5. CMake中include指令用法介绍

    转载于:  https://blog.csdn.net/liitdar/article/details/81144461 本文主要介绍CMake中include指令的用法. 1 概述 引用CMake官 ...

  6. CMake中set/unset的使用

    CMake中的set命令用于将普通.缓存或环境变量(normal, cache, or environment variable)设置为给定值,其格式如下:指定<value>...占位符( ...

  7. CMake中include的使用

    CMake中的include命令用于从文件或模块(file or module)加载并运行CMake code.其格式如下: include(<file|module> [OPTIONAL ...

  8. CMake中link_directories/target_link_directories的使用

    CMake中的link_directories命令用于添加目录使链接器能在其查找库(add directories in which the linker will look for librarie ...

  9. CMake中find_package的使用

    CMake中的命令find_package用于查找指定的package. find_package支持两种主要的搜索方法:注意:<PackageName>是区分大小写的       (1) ...

最新文章

  1. [蓝桥杯2018初赛]第几天-日期计算(水题)
  2. java 名词解释等
  3. 【英语学习】【English L06】U03 House L1 What type of apartment do you want to rent?
  4. 只有程序员才看得懂的情书
  5. 你竟是这样的月饼-今年中秋节折腾的月饼2.0
  6. 本硕一致计算机科学与技术专业介绍,哈尔滨理工大学计算机科学与技术专业介绍...
  7. ORACLE1.8-序列
  8. ModuleNotFoundError: No module named ‘torchversion‘
  9. ACM 学习笔记(四) 数据结构之树、二叉树、完全二叉树、二叉查找树、AVL树、红黑树、B树、B+树
  10. 机器视觉知识汇总(持续更新)
  11. Win10重装系统后的lockdir解密失败
  12. 联想ts250进bios_联想ts240怎么进bios
  13. 汽车之家口啤数据爬虫
  14. Box2D例子——打砖块
  15. 使用python绘制图形入门教程
  16. linux终端关闭xmanager,xmanager功能和设置
  17. jquery ajax content type,JQuery ajax的contentType
  18. Flutter 实现切角渐变矩形
  19. 史上最直白的RNN详解(结合torch的example)
  20. Java编程语言介绍

热门文章

  1. 三星手机邮箱发送服务器设置,三星手机设置-更多-Coremail论客邮件系统-企业邮箱,10亿用户信赖的邮件服务器系统...
  2. 【MBSE】MBSE驱动的E/E架构开发的优势
  3. MUSBMHDRC USB 2.0 MULTI-POINT DUAL-ROLE CONTROLLER编程指南解读2
  4. 后端Java一年经验面经--其他篇
  5. matlab 怎么画弯矩,如何用matlab 绘制简支梁剪力图弯矩图
  6. 快速多人游戏(4) - 爆头!(AKA延迟补偿)
  7. 技嘉固件组件可被滥用为后门,影响700万台设备,易触发供应链攻击
  8. 如何在MAC上安装并运行Web漏洞扫描器Arachni
  9. 一个完整的URL 解析过程
  10. Black tea=红茶