面向 C++ 的现代 CMake 教程(五)(5)

简介: 面向 C++ 的现代 CMake 教程(五)

面向 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>)

参数是以下之一:LESSGREATEREQUALNOTEQUALLESS_EQUALGREATER_EQUAL。它将用于比较,并将结果(truefalse)存储在变量中。

散列

散列模式具有以下签名:

string(<algorithm> <out> <string>)

使用散列并将结果存储在变量中。支持以下算法:

  • MD5: 消息摘要算法 5,RFC 1321
  • SHA1: 美国安全散列算法 1,RFC 3174
  • SHA224: 美国安全散列算法,RFC 4634
  • SHA256: 美国安全散列算法,RFC 4634
  • SHA384: 美国安全散列算法,RFC 4634
  • SHA512: 美国安全散列算法,RFC 4634
  • SHA3_224: 凯凯 SHA-3
  • SHA3_256: 凯凯 SHA-3
  • SHA3_384: 凯凯 SHA-3
  • SHA3_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 ) 用于过滤 变量,以 INCLUDEEXCLUDE 包含或排除与 值匹配的元素。
  • 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 TOLOWERTOUPPERSTRIPGENEX_STRIPREPLACE  。它们的工作方式与具有相同名称的 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>])

此锁可以可选地作用于 FUNCTIONFILEPROCESS,并带有 的超时。要释放锁,请提供 RELEASE 关键字。结果将存储在 变量中。

归档

归档的创建提供以下签名:

file(ARCHIVE_CREATE OUTPUT <destination> PATHS <source>...
  [FORMAT <format>]
  [COMPRESSION <type> [COMPRESSION_LEVEL <level>]]
  [MTIME <mtime>] [VERBOSE])

它在 路径上创建一个存档,包含 文件中的一种支持格式:7zipgnutarpaxpaxrrawzippaxr 为默认值)。如果所选格式支持压缩级别,它可以是一个单个数字 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

要评估一个数学表达式并将其作为可选的 HEXADECIMALDECIMAL)字符串存储在 变量中,请使用以下签名:

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>])

此锁可以可选地作用于 FUNCTIONFILEPROCESS,并带有 的超时。要释放锁,请提供 RELEASE 关键字。结果将存储在 变量中。

归档

归档的创建提供以下签名:

file(ARCHIVE_CREATE OUTPUT <destination> PATHS <source>...
  [FORMAT <format>]
  [COMPRESSION <type> [COMPRESSION_LEVEL <level>]]
  [MTIME <mtime>] [VERBOSE])

它在 路径上创建一个存档,包含 文件中的一种支持格式:7zipgnutarpaxpaxrrawzippaxr 为默认值)。如果所选格式支持压缩级别,它可以是一个单个数字 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

要评估一个数学表达式并将其作为可选的 HEXADECIMALDECIMAL)字符串存储在 变量中,请使用以下签名:

math(EXPR <out> "<expression>" [OUTPUT_FORMAT <format>])

的值是一个支持 C 代码中存在的运算符的字符串(这里的意义相同):

  • 算术:+-*/%(取模除法)
  • 位运算:| 或,& 与,^ 异或,~ 非,<< 左移,>> 右移
  • 圆括号 (…)

常数值可以以十进制或十六进制格式提供。

相关文章
|
5天前
|
C++
Clion CMake C/C++程序输出乱码
Clion CMake C/C++程序输出乱码
7 0
|
6天前
|
存储 算法 编译器
C++ 函数式编程教程
C++ 函数式编程学习
|
6天前
|
存储 编译器 开发工具
C++语言教程分享
C++语言教程分享
|
6天前
|
存储 编译器 C++
|
27天前
|
C++ 存储 索引
面向 C++ 的现代 CMake 教程(一)(5)
面向 C++ 的现代 CMake 教程(一)
45 0
|
27天前
|
缓存 存储 C++
面向 C++ 的现代 CMake 教程(一)(4)
面向 C++ 的现代 CMake 教程(一)
45 0
|
27天前
|
C++ 缓存 存储
面向 C++ 的现代 CMake 教程(一)(3)
面向 C++ 的现代 CMake 教程(一)
43 0
|
27天前
|
缓存 C++ Windows
面向 C++ 的现代 CMake 教程(一)(2)
面向 C++ 的现代 CMake 教程(一)
57 0
|
27天前
|
C++ 容器 Docker
面向 C++ 的现代 CMake 教程(一)(1)
面向 C++ 的现代 CMake 教程(一)
67 0
|
2天前
|
C++
【C++】日期类Date(详解)②
- `-=`通过复用`+=`实现,`Date operator-(int day)`则通过创建副本并调用`-=`。 - 前置`++`和后置`++`同样使用重载,类似地,前置`--`和后置`--`也复用了`+=`和`-=1`。 - 比较运算符重载如`&gt;`, `==`, `&lt;`, `&lt;=`, `!=`,通常只需实现两个,其他可通过复合逻辑得出。 - `Date`减`Date`返回天数,通过迭代较小日期直到与较大日期相等,记录步数和符号。 ``` 这是236个字符的摘要,符合240字符以内的要求,涵盖了日期类中运算符重载的主要实现。