CMake中的命令cmake_minimum_required用于设定需要的最低版本的CMake。其格式如下:

cmake_minimum_required(VERSION <min>[...<policy_max>] [FATAL_ERROR])

可选的<policy_max>项在3.12版本中引入。设置project所需的最低cmake版本,还会更新policy设置。<min>和可选的<policy_max>都是major.minor[.patch[.tweak]]形式的CMake版本,而"..."是literal,低版本和高版本之间的连接符号。
      如果CMake运行的版本低于<min>要求的版本,它将停止处理project并报告错误。如果指定可选的<policy_max>版本,它必须至少是<min>版本并影响Policy Settings中所述的policy设置。如果CMake的运行版本低于3.12(older than 3.12),则额外的"..."点将被视为版本组件分隔符(version component separator),导致...<policy_max>部分被忽略并保留基于<min>的policy的3.12之前的行为。

# cmake_minimum_required(VERSION 3.24) # CMake Error at test_cmake_minimum_required.cmake:8 (cmake_minimum_required):
#                                      #   CMake 3.24 or higher is required.  You are running version 3.22.1cmake_minimum_required(VERSION 3.12...3.24) # 由于当前CMake运行版本为3.22,因此...3.24会被忽略

此命令会将CMAKE_MINIMUM_REQUIRED_VERSION变量的值设置为<min>

cmake_minimum_required(VERSION 3.13)
message("CMAKE_MINIMUM_REQUIRED_VERSION: ${CMAKE_MINIMUM_REQUIRED_VERSION}") # CMAKE_MINIMUM_REQUIRED_VERSION: 3.13

FATAL_ERROR选项被CMake 2.6及更高版本接受但被忽略(accepted but ignored)。当CMake版本为2.4或更低版本时应该指定它,此时会fail并触发error,而不仅仅是warning。

cmake_minimum_required(VERSION 3.14 FATAL_ERROR) # FATAL_ERROR被忽略
cmake_minimum_required(VERSION 2.4 FATAL_ERROR) # 指定版本为2.4或更低版本时,好像并不会触发error,仍然是warning,应该是指的当前CMake的运行版本为2.4或更低版本时会触发error# CMake Deprecation Warning at test_cmake_minimum_required.cmake:17 (cmake_minimum_required):#   Compatibility with CMake < 2.8.12 will be removed from a future version of CMake.

注意:
      (1).在调用project命令之前,在顶层(top-level)CMakeLists.txt文件的开头调用cmake_minimum_required命令。在调用可能影响其行为的其它命令之前,建立(establish)版本和policy设置是非常重要的。
      (2).在function内调用cmake_minimum_required会限制调用此function时对function范围的一些影响。例如,CMAKE_MINIMUM_REQUIRED_VERSION变量不会在调用范围内设置。function不会引入自己的policy范围,因此调用者的policy设置会受到影响。通常,不鼓励在function调用cmake_minimum_required。如果在function内调用cmake_minimum_required,那么此命令只在function内起作用。

function(foo)cmake_minimum_required(VERSION 3.14) # 在function内调用cmake_minimum_required,则cmake_minimum_required只在此function内起作用message("CMAKE_MINIMUM_REQUIRED_VERSION: ${CMAKE_MINIMUM_REQUIRED_VERSION}") # CMAKE_MINIMUM_REQUIRED_VERSION: 3.14
endfunction()message("CMAKE_MINIMUM_REQUIRED_VERSION: ${CMAKE_MINIMUM_REQUIRED_VERSION}") # CMAKE_MINIMUM_REQUIRED_VERSION: 3.22
foo()
message("CMAKE_MINIMUM_REQUIRED_VERSION: ${CMAKE_MINIMUM_REQUIRED_VERSION}") # CMAKE_MINIMUM_REQUIRED_VERSION: 3.22

Policy Settings:
      cmake_minimum_required(VERSION)命令隐式调用cmake_policy(VERSION)命令来指定当前project code是为给定的CMake版本范围而写的(is written for the given range of CMake versions)。CMake的运行版本已知的所有policy,并在<min>(或<policy_max>,如果指定)版本或更早版本中引入的所有policy都将设置为使用NEW行为。更高版本中引入的所有policy均未设置(unset)。这有效请求了给定CMake版本的首选行为(behavior preferred),并告诉较新的CMake版本警告其新policy。
      当指定的<min>版本高于2.4时,该命令会隐式调用:cmake_policy(VERSION <min>[...<max>]),它根据指定的版本范围设置CMake policy。
      当指定的<min>版本为2.4,或更低版本时,该命令会隐式调用:cmake_policy(VERSION 2.4[...<max>]),这为CMake 2.4及更低版本启用兼容功能(compatibility features)。

cmake_minimum_required(VERSION 3.14...3.20)
message("CMAKE_MINIMUM_REQUIRED_VERSION: ${CMAKE_MINIMUM_REQUIRED_VERSION}") # CMAKE_MINIMUM_REQUIRED_VERSION: 3.14
# cmake_policy(GET CMP0139 var) # 3.24
#                               # CMake Error at test_cmake_minimum_required.cmake:32 (cmake_policy):
#                               #   cmake_policy GET given policy "CMP0139" which is not known to this version of CMake
cmake_policy(GET CMP0081 var) # 3.13
message("var: ${var}") # var: NEW
cmake_policy(GET CMP0126 var) # 3.21
message("var: ${var}") # var:
cmake_policy(GET CMP0108 var) # 3.18
message("var: ${var}") # var: NEWcmake_minimum_required(VERSION 3.14)
message("CMAKE_MINIMUM_REQUIRED_VERSION: ${CMAKE_MINIMUM_REQUIRED_VERSION}") # CMAKE_MINIMUM_REQUIRED_VERSION: 3.14
cmake_policy(GET CMP0126 var) # 3.21
message("var: ${var}") # var:

执行上述测试代码需要3个文件:build.sh, CMakeLists.txt, test_cmake_minimum_required.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 cmake_minimum_required project include \string)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_minimum_required.cmake:为上面的所有示例代码

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

GitHub: http://github.com/fengbingchun/Linux_Code_Test

CMake中cmake_minimum_required的使用相关推荐

  1. CMake中的ARGC ARGV 和ARGN参数意义

    编写或者查看一些开源cmake文件中经常遇到在宏(macro)和函数中经常会遇到ARGC ARGV 和ARGN等参数,该参数为cmake中专用变量,分别表示宏或者函数参数中的特殊意义. ARGC AR ...

  2. CMake中file的使用

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

  3. CMake中foreach的使用

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

  4. CMake中执行shell命令之execute_process、add_custom_target和add_custom_command

    背景 以下情况可能需要在CMake中执行shell脚本: cmake未提供的功能而实际构建中又需要时,如获取Linux发行版本 项目构建时需要执行脚本才能完成,如boost构建过程 有的需要shell ...

  5. CMake中option和cmake_dependent_option的使用

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

  6. CMake中target_compile_features的使用

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

  7. CMake中macro的使用

    在https://blog.csdn.net/fengbingchun/article/details/127144948 中介绍了CMake中function的使用,这里介绍下macro的使用,它与 ...

  8. CMake中set/unset的使用

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

  9. CMake中include的使用

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

  10. CMake中link_directories/target_link_directories的使用

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

最新文章

  1. python工程师证书-【一个合格的Python工程师需要达到怎样的编程水平】
  2. DOM_06之定时器、事件、cookie
  3. Matlab:成功解决Expression or statements is incorrect--possibly unbalanced (,{,[.
  4. SpringBoot+gradle+idea实现热部署和热加载
  5. 字符串原样输出程序python_Python格式化字符串(格式化输出)
  6. 银行卡突然收到500万银行会监控吗?
  7. (0.1)鸿蒙HarmonyOS开发工具DevEco Studio设置
  8. java 获取oracle表结构_获取Oracle中所有表的列表?
  9. 12分钟训练COCO模型!速度精度双提高
  10. windows和linux下读取文件乱码的终极解决办法!
  11. onclick 事件
  12. HBaseRegionServer宕机数据恢复
  13. hdu 2527 Safe Or Unsafe
  14. 手机自动化测试的原理
  15. Android修炼之道—布局优化( 100 喵喵币)
  16. 致远SPM之CAP数据分析解决方案
  17. 硕士毕业去一线城市的企业好,还是去三线城市做公务员好?
  18. 服务器安全加固三件套
  19. 鼠标划过显示鼠标移出隐藏效果
  20. Bili视频弹幕播放器后台源码

热门文章

  1. python图形化界面设计gui_Python图形界面GUI程序设计
  2. 如何利用Tempo BI大数据分析工具快速完成数据同环比分析?
  3. storm风暴英雄 tempo_风暴英雄Tempo Storm 安娜版本天梯环境速报 安娜强度居T3
  4. [精简]托福核心词汇20
  5. 新东方托福词汇(List 01 ~ List 05)
  6. wow.js动画插件
  7. java 判断 string null_java 字符串为null 如何判断
  8. Linux系统磁盘分区格式MBR格式转换GPT
  9. 压力换算公斤单位换算_压力单位换算表
  10. Word文件带密码如何解除?