Vytváření pomocných portů
Pomocné porty, označované také jako porty skriptu, zpřístupňují funkce pro ostatní porty, které budou během procesu sestavení využívat. Port například vcpkg-cmake
definuje vcpkg_cmake_configure()
funkci pro ostatní porty, které se mají využívat. Zabalením běžných skriptů do pomocného portu se údržba zjednoduší, protože aktualizace se dají provádět v jednom umístění. Pomocné porty se navíc dají zřazit a záviset na použití stejných mechanismů jako běžné porty.
Jak fungují?
Pomocné porty se implementují prostřednictvím vcpkg-port-config.cmake
mechanismu rozšíření.
Před spuštěním portu vcpkg naimportuje všechny vcpkg-port-config.cmake
soubory, které byly exportovány přímými závislostmi portu, které se mají spustit.
Pokud pomocný port závisí na jiném pomocném portu, musí explicitně importovat vcpkg-port-config.cmake
soubor jeho závislosti. Závislosti portů pomocné rutiny by neměly být označené jako závislosti hostitelů. Tím se zajistí, že jeden skript může záviset na druhém, který je ve stejném instalačním adresáři.
Porty, které závisí na pomocném portu, by měly označit závislost jako závislost hostitele.
Pomocné porty musí vždy nainstalovat soubor vcpkg-port-config.cmake
do share/${PORT}
podadresáře ve stromu instalace.
Příklad: Zápis jednoduchého pomocného portu
1 – Vytvořte soubor CMake, který definuje pomocnou funkci.
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()
Horní include_guard(GLOBAL)
část souboru chrání před opětovným nadefinováním této funkce, pokud je soubor součástí vícekrát.
Následující řádky deklarují funkci s názvem my_helper_function
, která zobrazí zprávu a zavolá my_other_helper_function
, která je definována v jiném pomocném portu.
2. Vytvoření pomocného porftile.cmake
souboru portu
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)
Když povolíte zásadu VCPKG_POLICY_HELPER_PORT
, vcpkg povolí kontroly po sestavení, které se vztahují konkrétně na pomocné porty. Konkrétně zkontroluje, zda vcpkg-port-config.cmake
je nainstalována ve správné cestě a že v include
adresáři nejsou nainstalovány žádné soubory.
Další řádky nainstalují požadované vcpkg-port-config.cmake
soubory a copyright
soubory do správného umístění (share/${PORT}
).
3. Vytvoření pomocného vcpkg.json
souboru portu
my-helper/vcpkg.json
{
"name": "my-helper",
"version-date": "2024-03-20",
"description": "Provide my_helper_function()",
"license": "MIT",
"dependencies": [
{ "name": "my-other-helper" }
]
}
Pro pomocné porty doporučujeme použít version-date
schéma správy verzí.
V dependencies
tomto příkladu obsahuje odkaz na jiný pomocný port s názvem my-other-helper
. Závislost je účelná, není označena jako závislost hostitele, protože se jedná o pomocnou závislost na portu.
4. Vytvoření pomocného vcpkg-port-config.cmake
souboru portu
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")
Soubor vcpkg-port-config.cmake
se skládá ze tří řádků, první je globální ochrana zahrnutí, která brání tomu, aby se soubor zahrnul vícekrát.
Druhý řádek zahrnuje my-other-helper/vcpkg-port-config.cmake
zpřístupnění funkcí my-other-helper
pro porty, na my-helper
které závisí, aniž by je museli zahrnout my-other-helper
do seznamu přímých závislostí.
Nakonec je zahrnut soubor my_helper_function.cmake
, který obsahuje definici my_helper_function
.
5. Využití my-helper
v manifestu
Každý uživatel, který my-helper
potřebuje pouze zahrnout přímou závislost, my-helper
není nutná žádná závislost my-other-helper
. Manifest využívající by měl označit závislost jako závislost hostitele.
my-port/vcpkg.json
{
"name": "my-port",
"version": "1.0.0",
"dependencies": [
{
"name": "my-helper",
"host": true
}
]
}
Tato možnost je my_helper_function
k dispozici v my-port/portfile.cmake
souboru .
my-port/portfile.cmake
my_helper_function()