cmake-language 语言规范

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版本不支持使用\作为续行符

非引用参数

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • CMake学习 本篇分享一下有关CMake的一些学习心得以及相关使用。 本文目录如下: [1、CMake介绍] [...
    AlphaGL阅读 12,302评论 11 79
  • CMake 全称“cross platform make”,是开源、跨平台的自动化构建系统。CMake 由 Kit...
    神齐阅读 4,198评论 0 6
  • 注:首发地址 1. 前言 当在做 Android NDK 开发时,如果不熟悉用 CMake 来构建,读不懂 CMa...
    cfanr阅读 24,588评论 1 53
  • 参考 CMake入门实战cmake缓存清理 什么是CMake CMake允许开发者编写一种平台无关的CMakeLi...
    GeminiGirl0604阅读 3,467评论 0 3
  • 搬运自本人 CSDN 博客:https://blog.csdn.net/ajianyingxiaoqinghan/...
    琦小虾阅读 15,511评论 0 11