cmake基础

其实就是翻译了一下cmake文档中的"cmake-language"

cmake中的文件使用"cmake语言"来写
一个项目中的cmake文件有如下几种形式

当cmake处理一个项目时,起始点是项目根目录中的cmakelist.txt。这个文件包括了整体的编译细节,其中通过add_subdirectory来增加子目录。增加的子目录中必须包括一个cmakelist.txt作为子目录的起始点。cmake在构建过程中,每个cmakelist.txt对应的目录都会在build目录中建立对应的目录

一个cmake脚本可以通过在cli中使用cmake -P来以脚本模式来处理。脚本模式只是运行这个由cmake语言写的脚本,但是不会进行build,比如不能编译目标。

在cmakelist.txt和cmake脚本中,可以使用include来加在一个cmake模块. 具体见cmake-module文档

接下来是语法,先不纠结,用时再查

然后介绍了几个控制结构

变量的值总是str类型,用set和unset来设置或取消一个变量,变量是大小写敏感的.
Function Scope 定义的函数中定的var在当前function scope及嵌套子scope可见,一旦函数返回var就不可见。
Directory Scope 每个Directory(包含cmakelist)都绑定了一些变量。在处理一个目录中的cmakelist.txt之前,cmake会把父目录中的所有变量绑定到当前目录中来。没有在function中set/unset的变量,就会绑定到Directory scope中。
Persistent Cache cache是一个单独的scope,整个项目就一份。

在找var的值时,cmake首先搜索function scope,如果找到了通过set设置的function scope中的变量,这个值就被使用了。如果找不到var的定义,那么就找cache。如果cache也找不到,var就是一个空字符串。

尽管cmake中的var都是字符串,但某些场景中一个字符串可以被视为一个list,例如自检查一个没有被引号括起来的参数的值时。在这个场景中,一个str被拆分成用分号分割的list。

list只适用于基础使用的情况,不应该视为复杂的数据类型去做复杂任务。大多数命令在构建list时是不转义元素中包含的分号的。

一般来说,list不支持元素中包含分号。为了避免出现bug,可以考虑下面的建议:

  1. 许多cmake命令,变量,属性都接受以分号分割的list,所以不要把元素包含分号的list传进去,除非文档中说明支持这种形式,或者可以把分号转义了。

//TODO

posted @ 2022-12-29 15:32  ijpq  阅读(57)  评论(0编辑  收藏  举报