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 就是一个进行判断的表达式,表达式对照表如下:
表达式 | true | false | 说明 |
如果constant为1、ON、 YES、TRUE、Y 或非零数,则为真 | 如果constant为0、OFF、NO 、FALSE、N、 IGNORE、NOTFOUND、空字符串或以后缀NOTFOUND 结尾,则为 False。 | 布尔值大小写不敏感;如果与这些常量都不匹配, 则将其视为变量或字符串 | |
已经定义并且不是false的变量 | 未定义或者是false 的变量 | 变量就是字符串 | |
NOT |
expression 为 false | expression 为 true | |
expr1 和 expr2 同时为 true | expr1 和 expr2 至少有一个为 false | ||
expr1 和 expr2 至少有一个为 true | expr1 和 expr2 都是 false | ||
COMMAND name | name 是一个已经定义的命令、宏或者函数 | name 未定义 | |
TARGET name | name 是 add_executable() 、 add_library() 或 add_custom_target() 定义的目标 | name 未定义 | |
TEST name | name 是由 add_test()命令创建的现有测试名称 | name 未创建 | |
EXISTS path | path 指定的文件或目录存在 | path 指定的文件或目录不存在 | 仅适用于完整路径 |
IS_DIRECTORY path | path 指定的路径为目录 | path 指定的路径不为目录 | 仅适用于完整路径 |
IS_SYMLINK path | path 为符号链接 | path 不是符号链接 | 仅适用于完整路径 |
IS_ABSOLUTE path | path 为绝对路径 | path 不是绝对路径 | |
variable 与正则表达式 regex 匹配成功 | variable 与正则表达式 regex 匹配失败 | ||
右边列表中包含左边的元素 | 右边列表中不含左边的元素 | ||
DEFINED |
如果给定的变量已定 义,则为真。 | 如果给定的变量 未定义 | 只要变量已经被设置,它是真还是假并不重要。(注意宏不是变量。) |
如果给定的字符串或 变量的值是有效数字且小于右侧的数字,则为真。 | 左侧的数字大于或等于右侧的数字 | ||
如果给定的字符串或 变量的值是有效数字且大于右侧的数字,则 为真。 | 左侧的数字小于或等于右侧的数字 | ||
如果给定的字符串或 变量的值是有效数字并且等于右侧的值,则为真 | 左侧的数字不等于右侧的数字 |
上表中只是列出其中一部分表达式,还有其它一些表达式这里并未列出,大家可以通过这个链接地址if — CMake 3.5.2 Documentation进行查看,现在我们对上表中的表达式进行详解。
在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
在 if(
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 其实就类似于 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
这个就类似于 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
类似于 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
未完待续......