美文网首页
cmake file命令详解

cmake file命令详解

作者: 刘亚彬92 | 来源:发表于2018-09-30 16:34 被阅读0次

    资源

    本文档翻译自官方 file 文档,更新日期:2018年9月28日

    大纲

    Reading

      file(READ <filename> <out-var> [...])
      file(STRINGS <filename> <out-var> [...])
      file(<HASH> <filename> <out-var>)
      file(TIMESTAMP <filename> <out-var> [...])
    

    Writing

      file({WRITE | APPEND} <filename> <content>...)
      file({TOUCH | TOUCH_NOCREATE} [<file>...])
      file(GENERATE OUTPUT <output-file> [...])
    

    Filesystem

      file({GLOB | GLOB_RECURSE} <out-var> [...] [<globbing-expr>...])
      file(RENAME <oldname> <newname>)
      file({REMOVE | REMOVE_RECURSE } [<files>...])
      file(MAKE_DIRECTORY [<dir>...])
      file({COPY | INSTALL} <file>... DESTINATION <dir> [...])
    

    Path Conversion

      file(RELATIVE_PATH <out-var> <directory> <file>)
      file({TO_CMAKE_PATH | TO_NATIVE_PATH} <path> <out-var>)
    

    Transfer

      file(DOWNLOAD <url> <file> [...])
      file(UPLOAD <file> <url> [...])
    

    Locking

    file(LOCK <path> [...])
    

    Reading

    file(READ <filename> <variable>
         [OFFSET <offset>] [LIMIT <max-in>] [HEX])
    

    读取文件名为 <filename> 的文件并将其内容存储到 <variable> 变量中。可选的参数: <offset> 指定起始读取位置,<max-in> 最多读取字节数,HEX 将数据转为十六进制(处理二进制数据十分有用)。

    file(STRINGS <filename> <variable> [<options>...])
    

    <filename> 文件解析一串 ASCII 字符串并存储到 <variable> 中。文件中的二进制文件将被忽略。回车字符(\r,CR)将被忽略。选项如下:

    LENGTH_MAXIMUM <max-len> :只考虑比给定长度少的字符串。

    LENGTH_MINIMUM <min-len> :只考虑比给定长度多的字符串。

    LIMIT_COUNT <max-num> :限制提取不同字符的数量。

    LIMIT_INPUT <max-in> :限制从文件读取的字节总数。

    LIMIT_OUTPUT <max-out> : 限制存储到 <variable> 变量中的字节数。

    NEWLINE_CONSUME : 将新行字符串(\n,LF)作为字符内容的一部分而不是终止。

    NO_HEX_CONVERSION :Intel Hex 和 Motorola S-record 文件在读取时自动转化为二进制,除非这个参数被指定。

    REGEX <regex> :只考虑匹配正则表达式的字符串。

    ENCODING <encoding-type> : 指定字符串的编码,目前支持的编码有:UTF-8, UTF-16LE, UTF-16BE, UTF-32LE, UTF-32BE。如果 ENCODING 选项没有指定且文件有字节顺序标志(Byte Order Mark),ENCODING 选择会根据字节顺序标志选择默认值。

    例如:

    file(STRINGS myfile.txt myfile)

    上面代码存储文件中的列表,其中每一个元素在文件中占一行。

    file(<HASH> <filename> <variable>)

    上面代码计算文件内容的哈希值并存储在 <variable> 中。支持的 <HASH> 算法名字在 string(<HASH>) 命令中列出。

    file(TIMESTAMP <filename> <variable> [<format>] [UTC])

    计算一个体现文件修改时间的字符串并将其存储到 <variable> 中。如果该命令不能获得时间戳变量则输出为空字符串("")。

    查看 string(TIMESTAMP) 命令来获得 <format>UTC 选项。

    Writing

    file(WRITE <filename> <content>...)
    file(APPEND <filename> <content>...)
    

    写入 <content><filename> 文件中。如果文件不存在则创建。如果文件已存在,WRITE 模式将覆盖内容,如果为 APPEND 模式将追加内容。任何在 <filename> 文件路径中的不存在文件夹都将被创建。

    如果文件是构建输入,使用 configure_file() 命令来保证只在内容更改时更新文件。

    file(TOUCH [<files>...])
    file(TOUCH_NOCREATE [<files>...])
    

    如果文件不存在创建一个空文件。如果文件已存在,在函数执行时,它的访问和修改时间将被更新到函数调用执行时刻。

    使用 TOUCH_NOCREATE 访问一个已存在的文件但不会创建它,如果文件不存在,该命令将被静默的忽略。

    使用 TOUCHTOUCH_NOCREATE 都将修改已存在文件的内容。

    file(GENERATE OUTPUT output-file
         <INPUT input-file|CONTENT content>
         [CONDITION expression])
    

    给当前 CMake Generator 支持的每一个构建配置产生一个输出文件。从输入内容计算 生成器表达式(generator expressions) 并产生输出内容。选项如下:

    CONDITION <condition> : 对条件为真的特定配置产生输出文件。在计算生成器表达式之后条件必须为0或者1.

    CONTENT <content> :使用明确指定的内容作为输入。

    INPUT <input-file> : 从指定文件获取内容作为输入。如果是相对路径认为是相对于 CMAKE_CURRENT_SOURCE_DIR 。详情查看 CMP0070 规则。

    OUTPUT <output-file> :指定产生的输出文件名。使用生成器表达式(例如$<CONFIG>)产生特定的配置输出文件名。如果生成内容一致,则多个配置可能产生相同输出文件。否则 <output-file> 必须给每个配置计算一个单独的文件名。相对路径(在计算生成器表达式之后)被认为是相对于 CMAKE_CURRENT_BINARY_DIR 。详情查看 CMP0070 规则。

    必须给定确切的一个 CONTENTINPUT 。一个特定的 OUTPUT 文件最多被一个 file(GENERATE) 调用(invocation)命名。在后续 cmake 运行时,只有当其内容修改了,生成文件才会被修改且对应的时间戳被更新。

    还要注意,file(GENERATE)直到生成阶段才会创建输出文件。当 file(GENERATE) 命令返回时输出文件还没有被写入,只有当处理完整个项目的 CMakeLists.txt 文件才会被写入。

    Filesystem

    file(GLOB <variable>
         [LIST_DIRECTORIES true|false] [RELATIVE <path>] [CONFIGURE_DEPENDS]
         [<globbing-expressions>...])
    file(GLOB_RECURSE <variable> [FOLLOW_SYMLINKS]
         [LIST_DIRECTORIES true|false] [RELATIVE <path>] [CONFIGURE_DEPENDS]
         [<globbing-expressions>...])
    

    产生一个匹配 <globbing-expressions> 的文件列表并将它存储到变量 <variable> 中。文件名替代表达式和正则表达式相似,但更简单。如果 RELATIVE 标志位被设定,将返回指定路径的相对路径。结果将按字典顺序排序。

    如果 CONFIGURE_DEPENDS 标志位被指定,CMake 将在编译时给主构建系统添加逻辑来检查目标,以重新运行 GLOB 标志的命令。如果任何输出被改变,CMake都将重新生成这个构建系统。

    注意:我们不推荐使用 GLOB 来从源文件树收集源文件列表。如果当源文件添加或删除时没有 CMakeLists.txt 文件被修改,那么在 CMake 重新生成时并不会识别出它们。CONFIGURE_DEPENDS 标志位可能不会再所有生成器上可靠的工作,如果一个新的生成器在以后被添加,并不会被支持。如果项目使用它将会被卡主。即使 CONFIGURE_DEPENDS 可靠的工作,在每个重新构建的过程中做检查也十分浪费性能。

    文件名替代表达式的使用示例如下:

    *.cxx      - 匹配所有后缀名为 cxx 的文件
    *.vt?      - 匹配所有后缀名为 vta,...,vtz 的文件
    f[3-5].txt - 匹配 f3.txt, f4.txt, f5.txt 文件
    

    GLOB_RECURSE 将会递归所有匹配文件夹的子文件夹和匹配的文件。子文件夹为符号链接时只有当 FOLLOW_SYMLINKS 被指定或规则 CMP0009 没有设置为 NEW 时才会被递归。

    默认 GLOB_RECURSE 省略结果列表中的目录,设置 LIST_DIRECTORIES 为 true 来添加目录到结果列表中。如果 FOLLOW_SYMLINKS 被指定或规则 CMP0009 没有设置为 OLDLIST_DIRECTORIES 将符号链接作为路径。

    递归文件名包括的例子:

    /dir/*.py  - match all python files in /dir and subdirectories
    
    file(RENAME <oldname> <newname>)
    

    在文件系统中从 <oldname> 移动文件或文件夹到 <newname> ,自动替换目标路径。

    file(REMOVE [<files>...])
    file(REMOVE_RECURSE [<files>...])
    

    移动指定文件,REMOVE_RECURSE 模式将移动给定文件和文件夹,和非空文件夹。如果指定文件不存在不会给出错误。

    file(MAKE_DIRECTORY [<directories>...])
    

    创建给定文件夹,并根据需求创建其父文件夹。

    file(<COPY|INSTALL> <files>... DESTINATION <dir>
         [FILE_PERMISSIONS <permissions>...]
         [DIRECTORY_PERMISSIONS <permissions>...]
         [NO_SOURCE_PERMISSIONS] [USE_SOURCE_PERMISSIONS]
         [FILES_MATCHING]
         [[PATTERN <pattern> | REGEX <regex>]
          [EXCLUDE] [PERMISSIONS <permissions>...]] [...])
    

    COPY 表示复制文件、路径和符号链接到目标路径。以相对当前源文件路径计算输入路径的相对路径,以相对当前构建路径计算目标路径。复制保留输入文件时间戳,文件如果存在目标路径且时间戳相同,会对其进行优化。复制保留输入文件访问权限,除非明确权限或 指定NO_SOURCE_PERMISSIONS(默认指定 USE_SOURCE_PERMISSIONS)。

    查看 install(DIRECTORY) 命令了解文件权限,FILES_MATCHING, PATTERN, REGEXEXCLUDE 选项。复制文件夹时会保留它们的文件结构,即使使用选项来选择文件的子集。

    INSTALL 选项和 COPY 略有不同:它打印状态信息(根据 CMAKE_INSTALL_MESSAGE) 变量,默认为 NO_SOURCE_PERMISSIONS 选项。安装脚本使用 install() 命令产生,install() 命令使用了 INSTALL 选项并附带一些内部选项供内部使用。

    Path Conversion

    file(RELATIVE_PATH <variable> <directory> <file>)
    

    计算文件 <file> 相对<directory> 的相对路径并存储到 <viriable> 变量中。

    file(TO_CMAKE_PATH "<path>" <variable>)
    file(TO_NATIVE_PATH "<path>" <variable>)
    

    <TO_CMAKE_PATH> 模式转换一个本地 <path> 为带 (/) 的 cmake 风格路径。输入可以是一个路径或系统搜索路径(如:$ENV{PATH})。一个搜索路径可以被转换为以 : 分割的 cmake 风格列表。

    <TO_NATIVE_PATH> 模式转换一个 cmake 风格的 <path> 为一个本地路径,路径根据平台 \(windows 平台)或使用 / (其他平台)。

    应总是使用双引号将将 <path> 括起来以保证它在此命令中作为单个参数对待。

    Transfer

    file(DOWNLOAD <url> <file> [<options>...])
    file(UPLOAD   <file> <url> [<options>...])
    

    <DOWNLOAD> 模式将下载指定的 <url> 到本地 <file>UPLOAD 模式将上传本地 <file> 到给定的 <url>

    <DOWNLOAD><UPLOAD> 都有以下选项:

    INACTIVITY_TIMEOUT <seconds>: 在活动停止一段时间后终止操作。

    LOG <variable>: 存储人眼可读的本操作日志到指定变量。

    SHOW_PROGRESS: 在操作完成前,将过程信息作为状态信息进行打印。

    STATUS <variable>: 将操作结果的状态存储到指定变量中。状态是一个以 ; 分割有2个元素的列表。第一个元素是操作的数字返回值,第二个变量是错误信息的字符串。数字0 意味着在操作过程中没有错误。

    TIMEOUT<seconds>: 在指定的总时间过后终止操作。

    UPERPWD <username>:<password>: 设置操作的用户名和密码。

    HTTPHEADER <HTTP-header>: 操作的 HTTP 头。子选项可以重复多次。

    NETRC <level>: 指定操作将使用哪个 .netrc 文件。如果该选项没有给定,将使用 CMAKE_NETRC 变量进行替代。可用等级如下:

    • IGNORED: .netrc 文件被忽略,该选项为默认选项。
    • OPTIONAL: .netrc 文件是可选的,URL 中的信息优先使用。该文件将被扫描,以查找在 URL 中没有指定的哪些信息。
    • REQUIRED: .netrc 文件是必须的,URL 中的信息将被忽略。

    NETRC_FILE <file>: 如果 NETRC 等级为 OPTIONALREQUIRED,该参数给你家目录下的 .netrc 文件指定一个替代文件。如果该参数没有被指定,将会使用 `CMAKE_NETRC 变量替代。

    如果两个 NETRC 参数都没有指定,CMake 将对应的检测 CMAKE_NETRCCMAKE_NETRC_FILE 变量。

    关于DOWNLOAD的额外选项 :

    EXPECTED_HASH ALGO=<value>: 验证下载内容的 hash 值是否匹配给定值,其中 ALGOfile(<HASH>)支持的其中一种算法。如果不匹配,操作失败返回错误。

    EXPECTED_MD5 <value>: Historical short-hand for EXPECTED_HASH MD5=<value>.

    TLS_VERIFY <ON|OFF>: 指定哪里去验证服务器的 https:// URLS 证书。默认不验证。

    TLS_CAINFO <file>: 给 https:// URLs 指定用户证书授权文件。

    对于 https:// URLs CMake 必须在支持 OpenSSL 下进行构建。默认 TLS/SSL 验证是不检查的。设置 TLS_VERIFYON 来检查验证或者使用 EXPECTED_HASH 来验证现在文件的内容。如果两个 TLS 都没有指定,CMake 将对应的检测 CMAKE_TLS_VERIFYCMAKE_TLS_CAINFO 变量。

    Locking

    file(LOCK <path> [DIRECTORY] [RELEASE]
         [GUARD <FUNCTION|FILE|PROCESS>]
         [RESULT_VARIABLE <variable>]
         [TIMEOUT <seconds>])
    

    如果没有指定 DIRECTORY 选项和 <path>/cmake.lock 文件,将锁定一个 <path> 指定的文件。文件将会在 GUARD 选项(默认为PROCESS)定义的区域内锁定。RELEASE选项可以被明确的来解锁文件。如果 TIMEOUT选项没有指定,CMake 将会等待锁定完成或出现错误失败。如果 TIMEOUT 被设置为0,锁将会执行一次并立刻报告执行结果。如果 TIMEOUT 不是0,CMake 将在 <seconds> 指定的时间内尝试锁定文件。如果没有指定 RESULT_VARIABLE 选项,任何错误将会作为严重错误来打断操作。否则结果将被存储在 <variable> 中且在成功时返回0或在失败时返回错误信息。

    注意锁只是一个建议——无法保证其他进程响应该锁,也就是说,所锁同步两个或多个共享一些可修改资源的 CMake 实例。相同的逻辑使用 DIRECTORY 选项——锁住父文件夹并不能阻止其他 LOCK 命令锁任何子文件夹或文件。

    不允许尝试锁定文件两次。任何中间文件夹和文件本身不存在的话都将被创建。RELEASE 操作期间 GUARDTIMEOUT 参数将被忽略。

    相关文章

      网友评论

          本文标题:cmake file命令详解

          本文链接:https://www.haomeiwen.com/subject/ktiwoftx.html