文章目录
调试变量
在前文的演示中,使用了message()命令,该命令可以将变量的内容输出,类似于C语言里的printf函数。其完整的命令形式为:
message([mode] msg1 [msg2]...)
msg可以给出多个,但会合并在一起当做一个字符串输出。需要注意的是mode参数,其可取的关键字如下所示:
STATUS:一般的状态信息,前面通常以两个连字符开头。
WARNING:警告信息,通常会以红色显示,不会中断处理。
AUTHOR_WARNING:和WARNING相似,但只会在允许输出开发者警告信息时输出,需要命令行-Wdev参数。
SEND_ERROR:错误信息,配置过程不会中断,但没法生成目标平台的项目文件。
FATAL_ERROR:严重的错误信息,处理过程立即中断。
DEPRECATION:用于记录弃用消息的特殊类别。CMake在不断的开发进化,有些特性会弃用。此时如果使用到这部分特性,虽然可能仍旧能正确的完成任务(得益于后向兼容),但可能需要给与提示。当CMAKE_ERROR_DEPRECATED变量定义为真,则此类消息将被视为错误。如果CMAKE_WARN_DEPRECATED定义为真,则此类消息将被视为警告。如果两个变量都未定义,则不会显示消息。
如果没有提供mode关键字,则该消息将被视为重要信息,并且在不进行任何修改的情况下进行记录。但是有一点要特别注意,不提供mode关键字的时候,消息的顺序是没法保证的,可能乱序输出。(这是非常扯淡的特性,不知道为啥设计成这个样子!)
CMake提供的另一种帮助调试变量的机制是variable_watch()命令。这适用于更复杂的项目,在这些项目中,一个变量什么时候获取道值,什么时候修改值,都难以确认,该命令将记录读取或修改该变量的所有行为。
variable_watch(myVar [command])
对于绝大多数情况,只要列出要监视的变量而不使用可选命令就足够了。但是有时候可能需要进一步的控制,此时可以给出一个命令,该命令将在每次读取或修改变量时执行。命令应该是CMake函数或宏的名称(后文再说),并将传递以下参数:该变量的名字、访问类型、变量值等。但这种应用场景应该是非常少见的,我没用过不扯淡了==!
字符串操作
因为CMake所有的变量都是字符串类型的值,所以当需要设定或修改变量值的时候,可能需要对字符串进行一系列的操作,尤其是随着项目复杂性的增长,这一需求可能会越发显著。
CMake为此提供了string()命令,它提供了一系列有用的字符串处理功能,包括查找和替换操作、正则表达式匹配、大小写转换、去空格和其他常见任务。
这一部分比较琐碎,但很容易理解,文档中介绍更加详细,在此只把命令列出来,权作记录。
检索和替换:
string(FIND <string> <substring> <out-var> [...])
string(REPLACE <match-string> <replace-string> <out-var> <input>...)
string(REGEX MATCH <match-regex> <out-var> <input>...)
string(REGEX MATCHALL <match-regex> <out-var> <input>...)
string(REGEX REPLACE <match-regex> <replace-expr> <out-