概要(Synopsis)
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>
不是字符串变量,而是字符串值。
注意:<string-var>
是字符串变量。
搜索和替换 (Search and Replace)
例如:
set(S
"Pride and Prejudice is kind of a literary Rosetta Stone, the inspiration, basis, and model for so many modern novels. \
You’re probably more familiar with its plot and characters than you think. \
For a book written in the early 19th century, it’s modernity is surprising only until you realize that this is the novel that in many ways defined what a modern novel is.")
message("S: ${S}")
用纯字符串搜索和替换 (Search and Replace With Plain Strings)
string(FIND <string> <substring> <out-var> [...])
string(FIND <string> <substring> <output_variable> [REVERSE])
查找字符串的子串位置。
返回字符串 <string>
中给定 子串 <substring>
的第一次出现的位置。
如果使用了 REVERSE
标志,逆向搜索,表示最后一次出现子串的位置。
如果未找到子串 <substring>
,则返回 -1。
string(FIND)
子命令将所有字符串视为 ASCII
字符。
<output_variable>
将结果索引存储在该变量中。
例如,string(FIND ${S} "in" S_index)
查找子串 in
所在索引,并且将索引值保存在 S_index
变量中。
string(REPLACE <match-string> <replace-string> <out-var> <input>...)
string(REPLACE <match_string> <replace_string> <output_variable> <input> [<input>...])
将输入字符串 <input>
中所有出现的 <match-string>
替换为 <replace_string>
,并将结果存储在 <output_variable>
中。
例如,string(REPLACE "in" "out" S_out_var ${S})
将字符串中的所有字符 in
替换为 out
。
用正则表达式搜索和替换 (Search and Replace With Regular Expressions)
string(REGEX MATCH <match-regex> <out-var> <input>...)
string(REGEX MATCH <regular_expression> <output_variable> <input> [<input>...])
根据正则表达式匹配一次。
将所有输入字符串 <input>
在匹配之前都连接在一起,然后根据正则表达式 <regular_expression>
匹配一次,将该结果存储在 <output_variable>
。
例如,string(REGEX MATCH "[A-Za-z]*in[A-Za-z]*" S_out_var ${S})
匹配带有字符 in
的单词。
string(REGEX MATCHALL <match-regex> <out-var> <input>...)
string(REGEX MATCHALL <regular_expression> <output_variable> <input> [<input>...])
根据正则表达式尽可能匹配。
将所有输入字符串 <input>
在匹配之前都连接在一起,然后根据正则表达式 <regular_expression>
尽可能匹配,将所有结果存储在 <output_variable>
。
例如,string(REGEX MATCHALL "[A-Za-z]*in[A-Za-z]*" S_out_var ${S})
尽可能带有字符 in
的单词。
string(REGEX REPLACE <match-regex> <replace-expr> <out-var> <input>...)
string(REGEX REPLACE <regular_expression> <replacement_expression> <output_variable> <input> [<input>...])
根据正则表达式替换。
将所有输入字符串 <input>
在匹配之前都连接在一起,然后尽可能匹配 <regular_expression>
并替换为 <replacement_expression>
,将结果存储在 <output_variable>
。
例如,string(REGEX REPLACE "[A-Za-z]*in[A-Za-z]*" "hello" S_out_var ${S})
尽可能带有字符 in
的单词 替换为 字符 hello
。
<replacement_expression>
可以使用 \1, \2, …, \9
来引用括号匹配子表达式。请注意,CMake 代码
中需要两个反斜杠 \\1
才能通过参数解析获取反斜杠 \
。
例如,string(REGEX REPLACE "([A-Za-z]*in[A-Za-z]*)" "\\1_hello" S_out_var ${S})
尽可能带有字符 in
的单词,增加后缀 _hello
。
正则表达式规范 (Regex Specification)
特殊字符
^
: 匹配输入开头$
: 匹配输入结束.
: 匹配任意单个字符\<char>
: 匹配单字符<char>
。使用它来匹配特殊的正则表达式字符,例如\.
表示点,\\
表示反斜杠,\a
表示a
[ ]
: 匹配任何在括号内的字符[^ ]
: 匹配任何不在括号内的字符-
: 在方括号内,指定字符的范围,例如[a-f]
表示[abcdef]
,[0-3]
表示[0123]
,[+*/-]
表示数学运算符。*
: 匹配前面模式的零次或多次+
: 匹配前面模式的一次或多次?
: 匹配前面模式的零次或一次|
: 匹配|
两侧的模式()
: 保存匹配的子表达式(模式),可以在REGEX REPLACE
操作中引用。此外,它由所有与正则表达式相关的命令保存,包括 例如if(MATCHES)
,在变量CMAKE_MATCH_<n>
中<n>
为0..9
*
, +
和 ?
具有比 |
比 串联(concatenation) 有更高的优先级。
|
比 串联(concatenation) 有更低的优先级。
这意味着,正则表达式 ^ab+d$
,匹配 abbd
,但不匹配 ababd
。正则表达式 ^(ab|cd)$
,匹配 ab
,但不匹配 abd
CMake 语言转义序列
例如 \t
, \r
, \n
, 和 \\
可用于构造制表符, 回车符, 换行符 和 反斜杠 表示正则表达式。例如:
- 带引号参数
"[ \t\r\n]"
指定匹配任何单个空白字符的正则表达式。 - 带引号参数
"[/\\]"
指定匹配斜杠和反斜杠的正则表达式。 - 带引号参数
"[A-Za-z0-9_]"
指定匹配C 语言环境
中任何单个"单词"字符的正则表达式。 - 带引号参数
"\\(\\a\\+b\\)"
指定了一个匹配确切字符串(a+b)
的正则表达式。
操纵 (Manipulation)
string(APPEND <string-var> [<input>...])
string(APPEND <string_variable> [<input>...])
将所有字符串 <input>
附加到变量 <string_variable>
末尾。
例如,string(APPEND S " Stone")
将字符串 Stone
附加到变量 S
末尾
string(PREPEND <string-var> [<input>...])
string(PREPEND <string_variable> [<input>...])
将所有字符串 <input>
添加到变量 <string_variable>
首部。
例如,string(PREPEND S "Stone ")
将字符串 Stone
附加到变量 S
首部
string(CONCAT <out-var> [<input>...])
string(CONCAT <output_variable> [<input>...])
将所有字符串 <input>
连接在一起,并将结果存储在变量 <output_variable>
。
例如,string(CONCAT S_out "Rosetta" " Stone")
将字符串 Rosetta
和 Stone
连接在一起,并将结果存储在变量 S_out
中
string(JOIN <glue> <out-var> [<input>...])
string(JOIN <glue> <output_variable> [<input>...])
使用 <glue>
字符,将所有字符串 <input>
连接在一起,并将结果存储在变量 <output_variable>
。
例如,string(CONCAT " " S_out "Rosetta" "Stone")
使用字符空格字符,将字符串 Rosetta
和 Stone
连接在一起,并将结果存储在变量 S_out
中
string(TOLOWER <string> <out-var>)
string(TOLOWER <string> <output_variable>)
将字符串 <string>
转换为小写的字符。
例如,string(TOLOWER "Hello" S_out)
将字符串 Hello
转换为小写
string(TOUPPER <string> <out-var>)
string(TOUPPER <string> <output_variable>)
将字符串 <string>
转换为大写的字符。
例如,string(TOUPPER "Hello" S_out)
将字符串 Hello
转换为大写
string(LENGTH <string> <out-var>)
string(LENGTH <string> <output_variable>)
计算字符串 <string>
的长度,并将结果存储到变量 <output_variable>
中
例如,string(LENGTH "Hello" S_len)
计算字符串 Hello
的长度
string(SUBSTRING <string> <begin> <length> <out-var>)
string(SUBSTRING <string> <begin> <length> <output_variable>)
将字符串 <string>
的子串存储在变量 <output_variable>
中。子串是从 begin
索引开始,长度为 <length>
。
例如,string(SUBSTRING "Hello World" 2 5 S_sub)
将字符串 Hello World
,获取索引 2,长度 5 的子串 llo W
string(STRIP <string> <out-var>)
string(STRIP <string> <output_variable>)
删除字符串 <string>
前导和尾随空格,将结果存储在变量 <output_variable>
中。
例如,string(STRIP " Hello World " S_out)
删除字符串 Hello World
前导和尾随空格
string(GENEX_STRIP <string> <out-var>)
string(GENEX_STRIP <string> <output_variable>)
Strip any generator expressions from the input and store the result in the <output_variable>.
https://cmake.org/cmake/help/v3.19/manual/cmake-generator-expressions.7.html
string(REPEAT <string> <count> <out-var>)
string(REPEAT <string> <count> <output_variable>)
产生字符串 <string>
的重复次数 <count>
,将结果存储在变量 <output_variable>
中。
例如,string(REPEAT "Hello" 3 S_out)
产生的字符串为 HelloHelloHello
比较 (Comparison)
string(COMPARE <op> <string1> <string2> <out-var>)
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>
中。
注意:比较大小写敏感。
例如,string(COMPARE LESS "Hello" "hello" S_out)
字符串 Hello
比 hello
小。
哈希 (Hashing)
string(<HASH> <out-var> <input>)
string(<HASH> <output_variable> <input>)
计算字符串 <input>
的哈希值。支持 <HASH>
算法的名称是:
MD5
: 消息摘要算法(Message-Digest Algorithm) 5, RFC 1321.
SHA1
: 美国安全散列算法(US Secure Hash Algorithm) 1, RFC 3174.
SHA224
: US Secure Hash Algorithms, RFC 4634.
SHA256
: US Secure Hash Algorithms, RFC 4634.
SHA384
: US Secure Hash Algorithms, RFC 4634.
SHA512
: US Secure Hash Algorithms, RFC 4634.
SHA3_224
: Keccak SHA-3.
SHA3_256
: Keccak SHA-3.
SHA3_384
: Keccak SHA-3.
SHA3_512
: Keccak SHA-3.
例如,简单用一些哈希算法计算文本的哈希值。
set(S "Hello World")
string(MD5 S_md5 ${S})
message("S_md5: ${S_md5}")
string(SHA1 S_sha1 ${S})
message("S_sha1: ${S_sha1}")
string(SHA256 S_sha256 ${S})
message("S_sha256: ${S_sha256}")
产生 (Generation)
string(ASCII <number>... <out-var>)
string(ASCII <number> [<number> ...] <output_variable>)
将所有数字转换为响应的 ASCII 字符。
string(HEX <string> <out-var>)
string(HEX <string> <output_variable>)
将字符串中每个字节转换为十六进制表示。
string(CONFIGURE <string> <out-var> [...])
string(CONFIGURE <string> <output_variable> [@ONLY] [ESCAPE_QUOTES])
像 configure_file()
一样的规则转换 <string>
例子,将 configure 字符串根据规则替换
set(VAR 1)
string(CONFIGURE "#cmakedefine VAR @VAR@" S_out)
message("S_out: ${S_out}")
string(MAKE_C_IDENTIFIER <string> <out-var>)
string(MAKE_C_IDENTIFIER <string> <output_variable>)
将字符串转换为标识符。将字符串中的每个非字母数字字符转换为下划线。
string(RANDOM [<option>...] <out-var>)
string(RANDOM [LENGTH <length>] [ALPHABET <alphabet>] [RANDOM_SEED <seed>] <output_variable>)
给定字符组 <alphabet>
和 长度 <length>
产生随机的字符串。默认长度为 5,默认字符组为所有数字和大小写字母。
如果给出整数 RANDOM_SEED
,则其值将用于为随机数生成器提供种子。
例子,产生长度为 12 的随机字符串
set(CHARs "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ#@!")
string(RANDOM LENGTH 12 ALPHABET ${CHARs} S_out)
message("S_out: ${S_out}")
string(TIMESTAMP <out-var> [<format string>] [UTC])
string(TIMESTAMP <output_variable> [<format_string>] [UTC])
将当前日期和时间的字符串,存储到变量 <output_variable>
UTC
表示采用协调世界时(UTC),而不是本地时间
<format_string>
表示格式化日期和时间,格式符说明:
%% A literal percent sign (%).
%d The day of the current month (01-31).
%H The hour on a 24-hour clock (00-23).
%I The hour on a 12-hour clock (01-12).
%j The day of the current year (001-366).
%m The month of the current year (01-12).
%b Abbreviated month name (e.g. Oct).
%B Full month name (e.g. October).
%M The minute of the current hour (00-59).
%s Seconds since midnight (UTC) 1-Jan-1970 (UNIX time).
%S The second of the current minute. 60 represents a leap second. (00-60)
%U The week number of the current year (00-53).
%w The day of the current week. 0 is Sunday. (0-6)
%a Abbreviated weekday name (e.g. Fri).
%A Full weekday name (e.g. Friday).
%y The last two digits of the current year (00-99)
%Y The current year.
如果未给出明确的 <format_string>
,它将默认为:
%Y-%m-%dT%H:%M:%S for local time.
%Y-%m-%dT%H:%M:%SZ for UTC.
string(UUID <out-var> ...)
string(UUID <output_variable> NAMESPACE <namespace> NAME <name> TYPE <MD5|SHA1> [UPPER])
根据 RFC4122,基于 <namespace>
和 <name>
的组合值的哈希运算,并创建一个通用唯一标识符(UUID 又名为 GUID)。
哈希算法是 MD5(版本 3 UUID)
或 SHA1(版本 5 UUID)
。
UUID
格式为 xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
,其中每个 x
代表一个小写十六进制字符。
UPPER
表示用大写表示。
例子,运行单元测试 Uuid.cmake
(https://github.com/Kitware/CMake/blob/master/Tests/RunCMake/string/Uuid.cmake)
set(UUID_DNS_NAMESPACE 6ba7b810-9dad-11d1-80b4-00c04fd430c8)
string(
UUID WWW_EXAMPLE_COM_MD5_UUID
NAMESPACE ${UUID_DNS_NAMESPACE}
NAME "www.example.com"
TYPE MD5
)
string(
UUID WWW_EXAMPLE_COM_SHA1_UUID
NAMESPACE ${UUID_DNS_NAMESPACE}
NAME "www.example.com"
TYPE SHA1 UPPER
)
message("WWW_EXAMPLE_COM_MD5_UUID: ${WWW_EXAMPLE_COM_MD5_UUID}")
message("WWW_EXAMPLE_COM_SHA1_UUID: ${WWW_EXAMPLE_COM_SHA1_UUID}")
JSON
查询 JSON 字符串的功能。
string(JSON <out-var> [ERROR_VARIABLE <error-var>]
GET <json-string> <member|index> [<member|index> ...])
string(JSON <out-var> [ERROR_VARIABLE <error-variable>]
GET <json-string> <member|index> [<member|index> ...])
获取 JSON 字符串的元素。
Array
和 object
元素将返回 JSON 字符串。
Boolean
元素将返回 ON
或 OFF
。
Null
元素返回一个空字符串。
Number
和 string
返回一个字符串。
string(JSON <out-var> [ERROR_VARIABLE <error-var>]
TYPE <json-string> <member|index> [<member|index> ...])
string(JSON <out-var> [ERROR_VARIABLE <error-variable>]
TYPE <json-string> <member|index> [<member|index> ...])
获取 JSON 字符串的元素的类型。
输出的类型 <out-var>
为 NULL
, NUMBER
, STRING
, BOOLEAN
, ARRAY
, 或 OBJECT
.
string(JSON <out-var> [ERROR_VARIABLE <error-var>]
MEMBER <json-string> [<member|index> ...] <index>)
string(JSON <out-var> [ERROR_VARIABLE <error-variable>]
MEMBER <json-string> [<member|index> ...] <index>)
获取 JSON 字符串指定索引的成员名称。
string(JSON <out-var> [ERROR_VARIABLE <error-var>]
LENGTH <json-string> <member|index> [<member|index> ...])
string(JSON <out-var> [ERROR_VARIABLE <error-variable>]
LENGTH <json-string> <member|index> [<member|index> ...])
获取 JSON 字符串元素的长度。
string(JSON <out-var> [ERROR_VARIABLE <error-var>]
REMOVE <json-string> <member|index> [<member|index> ...])
string(JSON <out-var> [ERROR_VARIABLE <error-variable>]
REMOVE <json-string> <member|index> [<member|index> ...])
从 JSON 字符串中删除一个元素。
string(JSON <out-var> [ERROR_VARIABLE <error-var>]
SET <json-string> <member|index> [<member|index> ...] <value>)
string(JSON <out-var> [ERROR_VARIABLE <error-variable>]
SET <json-string> <member|index> [<member|index> ...] <value>)
设置 JSON 字符串中元素的值。
string(JSON <out-var> [ERROR_VARIABLE <error-var>]
EQUAL <json-string1> <json-string2>)
string(JSON <out-var> [ERROR_VARIABLE <error-var>]
EQUAL <json-string1> <json-string2>)
比较两个 JSON 对象是否相等。