创作帮助程序端口

帮助程序端口(也称为脚本端口)公开函数,供其他端口在其生成过程中使用。 例如,vcpkg-cmake 端口定义 vcpkg_cmake_configure() 函数供其他端口使用。 通过将公用脚本打包到帮助程序端口中,可以在单个位置进行更新,从而使维护变得更加简化。 此外,可以使用与常规端口相同的机制对帮助程序端口进行版本控制和依赖。

它们如何工作?

帮助程序端口通过 vcpkg-port-config.cmake 扩展机制实现。

在执行端口之前,vcpkg 将导入由即将执行的端口的直接依赖项导出的任何 vcpkg-port-config.cmake 文件。

如果一个帮助程序端口依赖于其他帮助程序端口,则必须显式导入其依赖项的 vcpkg-port-config.cmake 文件。 不应将帮助程序到帮助程序端口依赖项标记为主机依赖项,这可确保一个脚本可以依赖于同一安装目录中的另一个脚本。

依赖于帮助程序端口的端口应将依赖项标记为主机依赖项

帮助程序端口必须始终在安装树share/${PORT} 子目录中安装其 vcpkg-port-config.cmake 文件。

示例:编写简单的帮助程序端口

1 - 创建定义帮助程序函数的 CMake 文件。

my-helper/my_helper_function.cmake

include_guard(GLOBAL)

function(my_helper_function)
  message(STATUS "my_helper_function() was called")
  my_other_helper_function()
endfunction()

当文件被多次包含时,文件顶部的 include_guard(GLOBAL) 可防止重新定义此函数。

以下几行声明了一个名为 my_helper_function 的函数,该函数显示一条消息并调用在另一个帮助程序端口中定义的 my_other_helper_function

2 - 创建帮助程序端口的 porftile.cmake 文件

my-helper/portfile.cmake

set(VCPKG_POLICY_HELPER_PORT enabled)

file(INSTALL
  "${CMAKE_CURRENT_LIST_DIR}/vcpkg-port-config.cmake"
  DESTINATION "${CURRENT_PACKAGES_DIR}/share/${PORT}")

file(INSTALL "${VCPKG_ROOT_DIR}/LICENSE.txt" DESTINATION "${CURRENT_PACKAGES_DIR}/share/${PORT}" RENAME copyright)

通过启用 VCPKG_POLICY_HELPER_PORT 策略,vcpkg 可以启用专门适用于帮助程序端口的生成后检查。 具体来说,检查 vcpkg-port-config.cmake 是否安装在正确的路径中,以及 include 目录中是否没有安装任何文件。

接下来的几行将所需的 vcpkg-port-config.cmakecopyright 文件安装在正确的位置 (share/${PORT})。

3 - 创建帮助程序端口的 vcpkg.json 文件

my-helper/vcpkg.json

{
  "name": "my-helper",
  "version-date": "2024-03-20",
  "description": "Provide my_helper_function()",
  "license": "MIT",
  "dependencies": [ 
    { "name": "my-other-helper" } 
  ]
}

建议使用 version-date 作为帮助程序端口的版本控制方案

本示例中的 dependencies 包含对另一个名为 my-other-helper 的帮助程序端口的引用。 故意不将依赖项标记为主机依赖项,因为这是一个帮助程序到帮助程序的端口依赖项。

4 - 创建帮助程序端口的 vcpkg-port-config.cmake 文件

my-helper/vcpkg-port-config.cmake

include_guard(GLOBAL)

include("${CMAKE_CURRENT_LIST_DIR}/../my-other-helper/vcpkg-port-config.cmake")
include("${CMAKE_CURRENT_LIST_DIR}/my_helper_function.cmake")

vcpkg-port-config.cmake 文件由三行组成,第一行是全局包含防护,可防止文件被多次包含。

第二行包含 my-other-helper/vcpkg-port-config.cmake,使 my-other-helper 中的函数可供依赖 my-helper 的端口使用,而不必将 my-other-helper 包含在其直接依赖项列表中。

最后,还包括 my_helper_function.cmake 文件,其中包含 my_helper_function 定义。

5 - 在清单中使用 my-helper

my-helper 的任何使用者只需要包含对 my-helper 本身的直接依赖,而不需要对 my-other-helper 的依赖。 使用清单应将依赖项标记为主机依赖项。

my-port/vcpkg.json

{
  "name": "my-port",
  "version": "1.0.0",
  "dependencies": [
    {
      "name": "my-helper",
      "host": true
    }
  ]
}

这使得 my_helper_functionmy-port/portfile.cmake 中可用。

my-port/portfile.cmake

my_helper_function()