Cmake语法学习3:语法

news2024/12/24 0:28:46

1.双引号

1.1 命令参数

1)介绍

        命令中多个参数之间使用空格进行分隔,而 cmake 会将双引号引起来的内容作为一个整体,当它当成一个参数,假如你的参数中有空格(空格是参数的一部分),那么就可以使用双引号。

2)例子
message(Hello World)
message("Hello World")

        第一个 message 命令传入了两个参数,而第二个 message 命令只传入一个参数;

        在第一个 message 命令中,打印信息时,会将两个独立的字符串 Hello 和 World 都打印出来,而且World 会紧跟在Hello 之后。而第二个 message 命令只有一个参数。

HelloWorld
Hello World

1.2引用变量

1)介绍

        加上“ ”可以让cmake把这个数组的所有元素当成一个整体,而不是分散的个体。

2)例子

 (1)       

        不加双引号

# CMakeLists.txt
set(MY_LIST Hello World China)
message(${MY_LIST})

        执行结果

HelloWorldChina

 (2)

        加双引号

# CMakeLists.txt
set(MY_LIST Hello World China)
message("${MY_LIST}")

        执行结果

Hello;World;China

 2.条件判断

2.1格式

if(expression)
 # then section.
 command1(args ...)
 command2(args ...)
 ...
elseif(expression2)
 # elseif section.
 command1(args ...)
 command2(args ...)
 ...
else(expression)
 # else section.
 command1(args ...)
 command2(args ...)
 ...
endif(expression)

2.2 expression表达式

 

2.3表达式详解

 2.3.1 <constant>

        在 cmake 中,可以把 1ONYESTRUEY 或非零数字以及 0OFFNOFALSENIGNORE、NOTFOUND、空字符串或以后缀-NOTFOUND 结尾这些理解为常量,类似于布尔值,而且它们不区分大小 写;如果参数不是这些特定常量之一,则将其视为变量或字符串,并使用除<constant>之外的表达式。

2.3.2 <variable/string>

        在 if(<variable/string>)条件判断中,如果变量已经定义,并且它的值是一个非假常量,则条件为真;否则为假,注意宏参数不是变量。

        真:变量定义+非假常量

        假:未定义/假常量

2.3.3 NOT <expression>

        NOT 其实就类似于 C 语言中的取反,在 if(NOT <expression>)条件判断中,如果表达式 expression 为真,则条件判断为假;如果表达式 expression 为假,则条件判断为真。

2.3.4 <expr1> AND <expr2>

        类似于 C 语言中的逻辑与(&&),只有 expr1 expr2 同时为真时,条件判断才为真;否则条件判断为假。

2.3.5 <expr1> OR <expr2>

        类似于 C 语言中的逻辑或(||),当 expr1 expr2 至少有一个为真时,条件判断为真;否则为假。

2.3.6 COMMAND command-name

1)介绍        

        如果 command-name 是一个已经定义的命令、宏或函数时,条件判断为真;否则为假。

 2)例子

if(COMMAND yyds)
    message(true)
else()
    message(false)
endif()

输出:false

if(COMMAND project)
    message(true)
else()
    message(false)
endif()

输出:true

2.3.7  TARGET target-name

1)介绍        
        如果 target-name 是 add_executable() add_library() add_custom_target() 定义的目标(这些目标在整个工程中必须是唯一的,不可出现两个名字相同的目标),则条件判断为真;否则为假。
2)例子
if(TARGET hello)
    message(true)
else()
    message(false)
endif()

        输出为false

add_library(hello hello.c)
if(TARGET hello)
    message(true)
else()
    message(false)
endif()

        输出为true

2.3.8 EXISTS path

        如果 path 指定的文件或目录存在,则条件判断为真;否则为假。需要注意的是, path 必须是文件或目录的全路径,也就是绝对路径。
2.3.9 IS_DIRECTORY path
如果 path 指定的路径是一个目录,则条件判断为真;否则为假,同样, path 也必须是一个绝对路径。
IS_ABSOLUTE path
如果给定的路径 path 是一个绝对路径,则条件判断为真;否则为假。
<variable|string> MATCHES regex
这个表达式用的比较多,可以用来匹配字符串,可以使用正则表达式进行匹配。
如果给定的字符串或变量的值与给定的正则表达式匹配,则为真,否则为假。
set(MY_STR "Hello World")
if(MY_STR MATCHES "Hello World")
    message(true)
else()
    message(false)
endif()

        输出为true

set(MY_STR "Hello World")
if("Hello World" MATCHES "Hello World")
    message(true)
else()
    message(false)
endif()

        输出为true

2.3.9 <variable|string> IN_LIST <variable>

        如果左边给定的变量或字符串是右边列表中的某个元素相同,则条件判断为真;否则为假。

2.3.10 DEFINED <variable>

        如果给定的变量已经定义,则条件判断为真,否则为假;只要变量已经被设置(定义),if 条件判断就 是真,至于变量的值是真还是假并不重要。

2.3.11 <variable|string> LESS <variable|string>

        如果左边给定的字符串或变量的值是有效数字并且小于右侧的值,则为真。否则为假。

2.3.12 <variable|string> GREATER <variable|string>
        如果左边给定的字符串或变量的值是有效数字并且大于右侧的值,则为真。否则为假。

2.3.13<variable|string> EQUAL <variable|string>

        如果左边给定的字符串或变量的值是有效数字并且等于右侧的值,则为真。否则为假。

3.循环语句

3.1foreach

1)基本语法

foreach(loop_var arg1 arg2 ...)
     command1(args ...)
     command2(args ...)
     ...
endforeach(loop_var)
        endforeach 括号中的 <loop_var> 可写可不写,如果写了,就必须和 foreach 中的 <loop_var> 一致。
# foreach 循环测试
set(my_list hello world china)
foreach(loop_var ${my_list})
     message("${loop_var}")
endforeach()

        打印输出信息如下

2)RANGE 关键字

foreach(loop_var RANGE stop)
foreach(loop_var RANGE start stop [step])
        对于第一种方式,循环会从 0 到指定的数字 stop ,包含 stop stop 不能为负数。
        对于第二种,循环从指定的数字 start 开始到 stop 结束,步长为 step ,不过 step 参数是一个可选参数,如果不指定,默认 step=1 ;三个参数都不能为负数,而且 stop 不能比 start 小。
3)IN关键字
foreach(loop_var IN [LISTS [list1 [...]]]
         [ITEMS [item1 [...]]])
        循环列表中的每一个元素,或者直接指定元素。

3.2while

while(condition)
     command1(args ...)
     command1(args ...)
     ...
endwhile(condition)
        endwhile 括号中的 condition 可写可不写,如果写了,就必须和 while 中的 condition 一致。
cmake while 循环的含义与 C 语言中 while 循环的含义相同,但条件 condition 为真时,执行循环体中的命令,而条件 condition 的语法形式与 if 条件判断中的语法形式相同。

3.3break/continue

        break()命令用于跳出循环,和在 C 语言中的作用是一样的。
        continue() 命令用于结束本次循环,执行下一次循环。

4.math

        用到之后再学习

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

智慧商城(continue)

文章目录 1.静态页面结构准备和动态渲染2.搜索 - 历史记录管理1. 写好基础静态页面,可以先往里面加一点假数据2. 上面基本的渲染直接利用history渲染就可以了3. 搜索历史基本渲染结束了,开始点击搜索添加历史4. vant内用v-model" ",可以快速拿到搜索框的值5. 往历史记…

Vue3.0(一):Vue的引入-options api-模板语法

Vue的引入方式 CDN方式进行引入 将以下 script标签引入即可 <script src"https://unpkg.com/vue3/dist/vue.global.js"></script><!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><met…

oracle19C 密码包含特殊字符@ 导致ORA-12154

oracle 19C 密码包含特殊字符 出现登录失败&#xff0c;针对此问题一次说个明白 ORA-12154: TNS:could not resolve the connect identifier specified Oracle 19c之前密码是可以包含特殊字符&#xff0c;但是如果包含特殊字符需要双引号 比如oracle11g 正常 如果密码包含特殊…

创新大赛专访丨金智维荣膺2023年度数字化创新服务卓越品牌:专注提供企业级RPA平台,重塑企业生产力,让员工更有价值

日前&#xff0c;2023第三届全国人力资源创新大赛颁奖典礼暨成果展圆满举行。自2023年10月份启动以来&#xff0c;大赛共吸引了457个案例报名参赛&#xff0c;经组委会专家团队评审严格审核&#xff0c;企业赛道共有103个案例获奖、72家企业、13位个人、7个产业园斩获荣誉。 珠…

帮管客CRM SQL注入漏洞

免责声明&#xff1a;文章来源互联网收集整理&#xff0c;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;所产生的一切不良后果与文章作者无关。该…

简单实践 java spring boot 自动配置模拟

1.概要 1.1 需求&#xff0c;自己写一个redis-spring-boot-starter模拟自动配置 自动配置就是在引入*-starter坐标后&#xff0c;可以已经spring框架的规则实现一些Bean的自动注入&#xff0c;并设置一些参数的默认值&#xff0c;且也可以在引入的工程中修改这些配置的值。这…

C#代码添加脚本头

目录 前言 代码展示 前言 创建脚本的时候添加脚本的介绍 代码展示 using System.IO;/// <summary> /// 创建脚本自动添加头注 /// </summary> public class CommentFirst : UnityEditor.AssetModificationProcessor {/// <summary>/// 在资源创建生成.me…

springboot整合RabbitMQ,RabbitMQ实现高级特性消息不丢失

1.生产者可靠性消息投递 简单操作参考---------打开主页上篇博客 https://blog.csdn.net/weixin_45810161/article/details/135906602?spm1001.2014.3001.5501 在使用RabbitMQ的时候,怎么保证保证消息不丢失,RabbitMQ提供了两种不同的方式来控制消息的可靠性投递 1.confirm…

js中的数据类型(存储上的差别)

文章目录 前言一、基本类型NumberUndefinedStringNullBooleanSymbol 二、引用类型ObjectArrayFunction其他引用类型 三、存储区别基本类型引用类型 小结 前言 在JavaScript中&#xff0c;我们可以分成两种类型&#xff1a; 基本类型复杂类型 两种类型的区别是&#xff1a;存…

老版本labelme如何不保存imagedata

我的版本是3.16&#xff0c;默认英文且不带取消保存imagedata的选项。 最简单粗暴的方法就是在json文件保存时把传递过来的imagedata数据设定为None&#xff0c;方法如下&#xff1a; 找到labelme的源文件&#xff0c;例如&#xff1a;D:\conda\envs\deeplab\Lib\site-packages…

jsp自助点餐管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 JSP 自助点餐管理系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql5.0…

PCB笔记(二十三):allegro 标注长宽(一般用于测量板宽)时如何显示双单位

步骤&#xff1a;首先选择标注工具&#xff0c;然后右键→Parameters&#xff0c;在弹出来的窗口中√上如下图二所示选项 最终要达到显示单位的效果的话&#xff0c;需要在Text项键入%v%u。 今天就记录到这里啦O

Jmeter直连mysql数据库教程

mysql数据库能够通过Navicat等远程连接工具连接 下载驱动并加入jmeter 1.mysql驱动下载地址&#xff1a;MySQL :: Download MySQL Connector/J (Archived Versions) 找到对应的驱动下载&#xff1a;如下图&#xff1a; 把驱动jar包加入jmeter 配置jmeter连接mysql数据库…

正则表达式与文本处理工具

目录 引言 一、正则表达式基础 &#xff08;一&#xff09;字符匹配 1.基本字符 2.特殊字符 3.量词 4.边界匹配 &#xff08;二&#xff09;进阶用法 1.组与引用 2.选择 二、命令之-----grep &#xff08;一&#xff09;基础用法 &#xff08;二&#xff09;高级用…

数据结构——实验01-线性表的链式存储和操作

一、实验内容 二、算法思想与算法实现 1、解题思想 &#xff08;1&#xff09;逆序创建链表La就是使用头插法创建一个链表&#xff0c;所谓头插法就是在创建链表时始终将新元素插入到头结点之后&#xff0c;而正序创建链表Lb就是使用尾插法创建一个链表&#xff0c;所谓尾插法…

Spring Bean 生命周期常见错误

虽然说 Spring 容器上手简单&#xff0c;可以仅仅通过学习一些有限的注解&#xff0c;即可达到快速使用的目的。但在工程实践中&#xff0c;我们依然会从中发现一些常见的错误。尤其当你对 Spring 的生命周期还没有深入了解时&#xff0c;类初始化及销毁过程中潜在的约定就不会…

AJAX-URL查询参数

定义&#xff1a;浏览器提供给服务器的额外信息&#xff0c;让服务器返回浏览器想要的数据 http://xxxx.com/xxx/xxx?参数名1值1&参数名2值2 axios语法 使用axios提供的params选项 注意&#xff1a;axios在运行时把参数名和值&#xff0c;会拼接到url?参数名值 axios(…

第5课 使用FFmpeg将rtmp流再转推到rtmp服务器

本课对应源文件下载链接&#xff1a; https://download.csdn.net/download/XiBuQiuChong/88801992 通过前面的学习&#xff0c;我们已经可以正常播放网络rtmp流及本地mp4文件。这节课&#xff0c;我们将在前面的基础上实现一个常用的转推功能&#xff1a;读取rtmp流或mp4文件并…

matlab|【EI复现】日前日内多阶段多时间尺度源荷储协调调度

目录 一、模型 二、程序运行 三、下载链接 多阶段多时间尺度的协调调度的优势是考虑新能源出力的波动性与随机性&#xff0c;减少需求响应负荷的不确定性对电网制定的日前调度计划准确性造成的影响&#xff0c;也就是能够更加精准的进行调度和分析&#xff0c;优化结果的可用…

(java版)排序算法----【冒泡,选择,插入,希尔,快速排序,归并排序,基数排序】超详细~~

目录 冒泡排序(BubbleSort)&#xff1a; 代码详解&#xff1a; 冒泡排序的优化&#xff1a; 选择排序(SelectSort)&#xff1a; 代码详解&#xff1a; 插入排序&#xff08;InsertSort&#xff09;&#xff1a; 代码详解&#xff1a; 希尔排序(ShellSort)&#xff1a; 法一…