CMake在项目中的组织结构
CMake命令执行时的输入文件是在名为CMakeLists.txt源文件中以“CMake语言”写入,或以.cmake文件扩展名结尾。
CMake项目中的语言源文件被组织为:
- 目录 ( CMakeLists.txt )
- 脚本 ( <script>.cmake )
- 模块 ( <module>.cmake )
目录
当CMake处理项目源目录树时,入口点是顶级源目录中名为CMakeLists.txt的源文件。 此文件可能包含整个构建规范或使用add_subdirectory()
命令用于将子目录添加到构建中。 该命令添加的每个子目录还必须包含CMakeLists.txt文件作为该目录的入口点。 对于每一个待处理的源目录中的CMakeLists.txt文件,CMake都会在构建树中生成相应的目录,以充当默认的工作和输出目录。
脚本
可以使用cmake带有-P选项的命令行工具,以脚本模式处理单个<script>.cmake源文件。 此时只是在给定的CMake语言源文件中运行命令,而不生成构建系统。 它不允许CMake命令定义构建目标或操作。
模块
在目录或脚本中的 CMake代码会使用 include()命令在包含上下文的范围内加载<module>.cmake源文件。在 cmake-modules手册中记录了CMake发行版附带的模块。 在项目源码树中也可以提供自己的模块,并在CMAKE_MODULE_PATH变量中指定它们的位置。
可以使用目录或脚本中的 CMake语言代码 include()命令用于在包含上下文的范围内加载<module>.cmake源文件。 见 cmake-modules手册页,用于记录CMake发行版附带的模块。 项目源树也可以提供自己的模块并在其中指定它们的位置 CMAKE_MODULE_PATH变量。
语法
编码
CMake语言源文件可以用7位ASCII文本编写,以便在所有支持的平台上实现最大的可移植性。 换行符可以编码为\n或\r\n,但在读取输入文件时将转换为\n 。
请注意,7位ASCII的实现是纯8位的,因此源文件可以在具有支持此编码的系统API的平台上编码为UTF-8。 此外,CMake 3.2及更高版本支持在Windows上以UTF-8编码的源文件(使用UTF-16调用系统API)。 此外,CMake 3.0及更高版本允许在源文件中使用领先的UTF-8 字节顺序标记 。
源文件
CMake语言源文件由零个或多个命令调用组成,这些命令调用由换行符和可选的空格和注释分隔。
命令调用
命令调用是一个名称,后跟由空格分隔的由括号封闭的参数:
例如:
add_executable( hello world.c )
命令名称不区分大小写。 参数中的括号必须配对。 例如:
if( FALSE AND ( FALSE OR TRUE )) # evaluates to FALSE
命令参数
命令调用中有三种类型的参数:中括号参数、引用参数、非引用参数。
中括号参数
受Lua长括号语法的启发,在相同长度的开始和结束 “中括号”之间包含内容。
开始括号的写法是:写一个左括号“[”,后跟零或更多的”=”,接着后跟 ”[” 。
对应的结束括号写法是:写一个右括号“]”,后跟零或更多的”=”,接着后跟 ”]” 。中括号不嵌套。 例如:
message([=[
This is the first line in a bracket argument with bracket length 1.
No \-escape sequences or ${variable} references are evaluated.
This is always one argument even though it contains a ; character.
The text does not end on a closing bracket of length 0 like ]].
It does end in a closing bracket of length 1.
]=])
注意 3.0之前的CMake版本不支持括号参数。
引用参数
带引号的参数包含双引号字符之间的内容。比如:
message("This is a quoted argument containing multiple lines.
This is always one argument even though it contains a ; character.
Both \\-escape sequences and ${variable} references are evaluated.
The text does not end on an escaped double-quote like \".
It does end in an unescaped double quote.
")
以奇数个反斜杠结尾的任何行上的最后一个\
被视为行继续,并且与紧随的后续换行符一起被忽略。 例如:
message("\
This is the first line of a quoted argument. \
In fact it is the only line but since it is long \
the source code uses line continuation.\
")
3.0之前的CMake版本不支持使用
\
作为续行符