【CMake 入门与进阶(8)】 CMakeLists.txt 语法规则(附使用代码)

15 篇文章 10 订阅

双引号的作用

        CMake 中,双引号的作用我们可以从两个方面进行介绍,命令参数和引用变量。

        命令参数

        调用命令时,参数可以使用双引号,譬如:

project("HELLO")

        也可以不使用双引号,譬如:

project(HELLO)

        那它们有什么区别呢?在本例中是没有区别的,命令中多个参数之间使用空格进行分隔,而 cmake 会将双引号引起来的内容作为一个整体,当它当成一个参数,假如你的参数中有空格(空格是参数的一部分),那么就可以使用双引号,如下所示:

message(Hello World)
message("Hello World")

        在这个例子中,第一个 message 命令传入了两个参数,而第二个 message 命令只传入一个参数;在第一 个 message 命令中,打印信息时,会将两个独立的字符串 Hello 和 World 都打印出来,而且 World 会紧跟在 Hello 之后,如下:

HelloWorld

        而第二个 message 命令只有一个参数,所以打印信息如下:

Hello World

        这就是双引号在参数中的一个作用。

        引用变量

        我们先来看个例子,如下所示:

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

        这个例子的打印信息如下:

Hello;World;China

        因为此时${MY_LIST}是一个列表,我们用"${MY_LIST}"这种形式的时候,表示要让 CMake 把这个数组的所有元素当成一个整体,而不是分散的个体。于是,为了保持数组的含义,又提供一个整体的表达方式, CMake 就会用分号“;”把这数组的多个元素连接起来。

        而如果不加双引号时,CMake 不会数组当成一个整体看待,而是会将数组中的各个元素提取出进行打印输出。

条件判断

        在 cmake 中可以使用条件判断,条件判断形式如下:

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)

        else 和 endif 括号中的可写可不写,如果写了,就必须和 if 中的一致。

        expression 就是一个进行判断的表达式,表达式对照表如下:

表达式truefalse说明
<constant>如果constant为1、ON、 YES、TRUE、Y 或非零数,则为真如果constant为0、OFF、NO 、FALSE、N、 IGNORE、NOTFOUND、空字符串或以后缀NOTFOUND 结尾,则为 False。布尔值大小写不敏感;如果与这些常量都不匹配, 则将其视为变量或字符串
<variable|string>已经定义并且不是false的变量未定义或者是false 的变量变量就是字符串
NOT<expression>expression 为 falseexpression 为 true
<expr1>AND<expr2>expr1 和 expr2 同时为 trueexpr1 和 expr2 至少有一个为 false
<expr1>OR<expr2>expr1 和 expr2 至少有一个为 trueexpr1 和 expr2 都是 false
COMMAND namename 是一个已经定义的命令、宏或者函数name 未定义
TARGET namename 是 add_executable() 、 add_library() 或 add_custom_target() 定义的目标name 未定义
TEST namename 是由 add_test()命令创建的现有测试名称name 未创建
EXISTS pathpath 指定的文件或目录存在path 指定的文件或目录不存在仅适用于完整路径
IS_DIRECTORY pathpath 指定的路径为目录path 指定的路径不为目录仅适用于完整路径
IS_SYMLINK pathpath 为符号链接path 不是符号链接仅适用于完整路径
IS_ABSOLUTE pathpath 为绝对路径path 不是绝对路径
<variable|string>MATCHES regexvariable 与正则表达式 regex 匹配成功variable 与正则表达式 regex 匹配失败
<variable|string>IN_LIST<variable>右边列表中包含左边的元素右边列表中不含左边的元素
DEFINED<varible>如果给定的变量已定 义,则为真。如果给定的变量 未定义只要变量已经被设置,它是真还是假并不重要。(注意宏不是变量。)
<variable|string>LESS<variable|string>如果给定的字符串或 变量的值是有效数字且小于右侧的数字,则为真。左侧的数字大于或等于右侧的数字
<variable|string>GREATER<variable|string>如果给定的字符串或 变量的值是有效数字且大于右侧的数字,则 为真。左侧的数字小于或等于右侧的数字
<variable|string>EQUAL<variable|string>如果给定的字符串或 变量的值是有效数字并且等于右侧的值,则为真左侧的数字不等于右侧的数字

        上表中只是列出其中一部分表达式,还有其它一些表达式这里并未列出,大家可以通过这个链接地址if — CMake 3.5.2 Documentation进行查看,现在我们对上表中的表达式进行详解。

  • <constant>

        在if(constant)条件判断中,如果 constant 是 1、ON、YES、TRUE、Y 或非零数字,那么这个 if 条件就是 true;如果 constant 是 0、OFF、NO、FALSE、N、IGNORE、NOTFOUND、空字符串或以后缀-NOTFOUND 结尾,那么这个条件判断的结果就是 false。

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

if(ON)
    message(true)
else()
    message(false)
endif()

        输出为:true

if(YES)
    message(true)
else()
    message(false)
endif()

        输出为:true

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

        输出为:true

if(100)
    message(true)
else()
    message(false)
endif()

        输出为:true

if(0)
    message(true)
else()
    message(false)
endif()

        输出为:false

if(N)
    message(true)
else()
    message(false)
endif()

        输出为:false

if(NO)
    message(true)
else()
    message(false)
endif()

        输出为:false

  • <variable/string>

        在 if(<variable/string>)条件判断中,如果变量已经定义,并且它的值是一个非假常量,则条件为真;否则为假,注意宏参数不是变量(在 cmake 中也可以使用宏,这个后面再给大家介绍)。

set(GG Hello)
if(GG)
    message(true)
else()
    message(false)
endif()

        输出为:true

set(GG NO)
if(GG)
    message(true)
else()
    message(false)
endif()

        输出为:false

if(GG)
    message(true)
else()
    message(false)
endif()

        输出为:false

  • NOT<expression>

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

if(NOT GG)
    message(true)
else()
    message(false)
endif()

        输出为:true

        因为 GG 变量没有定义,所以 GG 表达式为假,但因为前面有 NOT 关键字,进行取反操作,整个 if 条件判断为真。

if(NOT YES)
    message(true)
else()
    message(false)
endif()

        输出为:false

if(NOT 0)
    message(true)
else()
    message(false)
endif()

        输出为:true

  • <expr1> AND <expr2>

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

if(yes AND on)
    message(true)
else()
    message(false)
endif()

        输出为:true

if(yes AND no)
    message(true)
else()
    message(false)
endif()

        输出为:false

if(false AND no)
    message(true)
else()
    message(false)
endif()

        输出为:false

  • <expr1>OR<expr2>

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

if(false OR no)
    message(true)
else()
    message(false)
endif()

        输出为:false

if(yes OR no)
    message(true)
else()
    message(false)
endif()

        输出为:true

if(ON OR yes)
    message(true)
else()
    message(false)
endif()

        输出为:true


未完待续......

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值