Создание вспомогательных портов
Вспомогательные порты, также называемые портами скриптов, предоставляют функции для других портов, которые будут использоваться во время их сборки. Например, 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()