面向 C++ 的现代 CMake 教程(五)(4)https://developer.aliyun.com/article/1526954
搜索和替换
以下模式可供使用:
string(FIND [REVERSE])
在字符串中搜索
,并将找到的位置作为整数写入
变量。如果使用了
REVERSE
标志,它从字符串的末尾开始搜索到开头。这仅适用于 ASCII 字符串(不提供多字节支持)。string(REPLACE )
将中的所有
替换为
,并将结果存储在
变量中。
string(REGEX MATCH )
使用正则表达式在中匹配第一个出现的
,并将其存储在
变量中。
string(REGEX MATCHALL )
使用正则表达式在中匹配所有出现的
,并将其作为逗号分隔的列表存储在
变量中。
string(REGEX REPLACE )
命令使用正则表达式在中替换所有出现的
,并将结果存储在
变量中。
正则表达式操作遵循 C++标准库中头文件定义的 C++语法。您可以使用捕获组将匹配项添加到带有数字占位符
\\1
、\\2
…的表达式中:(需要使用双反斜杠,以便正确解析参数)。
操作
可用以下模式:
string(APPEND )
通过附加字符串改变存储在
中的字符串。
string(PREPEND )
通过在中的字符串前添加
字符串改变这些字符串。
string(CONCAT )
连接所有提供的字符串,并将它们存储在
变量中。
string(JOIN )
使用值交错所有提供的
字符串,并将它们作为一个连接的字符串存储在
变量中(不要对列表变量使用此模式)。
string(TOLOWER )
将转换为小写,并将其存储在
变量中。
string(TOUPPER )
将转换为大写,并将其存储在
变量中。
string(LENGTH )
计算的字节数,并将结果存储在
变量中。
string(SUBSTRING )
提取的
字节子字符串,从
字节开始,并将其存储在
变量中。将长度设为
-1
则表示“直到字符串结束”。string(STRIP )
从中移除尾部和前导空白,并将结果存储在
变量中。
string(GENEX_STRIP )
移除中使用的所有生成器表达式,并将结果存储在
变量中。
string(REPEAT )
生成包含个
重复的字符串,并将其存储在
变量中。
比较
字符串的比较采用以下形式:
string(COMPARE <operation> <stringA> <stringB> <out>)
参数是以下之一:
LESS
、GREATER
、EQUAL
、NOTEQUAL
、LESS_EQUAL
或GREATER_EQUAL
。它将用于比较与
,并将结果(
true
或false
)存储在变量中。
散列
散列模式具有以下签名:
string(<algorithm> <out> <string>)
使用散列
并将结果存储在
变量中。支持以下算法:
MD5
: 消息摘要算法 5,RFC 1321SHA1
: 美国安全散列算法 1,RFC 3174SHA224
: 美国安全散列算法,RFC 4634SHA256
: 美国安全散列算法,RFC 4634SHA384
: 美国安全散列算法,RFC 4634SHA512
: 美国安全散列算法,RFC 4634SHA3_224
: 凯凯 SHA-3SHA3_256
: 凯凯 SHA-3SHA3_384
: 凯凯 SHA-3SHA3_512
: 凯凯 SHA-3
生成
可用以下模式:
string(ASCII ... )
将给定的 ASCII 字符存储在
变量中。
string(HEX )
将转换为其十六进制表示,并将其存储在
变量中(自 CMake 3.18 起)。
string(CONFIGURE [@ONLY] [ESCAPE_QUOTES])
完全像configure_file()
一样工作,但用于字符串。结果存储在变量中。
string(MAKE_C_IDENTIFIER )
将中的非字母数字字符转换为下划线,并将结果存储在
变量中。
string(RANDOM [LENGTH ] [ALPHABET ] [RANDOM_SEED ] )
生成一个个字符(默认
5
)的随机字符串,使用可选的从随机种子
,并将结果存储在
变量中。
string(TIMESTAMP [] [UTC])
生成一个表示当前日期和时间的字符串,并将其存储在变量中。
string(UUID ...)
生成一个全球唯一的标识符。这个模式使用起来有点复杂。
JSON
JSON 格式的字符串操作使用以下签名:
string(JSON <out> [ERROR_VARIABLE <error>] <operation + args>)
several operations are available. They all store their results in the variable, and errors in the
variable. Operations and their arguments are as follows:
GET ...
返回使用路径或
从
字符串中获取一个或多个元素的结果。
TYPE ...
返回字符串中使用
路径或
的一个或多个元素的类型。
MEMBER ...
返回字符串中
位置的一个或多个数组类型元素的成员名称。
LENGTH ...
返回字符串中使用
路径或
的一个或多个数组类型元素的数量。
REMOVE ...
返回使用路径或
从
字符串中删除一个或多个元素的结果。
SET ...
返回将插入到
字符串中一个或多个元素的结果。
EQUAL
评估和
是否相等。
list()
命令
该命令提供了列表的基本操作:阅读、搜索、修改和排序。有些模式会改变列表(改变原始值)。如果你之后需要它,请确保复制原始值。
完整详细信息可以在在线文档中找到:
cmake.org/cmake/help/latest/command/list.html
阅读
以下模式可用:
list(LENGTH )
计算变量的元素数量,并将结果存储在
变量中。
list(GET ... )
将中指定的索引列表元素复制到
变量中。
list(JOIN )
将元素与
分隔符交织在一起,并将结果字符串存储在
变量中。
list(SUBLIST )
类似于GET
模式,但它操作范围而不是明确的索引。如果是
-1
,将从索引到
变量提供的列表末尾返回元素。
搜索
此模式简单地查找 变量中的
元素的索引,并将结果存储在
变量中(如果未找到元素,则为
-1
):
list(FIND <list> <needle> <out>)
修改
以下是一些可用模式:
list(APPEND ...)
将一个或多个值添加到
变量的末尾。
list(PREPEND [...])
类似于APPEND
,但它将元素添加到变量的开头。
list(FILTER {INCLUDE | EXCLUDE} REGEX )
用于过滤变量,以
INCLUDE
或EXCLUDE
包含或排除与值匹配的元素。
list(INSERT [...])
在给定的处向
变量添加一个或多个
值。
list(POP_BACK [...])
从变量的末尾移除一个元素,并将其存储在可选的
变量中。如果提供了多个
变量,将移除更多元素以填充它们。
list(POP_FRONT [...])
类似于POP_BACK
,但它从变量的开头移除元素。
list(REMOVE_ITEM ...)
是FILTER EXCLUDE
的简写,但不支持正则表达式。list(REMOVE_AT ...)
从中移除特定的
处的元素。
list(REMOVE_DUPLICATES )
从中移除重复项。
list(TRANSFORM [] [OUTPUT_VARIABLE ])
对元素应用特定的转换。默认情况下,该操作应用于所有元素,但我们也可以通过添加
来限制其影响。除非提供了
OUTPUT_VARIABLE
关键字,否则列表将被突变(原地更改),在这种情况下,结果存储在变量中。
以下是一些可用的选择器:AT
、FOR []
和 REGEX
。
动作包括 APPEND
、PREPEND
、TOLOWER
、TOUPPER
、STRIP
、GENEX_STRIP
和 REPLACE
。它们的工作方式与具有相同名称的 string()
模式完全相同。
排序
以下是一些可用模式:
list(REVERSE )
简单地反转的顺序。
list(SORT )
按字母顺序对列表进行排序。有关更高级选项,请参阅在线手册。
file()
命令
此命令提供了与文件相关的各种操作:读取、传输、锁定和归档。它还提供了检查文件系统和对表示路径的字符串执行操作的模式。
完整详细信息可以在在线文档中找到:
读取
以下是一些可用模式:
file(READ [OFFSET ] [LIMIT ] [HEX])
从文件读取到
变量。读取可以从偏移量
开始,并具有可选的字节限制
。
HEX
标志指定输出应转换为十六进制表示。file(STRINGS )
从文件中读取字符串到
变量。
file( )
从文件中计算
哈希值,并将结果存储在
变量中。可用的算法与
string()
哈希函数相同。file(TIMESTAMP [])
生成文件的时间戳字符串表示,并将其存储在
变量中。可选地接受一个
字符串。
file(GET_RUNTIME_DEPENDENCIES [...])
为指定文件获取运行时依赖项。这是一个仅在install(CODE)
或install(SCRIPT)
场景中使用的高级命令。
编写
以下模式可用:
file({WRITE | APPEND} ...)
将所有参数写入或追加到
文件中。如果提供的系统路径不存在,它将递归创建。
file({TOUCH | TOUCH_NOCREATE} [...])
更新的时间戳。如果文件不存在,只有在
TOUCH
模式下才会创建它。file(GENERATE OUTPUT [...])
是一个高级模式,为当前 CMake 生成器的每个构建配置生成一个输出文件。file(CONFIGURE OUTPUT CONTENT [...])
类似于GENERATE_OUTPUT
,但它还会通过替换变量占位符来配置生成的文件。
文件系统
以下模式可用:
file({GLOB | GLOB_RECURSE} [...] [...])
生成与匹配的文件列表,并将其存储在
变量中。
GLOB_RECURSE
模式还将扫描嵌套目录。file(RENAME )
将文件从移动到
。
file({REMOVE | REMOVE_RECURSE } [...])
用于删除。
REMOVE_RECURSE
选项还会删除目录。file(MAKE_DIRECTORY [
...])
创建一个目录。file(COPY ... DESTINATION
[...])
将files
复制到 目的地。提供过滤、设置权限、符号链接链跟随等功能选项。file(SIZE )
读取文件的字节大小,并将其存储在
变量中。
file(READ_SYMLINK )
从符号链接中读取目标路径,并将其存储在
变量中。
file(CREATE_LINK [...])
在位置创建指向
的符号链接。
file({CHMOD|CHMOD_RECURSE} ... ... PERMISSIONS ... [...])
为文件和目录设置权限。
路径转换
以下模式可用:
file(REAL_PATH [BASE_DIRECTORY
])
从相对路径计算绝对路径,并将其存储在变量中。可选地接受 基础目录。该功能自 CMake 3.19 起可用。
file(RELATIVE_PATH )
计算相对于
的路径,并将其存储在
变量中。
file({TO_CMAKE_PATH | TO_NATIVE_PATH} )
将转换为 CMake 路径(目录用正斜杠分隔)或平台的本地路径,并将结果存储在
变量中。
传输
以下模式可用:
file(DOWNLOAD [] [...])
从下载文件并将其存储在路径中。
file(UPLOAD [...])
将上传到 URL。
锁定
锁定模式在 资源上放置一个建议锁:
file(LOCK <path> [DIRECTORY] [RELEASE] [GUARD <FUNCTION|FILE|PROCESS>] [RESULT_VARIABLE <out>] [TIMEOUT <seconds>])
此锁可以可选地作用于 FUNCTION
、FILE
或 PROCESS
,并带有 的超时。要释放锁,请提供
RELEASE
关键字。结果将存储在 变量中。
归档
归档的创建提供以下签名:
file(ARCHIVE_CREATE OUTPUT <destination> PATHS <source>... [FORMAT <format>] [COMPRESSION <type> [COMPRESSION_LEVEL <level>]] [MTIME <mtime>] [VERBOSE])
它在 路径上创建一个存档,包含
文件中的一种支持格式:
7zip
、gnutar
、pax
、paxr
、raw
或 zip
(paxr
为默认值)。如果所选格式支持压缩级别,它可以是一个单个数字 0-9
,其中 0
是默认值。
提取模式具有以下签名:
file(ARCHIVE_EXTRACT INPUT <archive> [DESTINATION <dir>] [PATTERNS <patterns>...] [LIST_ONLY] [VERBOSE])
它从 中提取匹配可选
值的文件到目标 。如果提供
LIST_ONLY
关键字,则不会提取文件,而只是列出文件。
math()
命令
CMake 还支持一些简单的算术运算。有关完整详细信息,请参阅在线文档:
cmake.org/cmake/help/latest/command/math.html
要评估一个数学表达式并将其作为可选的 (
HEXADECIMAL
或 DECIMAL
)字符串存储在 变量中,请使用以下签名:
math(EXPR <out> "<expression>" [OUTPUT_FORMAT <format>])
的值是一个支持 C 代码中存在的运算符的字符串(这里的意义相同):
- 算术:
+
、-
、*
、/
、%
(取模除法) - 位运算:
|
或,&
与,^
异或,~
非,<<
左移,>>
右移 - 圆括号 (…)
常数值可以以十进制或十六进制格式提供。
ut>` 变量中。
传输
以下模式可用:
file(DOWNLOAD [] [...])
从下载文件并将其存储在路径中。
file(UPLOAD [...])
将上传到 URL。
锁定
锁定模式在 资源上放置一个建议锁:
file(LOCK <path> [DIRECTORY] [RELEASE] [GUARD <FUNCTION|FILE|PROCESS>] [RESULT_VARIABLE <out>] [TIMEOUT <seconds>])
此锁可以可选地作用于 FUNCTION
、FILE
或 PROCESS
,并带有 的超时。要释放锁,请提供
RELEASE
关键字。结果将存储在 变量中。
归档
归档的创建提供以下签名:
file(ARCHIVE_CREATE OUTPUT <destination> PATHS <source>... [FORMAT <format>] [COMPRESSION <type> [COMPRESSION_LEVEL <level>]] [MTIME <mtime>] [VERBOSE])
它在 路径上创建一个存档,包含
文件中的一种支持格式:
7zip
、gnutar
、pax
、paxr
、raw
或 zip
(paxr
为默认值)。如果所选格式支持压缩级别,它可以是一个单个数字 0-9
,其中 0
是默认值。
提取模式具有以下签名:
file(ARCHIVE_EXTRACT INPUT <archive> [DESTINATION <dir>] [PATTERNS <patterns>...] [LIST_ONLY] [VERBOSE])
它从 中提取匹配可选
值的文件到目标 。如果提供
LIST_ONLY
关键字,则不会提取文件,而只是列出文件。
math()
命令
CMake 还支持一些简单的算术运算。有关完整详细信息,请参阅在线文档:
cmake.org/cmake/help/latest/command/math.html
要评估一个数学表达式并将其作为可选的 (
HEXADECIMAL
或 DECIMAL
)字符串存储在 变量中,请使用以下签名:
math(EXPR <out> "<expression>" [OUTPUT_FORMAT <format>])
的值是一个支持 C 代码中存在的运算符的字符串(这里的意义相同):
- 算术:
+
、-
、*
、/
、%
(取模除法) - 位运算:
|
或,&
与,^
异或,~
非,<<
左移,>>
右移 - 圆括号 (…)
常数值可以以十进制或十六进制格式提供。