Поделиться через


Создание вспомогательных портов

Вспомогательные порты, также называемые портами скриптов, предоставляют функции для других портов, которые будут использоваться во время их сборки. Например, vcpkg-cmake порт определяет vcpkg_cmake_configure() функцию для других портов, используемых. Упаковав распространенные сценарии в вспомогательный порт, обслуживание становится более упрощенным, так как обновления можно выполнять в одном расположении. Кроме того, вспомогательные порты можно использовать версии и зависеть от использования одних и того же механизма, что и обычные порты.

Как они работают?

Вспомогательные порты реализуются через vcpkg-port-config.cmake механизм расширения.

Перед выполнением порта vcpkg импортирует любой vcpkg-port-config.cmake файл, экспортируемый прямыми зависимостями порта.

Если вспомогательный порт зависит от другого вспомогательного порта, он должен явно импортировать vcpkg-port-config.cmake файл своей зависимости. Вспомогательные зависимости портов не должны быть помечены как зависимости узлов. Это гарантирует, что один скрипт может зависеть от другого в том же каталоге установки.

Порты, зависящие от вспомогательного порта, должны пометить зависимость как зависимость узла.

Вспомогательные порты всегда должны устанавливать их vcpkg-port-config.cmake файл в share/${PORT} подкаталоге в дереве установки.

Пример. Создание простого вспомогательного порта

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.cmake и copyright файлы в правильном расположении (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_function доступным в my-port/portfile.cmake.

my-port/portfile.cmake

my_helper_function()