相关文章推荐
爱听歌的刺猬  ·  在 React ...·  7 月前    · 
坚韧的丝瓜  ·  python - Jquery and ...·  1 年前    · 
不爱学习的手套  ·  JMS VS ...·  1 年前    · 
聪明的瀑布  ·  Centos7.7 配置OpenVPN ...·  1 年前    · 
  • 除了 out-parameters,我们始终使用 cmake_parse_arguments() 而不是函数参数或引用 ${ARG<N>}

  • 对于“脚本本地帮助程序函数”,不一定需要遵循此要求

  • 在这种情况下,位置参数应放在函数声明中 (而不是使用 ${ARG<N>} ) ,并且应根据本地规则 ( snake_case 即) 命名。
  • 异常:在检查 ARGC 后,应通过 set(argument_name "${ARG<N>}") 为可选位置参数指定名称。
  • out-parameters 应是函数的第一个参数。 例如:

    function(format out_var)
      cmake_parse_arguments(PARSE_ARGV 1 "arg" ...)
      # ... set(buffer "output")
      set("${out_var}" "${buffer}" PARENT_SCOPE)
    endfunction()
    
  • 所有 cmake_parse_arguments 都必须使用 PARSE_ARGV

  • 所有 foreach 循环都必须使用 IN LISTSIN ITEMSRANGE

  • 变量 ${ARGV}${ARGN} 未引用,但发送给用户的有用消息除外。

  • (即 message(FATAL_ERROR "blah was passed extra arguments: ${ARGN}"))
  • 我们始终使用函数,而不是宏或顶级代码。

  • 异常:“script-local helper 宏”。 有时,定义小型宏会很有帮助。 应谨慎执行此操作,并且应首选函数。
  • 异常: vcpkg.cmakefind_package
  • 脚本树中的脚本不应在正常操作过程中需要观察到的更改。

  • 示例冲突: vcpkg_acquire_msys() 由于 MSYS 项目删除旧包,具有硬编码的包和版本需要随时间推移进行更新。
  • 示例异常: vcpkg_from_sourceforge() 具有需要维护但对调用方没有明显行为影响的镜像列表。
  • 引用规则:CMake 中有三种类型的参数 - 无引号 () foo(BAR) 、引用 () foo("BAR") 和括号 (foo([[BAR]])) 。 请遵循以下规则正确引用:

  • 如果参数包含变量扩展 ${...},则必须用引号括起来。

  • 异常:当一个变量作为多个参数传递给函数时,“splat”变量扩展。 在这种情况下, 参数应只是 ${foo}

    vcpkg_list(SET working_directory)
    if(DEFINED "arg_WORKING_DIRECTORY")
      vcpkg_list(SET working_directory WORKING_DIRECTORY "${arg_WORKING_DIRECTORY}")
    endif()
    # calls do_the_thing() if NOT DEFINED arg_WORKING_DIRECTORY,
    # else calls do_the_thing(WORKING_DIRECTORY "${arg_WORKING_DIRECTORY}")
    do_the_thing(${working_directory})
    
    if("${FOO}" STREQUAL "BAR") # ...
    if("${BAZ}" EQUAL "0") # ...
    if("FOO" IN_LIST list_variable) # ...
    if("${bar}" MATCHES [[a[bcd]+\.[bcd]+]]) # ...
    
  • 对于单个表达式和不采用 <variable|string>的其他类型的谓词,请使用普通规则。

    如果变量打算在本地使用,则必须将其显式初始化为空 set(foo "") (如果它是字符串变量,如果是 vcpkg_list(SET foo) 列表变量)。

  • set(var) 不应使用 。 使用 unset(var) 取消设置变量, set(var "") 将其设置为空字符串,并将其 vcpkg_list(SET var) 设置为空列表。 注意:空字符串和空列表是相同的值;这是一个表示法差异,而不是结果的差异

  • 应记录跨 API 边界从父范围继承的所有变量, (即,不应记录文件本地函数) 。 三重文件中提到的所有变量都被视为文档化。

  • Out 参数仅在 中 PARENT_SCOPE 设置,永远不会读取。 另请参阅通过函数范围转发参数的帮助程序 z_vcpkg_forward_output_variable()

  • CACHE 变量仅用于在强耦合函数内部共享的全局变量,以及单个函数的内部状态,以避免重复工作。 应非常谨慎地使用这些变量,并应使用 Z_VCPKG_ 前缀,以避免与将由任何其他代码定义的任何本地变量发生冲突。

  • vcpkg_cmake_configureZ_VCPKG_CMAKE_GENERATOR
  • z_vcpkg_get_cmake_varsZ_VCPKG_GET_CMAKE_VARS_FILE
  • include()仅在 或 vcpkg-port-config.cmakeports.cmake允许使用 s。

  • foreach(RANGE)的参数 必须始终是 自然数,并且 <start>必须始终 小于或等于 <stop>

  • 必须通过如下所示的内容进行检查:

    if("${start}" LESS_EQUAL "${end}")
      foreach(RANGE "${start}" "${end}")
      endforeach()
    endif()
    

    需要 CMake 版本

  • 除 之外vcpkg.cmake的所有 CMake 脚本都可能假定 中cmake_minimum_requiredports.cmake存在的 CMake 版本。
  • 每次将新版本的 CMake 添加到 vcpkgTools.xml时,都会cmake_minimum_required发生此问题,就像所有帮助程序CMakeLists.txt文件中的 一样cmake_minimum_required
  • vcpkg.cmake 一般情况下,必须假定 CMake 版本回到 3.7.2
    • 特定函数和选项可能假定更高版本的 CMake;如果存在,请确保使用所需的 CMake 版本注释该函数或选项。
    • 更改现有函数

    • 从不删除非内部函数中的参数;如果他们不应该再执行任何操作,只需将其视为正常,并在使用时发出警告。
    • 切勿添加新的必需参数。
    • cmake_parse_arguments:将前缀设置为 "arg"

    • 局部变量命名为 snake_case

    • 内部全局变量名称的 Z_VCPKG_前缀为 。

    • 外部实验性全局变量名称的 X_VCPKG_前缀为 。

    • 内部函数的前缀为 z_vcpkg_

    • 单个函数内部的函数 (即) 的帮助程序函数命名 [z_]<func>_<name>为 ,其中 <func> 是它们作为帮助程序函数的函数的名称,是 <name> 帮助程序函数所执行的操作。
    • z_ 如果没有 <func>z_,但未命名帮助程序函数 z_z_foo_bar,则应将 添加到前面。
  •