Créer des ports d’assistance
Les ports d’assistance, également appelés ports de script, exposent les fonctions d’autres ports à consommer pendant leur processus de génération. Par exemple, le vcpkg-cmake
port définit la vcpkg_cmake_configure()
fonction pour les autres ports à consommer. En empaquetant des scripts courants dans un port d’assistance, la maintenance devient plus rationalisée, car les mises à jour peuvent être effectuées dans un emplacement unique. En outre, les ports d’assistance peuvent être versionnés et dépendent de l’utilisation des mêmes mécanismes que les ports standard.
Comment fonctionnent-ils ?
Les ports d’assistance sont implémentés via le mécanisme d’extension vcpkg-port-config.cmake
.
Avant l’exécution d’un port, vcpkg importe tout vcpkg-port-config.cmake
fichier exporté par les dépendances directes du port sur le point d’être exécuté.
Si un port d’assistance dépend d’un autre port d’assistance, il doit importer explicitement le vcpkg-port-config.cmake
fichier de sa dépendance. Les dépendances de port d’assistance à assistance ne doivent pas être marquées comme dépendances d’hôte, ce qui garantit qu’un script peut dépendre de l’autre étant dans le même répertoire d’installation.
Les ports qui dépendent d’un port d’assistance doivent marquer la dépendance comme dépendance hôte.
Les ports d’assistance doivent toujours installer leur vcpkg-port-config.cmake
fichier dans un share/${PORT}
sous-répertoire dans l’arborescence d’installation.
Exemple : Écrire un port d’assistance simple
1 - Créez un fichier CMake qui définit la fonction d’assistance.
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()
En include_guard(GLOBAL)
haut du fichier, protégez-vous contre la redéfinition de cette fonction lorsque le fichier est inclus plusieurs fois.
Les lignes suivantes déclarent une fonction nommée my_helper_function
qui affiche un message et appelle celle my_other_helper_function
définie dans un autre port d’assistance.
2 - Créer le fichier du port d’assistance 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)
En activant la VCPKG_POLICY_HELPER_PORT
stratégie, vcpkg active les case activée post-build qui s’appliquent spécifiquement aux ports d’assistance. Plus précisément, les case activée installées vcpkg-port-config.cmake
dans le chemin d’accès correct et qu’aucun fichier n’est installé dans le include
répertoire.
Les lignes suivantes installent les fichiers requis vcpkg-port-config.cmake
à copyright
leur emplacement correct (share/${PORT}
).
3 - Créer le fichier du port d’assistance 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" }
]
}
Nous vous recommandons d’utiliser version-date
le schéma de contrôle de version pour les ports d’assistance.
L’exemple dependencies
suivant contient une référence à un autre port d’assistance nommé my-other-helper
. La dépendance n’est pas marquée comme une dépendance hôte, car il s’agit d’une dépendance de port d’assistance à assistance.
4 - Créer le fichier du port d’assistance 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")
Le vcpkg-port-config.cmake
fichier se compose de trois lignes, le premier est un garde d’inclusion global qui empêche le fichier d’être inclus plusieurs fois.
La deuxième ligne inclut my-other-helper/vcpkg-port-config.cmake
de rendre les fonctions my-other-helper
disponibles pour les ports qui dépendent my-helper
sans qu’elles n’ont à inclure my-other-helper
dans leur liste de dépendances directes.
Enfin, le my_helper_function.cmake
fichier qui contient la my_helper_function
définition est inclus.
5 - Consommer my-helper
dans un manifeste
Tout consommateur de n’a my-helper
besoin d’inclure qu’une dépendance directe à my-helper
elle-même, aucune dépendance n’est my-other-helper
nécessaire. Le manifeste consommateur doit marquer la dépendance en tant que dépendance hôte.
my-port/vcpkg.json
{
"name": "my-port",
"version": "1.0.0",
"dependencies": [
{
"name": "my-helper",
"host": true
}
]
}
Cela rend my_helper_function
disponible en my-port/portfile.cmake
.
my-port/portfile.cmake
my_helper_function()