cmake流程控制---cmake数学计算操作和if命令

目录

cmake 数学计算操作

demo

if命令

基本表达式

逻辑表达式(NOT AND OR)

比较表达式

正则表达式

demo

文件系统相关

判断是否存在的表达式 


cmake 数学计算操作

有时候我们需要对cmake变量之间进行数学运算,这时候cmake提供了math()这个命令,命令格式如下:

math(EXPR outVar mathExpr [OUTPUT_FORMAT format])

这个命令也是很简单,直接通过cmake变量结合数学运算符组成mathExpr,然后将结果保存到outVar

中.

OUTPUT_FORMAT是可选参数,代表输出结果的格式,可以是

  • HEXADECIMAL:输出16进制结果.
  • DECIMAL:输出10进制结果

demo

message("-------------------------------")
set(x 3)
set(y 7)
math(EXPR zDec "(${x} + ${y}) * 2")
message("zDec = ${zDec}")
math(EXPR zDec "(${x} + ${y}) * 2" OUTPUT_FORMAT DECIMAL)
message("DECIMAL zDec = ${zDec}")
math(EXPR zDec "(${x} + ${y}) * 2" OUTPUT_FORMAT HEXADECIMAL)
message("HEXADECIMAL zDec = ${zDec}")

 

if命令

现在cmake的if()命令格式如下:

 if(<condition>)<commands>elseif(<condition>) # optional block, can be repeated<commands>else()              # optional block<commands>endif()

上述命令格式中,elseif和else是可选的,而且elseif可以有多个,但必须在else之前列出.

其中最重要的就是括号中的表达式,这个用来判断要走那个分支的关键.

基本表达式

if(value)
  • ON,YES,TRUE,Y视为真
  • OFF,NO,FALSE,N,IGNORE,NOTFOUND,空字符串,以-NOTFOUND结尾的字符串被视为假.
  • 如果是一个数字,将根据C语言的规则转换为bool值.
  • 如果上面三种情况都不适用,那该条件表达式将最为一个变量的名字.
    • 如果没有使用引号,那该变量的值会和为假的值对比,如果匹配上则为假,否则为真,如果其值是空字符串则为假.
    • 如果使用引号
      • cmake3.1及以后,如果该字符串不匹配任何为真的值,那该条件表达式为假.
      • cmake3.1以前,如果该字符串匹配到任何存在的变量名字,则会按照变量处理.
    • if(ENV{some_var})这种形式的条件表达式永远为假,所以不要使用环境变量

逻辑表达式(NOT AND OR)

if (NOT expressin)if (expression1 AND expression2)if (expression1 OR expression2)if (NOT (expression1 AND (expression2 OR expression3)))

比较表达式

if (value1 OPERATOR value2)
Number(数字)string(字符串)Version number(版本号)Path(路径)
LESS(小于)STRLESSVERSION_LESS
GREATER(大于)STRGEREATERVERSION_GREATER
EQUAL(等于)STREQUALVERSION_EQUALPATH_EQUAL
LESS_EQUAL(小于等于)STRLESS_EQUALVERSION_LESS_EQUAL
GREATER_EQUALSTRGREATER_EQUALVERSION_GREATER_EQUAL

版本号比较格式:major[.minor[.patch[.tweak]]]

正则表达式

if (value MATCHES regex)

demo

如果是Fred或者Barney执行if中的语句,否则执行else语句.

message("-------------------------------")
set(who "Fred")
if("Hi from ${who}" MATCHES "Hi from (Fred|Barney).*")message(STATUS "says Hello")
else()message(STATUS " 执行到这里")
endif()

 

文件系统相关

if (EXISTS pathFileOrDir)         #是否存在文件
if (IS_DIRCTORY pathToDir)        #是不是目录
if (IS_SYMLINK fileName)          #是不是符号链接
if (IS_ABSOLUTE path)             #是不是绝对路径              
if (file1 IS_NEWR_THAN file2)     #第一个文件是不是比第二个文件新

判断是否存在的表达式 

if (DEFINED name)                #有没有定义name这个变量
if (COMMAND name)                #有没有name这个命令
if (POLICY name)                 #有没有name这个策略
if (TARGET name)                 #有没有name这个目标
if (TEST name)                   #有没有name这个单元测试
if (value IN_LIST listVar)       #value这个值是不是在listVar这个列表里面
if (DEFINED SOMEVAR)             #检查是不是定义了SOMEVAR这个变量
if (DEFINED CACHE{SOMEVAR})      #检查是不是CACHE(缓存)SOMEVAR这个变量
if (DEFINED ENV{SOMEVAR})        #检查是不是定义了ENV(环境)SOMEVAR这个变量

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/15185.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SQL-每日一题【584.寻找用户推荐人】

题目 给定表 customer &#xff0c;里面保存了所有客户信息和他们的推荐人。 写一个查询语句&#xff0c;返回一个客户列表&#xff0c;列表中客户的推荐人的编号都 不是 2。 对于上面的示例数据&#xff0c;结果为&#xff1a; 解题思路 1.题目要求查询列表中客户的推荐人的…

RTL8309M实现VLAN功能-驱动编进内核

部分硬件实现图 一、使内核支持802.1Q功能 1、使用内核kernel版本4.19.232 2、make menuconfig 配置内核 3、进入Networking support 4、进入Networking options 5、把这些都编进内核 6、点击保存退出 CONFIG_GARPy CONFIG_MRPy CONFIG_BRIDGE_VLAN_FILTERINGy CONFIG_VLAN…

Go语言程序设计(五)切片

一、切片的定义 在Go语言中,切片(Slice)是数组的一个引用,它会生成一个指向数组的指针,并通过切片长度关联到底层数组部分或者全部元素。切片还提供了一系列对数组的管理功能(append、copy)&#xff0c;可以随时动态扩充存储空间&#xff0c;并且可以被随意传递而不会导致所管理…

C++数据结构笔记(7)——队列的顺序结构实现

1.队列&#xff0c;和现实生活中的规则类似&#xff0c;先进先出 2.队尾只允许元素进入&#xff0c;队头只允许元素退出 3.用数组来实现队列的顺序存储&#xff0c;无论哪一段都可以作为队头或者队尾 SeqQueue.h头文件 #ifndef SEQQUEUE_H #define SEQQUEUE_H #include<…

Linux——进程信号详解

目录 一.进程信号的理解 1.1定义&#xff1a; 1.2举例&#xff1a; 1.3总结&#xff1a; 二.进程信号地使用&#xff1a; 2.1信号种类&#xff1a; 2.2而操作系统向进程发送信号地方式有四种&#xff1a; 2.2.1以键盘的方式向进程发送信号 接下来介绍一个系统调用函数sign…

chrome开发调试小技巧—Replay XHR(重新请求)

一、需求 想要验证一个ajax请求&#xff0c;需要每次都需要在页面点几次才会触发或者刷新页面&#xff0c;着急调试看效果时&#xff0c;可以通过chrome的Replay XHR功能直接同参数重新请求ajax 二、实现 chrome调试工具network下找到要重新发起的ajax请求&#xff0c;右键找…

python读写excel利器:xlwings从入门到精通

python读写excel利器&#xff1a;xlwings 从入门到精通 目录 安装和使用 基础操作 操作工作簿操作工作表读取单元格写入(单元格赋值)range的操作&#xff08;range常用的api&#xff09; 写入一行或一列Excel数据(函数式&#xff09;使用range(\A1\).api.AddComment(\comments…

力扣 332. 重新安排行程

题目来源&#xff1a;https://leetcode.cn/problems/reconstruct-itinerary/description/ C题解&#xff08;来源代码随想录&#xff09;&#xff1a; 这道题目有几个难点&#xff1a; 一个行程中&#xff0c;如果航班处理不好容易变成一个圈&#xff0c;成为死循环。解决&am…

ue4:Dota总结_BP_CameraPawn篇

设计wasd移动&#xff1a; 鼠标拖动视口&#xff1a; 鼠标滚轮调整远近&#xff1a; Beginplay&#xff1a; qe按键旋转&#xff1a; 变量&#xff1a;

word@制表位和列数据对齐@填空下划线制作

文章目录 refs制表位(tab stop)制表位类型 制作对其的下划线填空表单&#x1f47a;利用前导符代替下划线制作待填空下划线 制表位对其列数据模拟简单表格测试数据设置引线使用标尺设置 FAQ refs Insert or add tab stops - Microsoft SupportUsing the ruler in Word - Micros…

【Django】列表数据Paginatior分页,动态返回页码,显示当前页、总页数、跳转页

问题 1、当返回数据较多,如设置每页展示10条,数据接近200条,返回页码范围1~20,前端每个页码都显示的话,就会出现页码超出当前页面,被遮挡的页码无法操作和显示不美观; 2、列表的所在页码,总分页数,跳转不在动态页面的页数 解决 在使用paginator转化为Page对象后,获…

从零开始 Spring Boot 63:Hibernate 继承映射

从零开始 Spring Boot 63&#xff1a;Hibernate 继承映射 图源&#xff1a;简书 (jianshu.com) 关系型数据库设计中是不存在继承概念的&#xff0c;但实体类可以用继承来组织代码结构&#xff0c;所以需要用一种方式将实体类的继承结构映射到表结构。 本文将介绍几种在 JPA&a…