Sdílet prostřednictvím


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-datesché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.cmakesouboru 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.cmakesouboru .

my-port/portfile.cmake

my_helper_function()