CMake系列 cmake-language

本文详细介绍了CMake语言的核心概念,包括文件组织结构、目录、脚本、模块、语法特性如编码、源文件、命令调用、参数、注释以及控制结构。CMake语言用于构建跨平台的项目,通过CMakeLists.txt文件组织构建规范,使用条件块、循环和命令定义来控制构建流程。此外,还讨论了变量、环境变量和列表的使用,为理解CMake构建系统提供了全面的指南。
摘要由CSDN通过智能技术生成

CMake语言 (cmake-language)



文件组织结构 (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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

「已注销」

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值