当前位置: 首页 > article >正文

Cmake语法学习3:语法

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.kler.cn/a/227025.html

相关文章:

  • anaconda+pytorch+pycharm安装总结
  • 【开源】JAVA+Vue+SpringBoot实现就医保险管理系统
  • 二叉树的最大深度
  • Day11代码随想录
  • 蓝桥杯每日一题-----数位dp
  • dcat admin + dingo + nginx 开发前台
  • Linux mount命令教程:如何挂载文件系统(附案例详解和注意事项)
  • ES6-const
  • 技术栈面试综合整理
  • 基于 Python 的 Web 应用程序的 Web 服务器比较
  • 初识vue3
  • python:lxml 生成思维导图 Freemind(.mm)文件
  • LeetCode 1686. 石子游戏 VI【排序,贪心】【Py3,Go】2000
  • 排队打水问题1(c++题解)
  • 深度解析Go字符串
  • C++基础语法 类 02
  • [349. 两个数组的交集](C语言)(两种解法:双指针+排序,哈希)
  • Qt/C++音视频开发66-音频变速不变调/重采样/提高音量/变速变调/倍速播放/sonic库使用
  • 图论练习1
  • Kotlin-类