CMake中cmake_minimum_required的使用
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的使用相关推荐
- CMake中的ARGC ARGV 和ARGN参数意义
编写或者查看一些开源cmake文件中经常遇到在宏(macro)和函数中经常会遇到ARGC ARGV 和ARGN等参数,该参数为cmake中专用变量,分别表示宏或者函数参数中的特殊意义. ARGC AR ...
- CMake中file的使用
CMake中的file命令用于文件操作,其文件格式如下:此命令专用于需要访问文件系统的文件和路径操作 Readingfile(READ <filename> <variable> ...
- CMake中foreach的使用
CMake中的foreach命令为list中的每个值评估一组命令(Evaluate a group of commands for each value in a list),其格式如下:其中< ...
- CMake中执行shell命令之execute_process、add_custom_target和add_custom_command
背景 以下情况可能需要在CMake中执行shell脚本: cmake未提供的功能而实际构建中又需要时,如获取Linux发行版本 项目构建时需要执行脚本才能完成,如boost构建过程 有的需要shell ...
- CMake中option和cmake_dependent_option的使用
CMake中的option命令为用户提供可以选择的布尔选项(boolean option),其格式如下: option(<variable> "<help_text> ...
- CMake中target_compile_features的使用
CMake中的target_compile_features命令用向target添加预期的编译器功能(compiler features),其格式如下: target_compile_features ...
- CMake中macro的使用
在https://blog.csdn.net/fengbingchun/article/details/127144948 中介绍了CMake中function的使用,这里介绍下macro的使用,它与 ...
- CMake中set/unset的使用
CMake中的set命令用于将普通.缓存或环境变量(normal, cache, or environment variable)设置为给定值,其格式如下:指定<value>...占位符( ...
- CMake中include的使用
CMake中的include命令用于从文件或模块(file or module)加载并运行CMake code.其格式如下: include(<file|module> [OPTIONAL ...
- CMake中link_directories/target_link_directories的使用
CMake中的link_directories命令用于添加目录使链接器能在其查找库(add directories in which the linker will look for librarie ...
最新文章
- python工程师证书-【一个合格的Python工程师需要达到怎样的编程水平】
- DOM_06之定时器、事件、cookie
- Matlab:成功解决Expression or statements is incorrect--possibly unbalanced (,{,[.
- SpringBoot+gradle+idea实现热部署和热加载
- 字符串原样输出程序python_Python格式化字符串(格式化输出)
- 银行卡突然收到500万银行会监控吗?
- (0.1)鸿蒙HarmonyOS开发工具DevEco Studio设置
- java 获取oracle表结构_获取Oracle中所有表的列表?
- 12分钟训练COCO模型!速度精度双提高
- windows和linux下读取文件乱码的终极解决办法!
- onclick 事件
- HBaseRegionServer宕机数据恢复
- hdu 2527 Safe Or Unsafe
- 手机自动化测试的原理
- Android修炼之道—布局优化( 100 喵喵币)
- 致远SPM之CAP数据分析解决方案
- 硕士毕业去一线城市的企业好,还是去三线城市做公务员好?
- 服务器安全加固三件套
- 鼠标划过显示鼠标移出隐藏效果
- Bili视频弹幕播放器后台源码
热门文章
- python图形化界面设计gui_Python图形界面GUI程序设计
- 如何利用Tempo BI大数据分析工具快速完成数据同环比分析?
- storm风暴英雄 tempo_风暴英雄Tempo Storm 安娜版本天梯环境速报 安娜强度居T3
- [精简]托福核心词汇20
- 新东方托福词汇(List 01 ~ List 05)
- wow.js动画插件
- java 判断 string null_java 字符串为null 如何判断
- Linux系统磁盘分区格式MBR格式转换GPT
- 压力换算公斤单位换算_压力单位换算表
- Word文件带密码如何解除?