细绳¶
字符串操作。
概要¶
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_EQUAL 和 GREATER_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_224Keccak SHA-3。
SHA3_256Keccak SHA-3。
SHA3_384Keccak SHA-3。
SHA3_512Keccak SHA-3。
在 3.8 版本加入: 添加了``SHA3_*`` 哈希算法。
一代¶
string(ASCII <number> [<number> ...] <output_variable>)
将所有数字转换成相应的 ASCII 字符。
string(HEX <string> <output_variable>)
在 3.18 版本加入.
将输入“<string>”中的每个字节转换为其十六进制表示形式,并将连接的十六进制数字存储在“<output_variable>”中。输出中的字母(a 到 f)是小写的。
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)。
%H24 小时制的小时 (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 字符串返回。布尔元素将返回为 ON 或 OFF。 Null 元素将作为空字符串返回。数字和字符串类型将作为字符串返回。
string(JSON <out-var> [ERROR_VARIABLE <error-variable>]
TYPE <json-string> <member|index> [<member|index> ...])
在 <member|index> 参数列表给定的位置获取 <json-string> 中元素的类型。 <out-var> 将被设置为 NULL、NUMBER、STRING、BOOLEAN、ARRAY 或 OBJECT 之一。
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> 将设置为真值,否则设置为假值。