细绳

字符串操作。

概要

Search and Replace
  string(FIND <string> <substring> <out-var> [...])
  string(REPLACE <match-string> <replace-string> <out-var> <input>...)
  string(REGEX MATCH <match-regex> <out-var> <input>...)
  string(REGEX MATCHALL <match-regex> <out-var> <input>...)
  string(REGEX REPLACE <match-regex> <replace-expr> <out-var> <input>...)

Manipulation
  string(APPEND <string-var> [<input>...])
  string(PREPEND <string-var> [<input>...])
  string(CONCAT <out-var> [<input>...])
  string(JOIN <glue> <out-var> [<input>...])
  string(TOLOWER <string> <out-var>)
  string(TOUPPER <string> <out-var>)
  string(LENGTH <string> <out-var>)
  string(SUBSTRING <string> <begin> <length> <out-var>)
  string(STRIP <string> <out-var>)
  string(GENEX_STRIP <string> <out-var>)
  string(REPEAT <string> <count> <out-var>)

Comparison
  string(COMPARE <op> <string1> <string2> <out-var>)

Hashing
  string(<HASH> <out-var> <input>)

Generation
  string(ASCII <number>... <out-var>)
  string(HEX <string> <out-var>)
  string(CONFIGURE <string> <out-var> [...])
  string(MAKE_C_IDENTIFIER <string> <out-var>)
  string(RANDOM [<option>...] <out-var>)
  string(TIMESTAMP <out-var> [<format string>] [UTC])
  string(UUID <out-var> ...)

JSON
  string(JSON <out-var> [ERROR_VARIABLE <error-var>]
         {GET | TYPE | LENGTH | REMOVE}
         <json-string> <member|index> [<member|index> ...])
  string(JSON <out-var> [ERROR_VARIABLE <error-var>]
         MEMBER <json-string>
         [<member|index> ...] <index>)
  string(JSON <out-var> [ERROR_VARIABLE <error-var>]
         SET <json-string>
         <member|index> [<member|index> ...] <value>)
  string(JSON <out-var> [ERROR_VARIABLE <error-var>]
         EQUAL <json-string1> <json-string2>)

搜索和替换

搜索并替换为纯字符串

string(FIND <string> <substring> <output_variable> [REVERSE])

返回在提供的 <string> 中找到给定 <substring> 的位置。如果使用了 REVERSE 标志,该命令将搜索指定的 <substring> 最后一次出现的位置。如果未找到 <substring>,则返回位置 -1。

string(FIND) 子命令将所有字符串视为纯 ASCII 字符。 <output_variable> 中存储的索引也将以字节计算,因此包含多字节字符的字符串可能会导致意外结果。

string(REPLACE <match_string>
       <replace_string> <output_variable>
       <input> [<input>...])

<input> 中所有出现的 <match_string> 替换为 <replace_string> 并将结果存储在 <output_variable> 中。

搜索并替换为正则表达式

string(REGEX MATCH <regular_expression>
       <output_variable> <input> [<input>...])

匹配 <regular_expression> 一次并将匹配存储在 <output_variable> 中。所有``<input>``参数在匹配之前被连接起来。正则表达式在下面的小节中指定。

string(REGEX MATCHALL <regular_expression>
       <output_variable> <input> [<input>...])

尽可能多次匹配``<regular_expression>``并将匹配项作为列表存储在``<output_variable>``中。所有``<input>``参数在匹配之前被连接起来。

string(REGEX REPLACE <regular_expression>
       <replacement_expression> <output_variable>
       <input> [<input>...])

尽可能多次匹配 <regular_expression> 并用 <replacement_expression> 替换输出中的匹配项。所有``<input>``参数在匹配之前被连接起来。

<replacement_expression> 可以使用 \1, \2, ..., \9 引用匹配的括号分隔的子表达式。请注意,CMake 代码中需要两个反斜杠(\\1)才能通过参数解析获得反斜杠。

正则表达式规范

以下字符在正则表达式中具有特殊含义:

^

在输入的开头匹配

$

输入结束匹配

.

匹配任何单个字符

\<字符>

匹配由 <char> 指定的单个字符。使用它来匹配特殊的正则表达式字符,例如``.`` 用于文字 .\` 用于文字反斜杠 \。转义非特殊字符是不必要的,但允许,例如``a`` 匹配 a

[]

匹配括号内的任何字符

[^]

匹配任何不在括号内的字符

-

在方括号内,指定两边字符之间的包含范围,例如``[a-f]`` 是 [abcdef] 要使用方括号匹配文字 -,请将其作为第一个或最后一个字符,例如``[+*/-]`` 匹配基本的数学运算符。

*

匹配前面的模式零次或多次

+

匹配前面的模式一次或多次

匹配前面的模式零次或一次

|

匹配``|``两侧的模式

()

保存匹配的子表达式,可以在 REGEX REPLACE 操作中引用。

在 3.9 版本加入: 所有与正则表达式相关的命令,包括例如 if(MATCHES),将子组匹配保存在变量中:variable:CMAKE_MATCH_<n> for <n> 0..9。

*+? 的优先级高于串联。 | 的优先级低于串联。这意味着正则表达式 ^ab+d$ 匹配 abbd 但不匹配 ababd,而正则表达式 ^(ab|cd)$ 匹配 ab``但不是``abd

CMake 语言 转义序列 例如 t`\r\n\\ 可用于构造文字制表符、回车符、换行符和反斜杠(分别)以传递正则表达式。例如:

  • 引用的参数 ``"[ trn]" `` 指定匹配任何单个空白字符的正则表达式。

  • 引用的参数``"[/\]"`` 指定匹配单个正斜杠``/`` 或反斜杠```` 的正则表达式。

  • 引用的参数``"[A-Za-z0-9_]"`` 指定一个匹配 C 语言环境中任何单个“单词”字符的正则表达式。

  • 引用的参数 "\\(\\a\\+b\\)" 指定一个正则表达式来匹配精确的字符串 (a+b)。每个 \\ 在引用参数中被解析为 \,因此正则表达式本身实际上是 \(\a\+\b\)。这也可以在 括号参数 中指定,而不必转义反斜杠,例如``[[(a+b)]]``。

操纵

string(APPEND <string_variable> [<input>...])

在 3.4 版本加入.

将所有 <input> 参数附加到字符串。

string(PREPEND <string_variable> [<input>...])

在 3.10 版本加入.

将所有 <input> 参数添加到字符串中。

string(CONCAT <output_variable> [<input>...])

将所有“<input>”参数连接在一起并将结果存储在命名的“<output_variable>”中。

string(JOIN <glue> <output_variable> [<input>...])

在 3.12 版本加入.

使用 <glue> 字符串将所有 <input> 参数连接在一起,并将结果存储在命名的 <output_variable> 中。

要连接列表的元素,最好使用 list() 命令中的 JOIN 运算符。这允许元素中包含特殊字符,如 ;

string(TOLOWER <string> <output_variable>)

<string> 转换为小写字符。

string(TOUPPER <string> <output_variable>)

<string> 转换为大写字符。

string(LENGTH <string> <output_variable>)

将给定字符串的长度(以字节为单位)存储在“<output_variable>”中。请注意,这意味着如果 <string> 包含多字节字符,则存储在 <output_variable> 中的结果*不是*字符数。

string(SUBSTRING <string> <begin> <length> <output_variable>)

<output_variable> 中存储给定 <string> 的子字符串。如果 <length>-1,则将返回从 <begin> 开始的字符串的其余部分。

在 3.2 版本发生变更: 如果 <string><length> 短,则使用字符串的结尾。以前版本的 CMake 在这种情况下会报错。

<begin><length> 都以字节计算,因此如果 <string> 可能包含多字节字符,则必须小心。

string(STRIP <string> <output_variable>)

<output_variable> 中存储给定 <string> 的子字符串,删除前导和尾随空格。

string(GENEX_STRIP <string> <output_variable>)

在 3.1 版本加入.

从输入 <string> 中去除任何 generator expressions 并将结果存储在 <output_variable> 中。

string(REPEAT <string> <count> <output_variable>)

在 3.15 版本加入.

将输出字符串作为输入``<string>`` 重复``<count>`` 次。

比较

string(COMPARE LESS <string1> <string2> <output_variable>)
string(COMPARE GREATER <string1> <string2> <output_variable>)
string(COMPARE EQUAL <string1> <string2> <output_variable>)
string(COMPARE NOTEQUAL <string1> <string2> <output_variable>)
string(COMPARE LESS_EQUAL <string1> <string2> <output_variable>)
string(COMPARE GREATER_EQUAL <string1> <string2> <output_variable>)

比较字符串并将 true 或 false 存储在 <output_variable> 中。

在 3.7 版本加入: 添加了 LESS_EQUALGREATER_EQUAL 选项。

哈希

string(<HASH> <output_variable> <input>)

计算 <input> 字符串的加密散列。支持的``<HASH>`` 算法名称是:

MD5

消息摘要算法 5,RFC 1321。

SHA1

美国安全哈希算法 1,RFC 3174。

SHA224

美国安全哈希算法,RFC 4634。

SHA256

美国安全哈希算法,RFC 4634。

SHA384

美国安全哈希算法,RFC 4634。

SHA512

美国安全哈希算法,RFC 4634。

SHA3_224

Keccak SHA-3。

SHA3_256

Keccak SHA-3。

SHA3_384

Keccak SHA-3。

SHA3_512

Keccak SHA-3。

在 3.8 版本加入: 添加了``SHA3_*`` 哈希算法。

一代

string(ASCII <number> [<number> ...] <output_variable>)

将所有数字转换成相应的 ASCII 字符。

string(HEX <string> <output_variable>)

在 3.18 版本加入.

将输入“<string>”中的每个字节转换为其十六进制表示形式,并将连接的十六进制数字存储在“<output_variable>”中。输出中的字母(af)是小写的。

string(CONFIGURE <string> <output_variable>
       [@ONLY] [ESCAPE_QUOTES])

转换一个 <string> 就像 configure_file() 转换一个文件。

string(MAKE_C_IDENTIFIER <string> <output_variable>)

将输入“<string>”中的每个非字母数字字符转换为下划线,并将结果存储在“<output_variable>”中。如果 <string> 的第一个字符是数字,下划线也将添加到结果前面。

string(RANDOM [LENGTH <length>] [ALPHABET <alphabet>]
       [RANDOM_SEED <seed>] <output_variable>)

返回给定 <length> 的随机字符串,由给定 <alphabet> 中的字符组成。默认长度为 5 个字符,默认字母表为所有数字和大小写字母。如果给出一个整数``RANDOM_SEED``,它的值将用于随机数生成器的种子。

string(TIMESTAMP <output_variable> [<format_string>] [UTC])

将当前日期和/或时间的字符串表示写入``<output_variable>``。

如果命令无法获取时间戳,<output_variable> 将被设置为空字符串``""``

可选的“UTC”标志要求当前日期/时间表示采用协调世界时 (UTC) 而不是本地时间。

可选的 <format_string> 可能包含以下格式说明符:

%%

在 3.8 版本加入.

文字百分号 (%)。

%d

当月的第几天 (01-31)。

%H

24 小时制的小时 (00-23)。

%我

12 小时制的小时 (01-12)。

%j

本年度的第几天 (001-366)。

%m

当前年份的月份 (01-12)。

%b

在 3.7 版本加入.

缩写的月份名称(例如 Oct)。

%B

在 3.10 版本加入.

完整的月份名称(例如十月)。

%M

当前小时的分钟 (00-59)。

%s

在 3.6 版本加入.

自 1970 年 1 月 1 日午夜 (UTC) 以来的秒数(UNIX 时间)。

%S

当前分钟的秒数。 60代表闰秒。 (00-60)

%f

在 3.23 版本加入.

当前秒的微秒 (000000-999999)。

%U

当前年份的周数 (00-53)。

%V

在 3.22 版本加入.

当前年份的 ISO 8601 周数 (01-53)。

%w

当前星期几。 0 是星期天。 (0-6)

%a

在 3.7 版本加入.

缩写的工作日名称(例如 Fri)。

%A

在 3.10 版本加入.

完整的工作日名称(例如星期五)。

%y

当前年份的最后两位数 (00-99)。

%Y

本年度。

%z

在 3.26 版本加入.

时区与 UTC 的偏移量,以小时和分钟为单位,格式为“+hhmm”或“-hhmm”。

%Z

在 3.26 版本加入.

时区名称。

未知的格式说明符将被忽略并按原样复制到输出中。

如果没有给出明确的``<format_string>``,它将默认为:

%Y-%m-%dT%H:%M:%S    for local time.
%Y-%m-%dT%H:%M:%SZ   for UTC.

在 3.8 版本加入: 如果设置了 SOURCE_DATE_EPOCH 环境变量,将使用它的值而不是当前时间。有关详细信息,请参阅 https://reproducible-builds.org/specs/source-date-epoch/

string(UUID <output_variable> NAMESPACE <namespace> NAME <name>
       TYPE <MD5|SHA1> [UPPER])

在 3.1 版本加入.

根据 RFC4122,根据 <namespace>``(它本身必须是有效的 UUID)和 ``<name> 的组合值的散列创建一个通用唯一标识符(又名 GUID)。哈希算法可以是“MD5”(第 3 版 UUID)或“SHA1”(第 5 版 UUID)。 UUID 的格式为“xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx”,其中每个“x”代表一个小写十六进制字符。如果需要,可以使用可选的“UPPER”标志请求大写表示。

JSON

在 3.19 版本加入.

查询 JSON 字符串的功能。

备注

在以下每个与 JSON 相关的子命令中,如果提供了可选的 ERROR_VARIABLE 参数,将在 <error-variable> 中报告错误,并设置 <out-var>``到 ``<member|index>-[<member|index>...]-NOTFOUND 到错误发生点的路径元素,或者如果没有相关路径则只是 NOTFOUND。如果发生错误但不存在“ERROR_VARIABLE”选项,则会生成致命错误消息。如果没有错误发生,<error-variable> 将被设置为``NOTFOUND``。

string(JSON <out-var> [ERROR_VARIABLE <error-variable>]
       GET <json-string> <member|index> [<member|index> ...])

在由 <member|index> 参数列表给定的位置从 <json-string> 获取一个元素。数组和对象元素将作为 JSON 字符串返回。布尔元素将返回为 ONOFF。 Null 元素将作为空字符串返回。数字和字符串类型将作为字符串返回。

string(JSON <out-var> [ERROR_VARIABLE <error-variable>]
       TYPE <json-string> <member|index> [<member|index> ...])

<member|index> 参数列表给定的位置获取 <json-string> 中元素的类型。 <out-var> 将被设置为 NULLNUMBERSTRINGBOOLEANARRAYOBJECT 之一

string(JSON <out-var> [ERROR_VARIABLE <error-var>]
       MEMBER <json-string>
       [<member|index> ...] <index>)

<member|index> 参数列表给定的位置获取 <json-string> 中第 <index> 成员的名称。需要对象类型的元素。

string(JSON <out-var> [ERROR_VARIABLE <error-variable>]
       LENGTH <json-string> [<member|index> ...])

<member|index> 参数列表给定的位置获取 <json-string> 中元素的长度。需要数组或对象类型的元素。

string(JSON <out-var> [ERROR_VARIABLE <error-variable>]
       REMOVE <json-string> <member|index> [<member|index> ...])

<member|index> 参数列表给定的位置从 <json-string> 中删除一个元素。没有删除元素的 JSON 字符串将存储在 <out-var> 中。

string(JSON <out-var> [ERROR_VARIABLE <error-variable>]
       SET <json-string> <member|index> [<member|index> ...] <value>)

<member|index> 参数列表给定的位置处将 <json-string> 中的元素设置为 <value><value> 的内容应该是有效的 JSON。

string(JSON <out-var> [ERROR_VARIABLE <error-var>]
       EQUAL <json-string1> <json-string2>)

比较 <json-string1><json-string2> 给出的两个 JSON 对象是否相等。 <json-string1> 和``<json-string2>`` 的内容应该是有效的 JSON。如果 JSON 对象被认为相等,则 <out-var> 将设置为真值,否则设置为假值。