Porte helper autore
Le porte helper, dette anche porte script, espongono funzioni per altre porte da utilizzare durante il processo di compilazione. Ad esempio, la vcpkg-cmake
porta definisce la funzione per l'utilizzo vcpkg_cmake_configure()
di altre porte. Tramite la creazione di pacchetti di script comuni in una porta helper, la manutenzione diventa più semplificata perché gli aggiornamenti possono essere eseguiti in un'unica posizione. Inoltre, le porte helper possono essere con controllo delle versioni e dipendono dall'uso degli stessi meccanismi delle porte regolari.
Come funziona?
Le porte helper vengono implementate tramite il meccanismo di vcpkg-port-config.cmake
estensione.
Prima dell'esecuzione di una porta, vcpkg importerà qualsiasi vcpkg-port-config.cmake
file esportato dalle dipendenze dirette della porta da eseguire.
Se una porta helper dipende da una porta helper diversa, deve importare esplicitamente il vcpkg-port-config.cmake
file della relativa dipendenza. Le dipendenze delle porte helper-to-helper non devono essere contrassegnate come dipendenze host, in modo da garantire che uno script possa dipendere dall'altro nella stessa directory di installazione.
Le porte che dipendono da una porta helper devono contrassegnare la dipendenza come dipendenza host.
Le porte helper devono sempre installare il vcpkg-port-config.cmake
file in una share/${PORT}
sottodirectory nell'albero di installazione.
Esempio: Scrivere una semplice porta helper
1 - Creare un file CMake che definisce la funzione helper.
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()
Nella include_guard(GLOBAL)
parte superiore del file proteggere dalla ridefinizione di questa funzione quando il file viene incluso più volte.
Le righe seguenti dichiarano una funzione denominata my_helper_function
che visualizza un messaggio e chiama l'oggetto my_other_helper_function
definito in una porta helper diversa.
2 - Creare il file della porta helper 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)
Abilitando il VCPKG_POLICY_HELPER_PORT
criterio, vcpkg abilita i controlli post-compilazione che si applicano in modo specifico alle porte helper. In particolare, verifica che vcpkg-port-config.cmake
sia installato nel percorso corretto e che non siano installati file nella include
directory.
Le righe successive installano i file necessari vcpkg-port-config.cmake
e copyright
nel percorso corretto (share/${PORT}
).
3 - Creare il file della porta helper 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" }
]
}
È consigliabile usare version-date
come schema di controllo delle versioni per le porte helper.
In dependencies
questo esempio contiene un riferimento a un'altra porta helper denominata my-other-helper
. La dipendenza non è intenzionale non contrassegnata come dipendenza host perché si tratta di una dipendenza da porta helper-to-helper.
4 - Creare il file della porta helper 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")
Il vcpkg-port-config.cmake
file è costituito da tre righe, il primo è una protezione di inclusione globale che impedisce l'inclusione del file più volte.
La seconda riga include my-other-helper/vcpkg-port-config.cmake
per rendere le funzioni disponibili per my-other-helper
le porte che my-helper
dipendono da senza dover includere my-other-helper
nell'elenco delle dipendenze dirette.
Infine, viene incluso il my_helper_function.cmake
file che contiene la my_helper_function
definizione.
5 - Utilizzare my-helper
in un manifesto
Qualsiasi consumer di my-helper
deve includere solo una dipendenza diretta a my-helper
se stessa, non è necessaria alcuna dipendenza da my-other-helper
. Il manifesto di utilizzo deve contrassegnare la dipendenza come dipendenza host.
my-port/vcpkg.json
{
"name": "my-port",
"version": "1.0.0",
"dependencies": [
{
"name": "my-helper",
"host": true
}
]
}
In questo modo è my_helper_function
disponibile in my-port/portfile.cmake
.
my-port/portfile.cmake
my_helper_function()