CMake语言 (cmake-language)
- 原文: cmake-language v3.22
- 作者: shaoguang (shaoguangcn@163.com)
- 日期: 2021年10月24日
文章目录
文件组织结构 (Organization)
CMake输入文件在名为CMakeLists.txt
或以.cmake
为后缀的源文件中以"CMake语言"编写。
项目中的CMake语言源文件组织为:
- 目录
CMakeLists.txt
- 脚本
<script>.cmake
- 模块
<module>.cmake
目录 (Directories)
当CMake处理项目源代码树时,入口点是在顶层目录中的一个名为CMakeLists.txt
的源文件。该文件可能包含整个构建规范(build specification),或者使用 add_subdirectory() 命令将子目录添加到构建规范中。该命令添加的每一个子目录都必须包含一个CMakeLists.txt
文件作为该目录的入口点。对于每个处理CMakeLists.txt
文件的源目录,CMake在构建树中生成一个相应的目录作为默认的工作和输出目录。
脚本 (Scripts)
单个<script>.cmake
源文件可在"脚本模式"下通过 cmake 命令行工具的-P
选项处理。脚本模式仅运行给定CMake语言源文件中的命令,不生成构建系统。它不允许定义构建目标或操作的CMake命令。
模块 (Modules)
"目录"或"脚本"中的CMake语言代码可使用 include() 命令来加载在包含上下文范围内的一个<module>.cmake
源文件。参阅CMake发行版中关于"模块"的文档 cmake-module。项目源代码树也可以提供自己的模块并在 CMAKE_MODULE_PATH 中指定它们的位置。
语法 (Syntax)
文件编码 (Encoding)
CMake语言源文件可以用7位ASCII文本编写,以便在所有支持的平台上实现最大的可移植性。换行符可能被编码为\n
或者\r\n
,但是作为输入文件被读取时会被转换为\n
。
注意,该实现是8位对齐的(the implementation is 8-bit clean),所以在系统API上支持UTF-8编码的平台,源文件可能会被编码为UTF-8。此外,CMake 3.2及以上版本在Windows系统上支持以UTF-8编码的源文件(使用UTF-16调用系统APIs)。再者,CMake 3.0及以上版本允许在源文件中使用UTF-8 字节顺序标记(BOM)。
源文件 (Source Files)
CMake语言源文件包含零个或多个命令调用(Command Invocations),每条命令由换行符或可选的空格和注释分隔:
file ::= file_element*
file_element ::= command_invocation line_ending |
(bracket_comment|space)* line_ending
line_ending ::= line_comment? newline
space ::= <match '[ \t]+'>
newline ::= <match '\n'>
注意: 不在命令参数(Command Argument)或者括号注释(Bracket Comment)内的源文件行都可以以行注释(Line Comment)结尾。
命令调用 (Command Invocations)
命令调用是一个名称后跟由空格分隔的括号封闭(paren-enclosed)参数:
command_invocation ::= space* identifier space* '(' arguments ')'
identifier ::= <match '[A-Za-z_][A-Za-z0-9_]*'>
arguments ::= argument? separated_arguments*
separated_arguments ::= separation+ argument? |
separation* '(' arguments ')'
separation ::= space | line_ending
比如:
add_executable(hello world.c)
命令名称不区分大小写。参数中嵌套的无引号括号必须平衡。每个(
或)
都作为一个不带引号的文本参数提供给命令调用。这可用于调用 if() 命令来包围条件(enclose conditions)。例如:
if(FALSE AND (FALSE OR TRUE)) # 计算结果为 FALSE
注意: CMake 3.0 之前的版本要求命令名称标识符至少为2个字符。 CMake 2.8.12 之前的版本静默地接受一个不带引号参数(unquoted argument)或紧跟在带引号参数(quoted argumen |