Outils pour utilisateurs

Outils du site


prog:vcpkg

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
Prochaine révision
Révision précédente
prog:vcpkg [2024/03/05 12:20] – [Arborescence des dossiers] : binary caching rootprog:vcpkg [2024/08/28 14:09] (Version actuelle) – [Récupérer le code source] : fix typo root
Ligne 3: Ligne 3:
 =====Utilisation===== =====Utilisation=====
  
-====Standalone====+====Exécution====
  
 C'est un installateur de dépendances en compilant depuis les sources. C'est un installateur de dépendances en compilant depuis les sources.
Ligne 9: Ligne 9:
 Il suffit d'ajouter en tant que submodule le projet et de suivre les indications : Il suffit d'ajouter en tant que submodule le projet et de suivre les indications :
  
-  * Télécharger le dépôt+===Télécharger le dépôt===
  
 <code bash> <code bash>
Ligne 15: Ligne 15:
 </code> </code>
  
-  * Générer le bootstrap+===Générer le bootstrap===
  
 Sous Windows : Sous Windows :
Ligne 28: Ligne 28:
 </code> </code>
  
-  * Installer les librairies+===Installer les librairies=== 
 + 
 +''vcpkg'' peut fonctionner en deux modes : classique ou ''manifest''
 + 
 +En mode classique, il faut passer en ligne de commande la liste des librairies à installer. En mode ''manifest'', un fichier ''vcpkg.json'' va être lu pour extraire la liste des librairies à installer. 
 + 
 +  * Mode classique 
 + 
 +Il n'est pas possible de sélectionner le mode de fonctionnement. ''vcpkg'' va automatiquement chercher le fichier ''vcpkg.json'' dans les dossiers parents et active le mode ''manifest'' si le fichier est trouvé.
  
 <code bash> <code bash>
Ligne 46: Ligne 54:
 Échec: ''%%./vcpkg install --triplet=x64-linux-dynamic qt --dry-run%%'' : ''%%qtwebengine is only supported on '!static & !((x86 | arm) & windows)', which does not match x64-linux.%%'' Échec: ''%%./vcpkg install --triplet=x64-linux-dynamic qt --dry-run%%'' : ''%%qtwebengine is only supported on '!static & !((x86 | arm) & windows)', which does not match x64-linux.%%''
  
-  * Spécificité à Windows+  * Mode ''manifest'' 
 + 
 +Toutes les commandes précédents sont valables si on enlève le nom des paquets à installer (puisque les paquets sont définis dans le fichier ''vcpkg.json''). 
 + 
 +Si on souhaite installer une librairie qui dépend d'une feature, il faut ajouter l'option ''%%--x-feature=%%''. Pour plusieurs features, il faut plusieurs ''%%--x-feature=XXX --x-feature=YYY%%''
 + 
 +===Spécificité à Windows===
  
 Si un paquet échoue car la longueur du chemin Windows est trop long avec plus de 255 caractères (par exemple qtwebengine), plutôt que tout effacer et de tout recommencer avec le chemin ''c:\v'', utiliser : Si un paquet échoue car la longueur du chemin Windows est trop long avec plus de 255 caractères (par exemple qtwebengine), plutôt que tout effacer et de tout recommencer avec le chemin ''c:\v'', utiliser :
Ligne 56: Ligne 70:
 La liste complète des triplets peut se consulter dans le dossier ''vcpkg/triplets''. Le sous dossier ''community'' indique une disponibilité mais pas une obligation de support officiel. La liste complète des triplets peut se consulter dans le dossier ''vcpkg/triplets''. Le sous dossier ''community'' indique une disponibilité mais pas une obligation de support officiel.
  
 +===Expliciter les dossiers===
 +
 +Par défault, ''vcpkg'' va chercher le fichier ''vcpkg.json'' dans les dossiers parents. Il est possible d'expliciter l'emplacement des dossiers. Cela peut-être nécessaire pour exécuter ''vcpkg'' depuis Visual Studio.
 +
 +  * ''%%--vcpkg-root=%%'' pour spécifier l'emplacement du dépôt ''vcpkg''.
 +  * ''%%--x-manifest-root=%%'' pour spécifier l'emplacement des fichiers ''vcpkg.json'' et ''vcpkg-configuration.json'' (facultatif).
 +  * ''%%--x-install-root=%%'' pour l'emplacement du dossier d'installation.
 +
 +Il y a d'autres options pour des dossiers spécifiques mais ils sont plus rarement nécessaires (''%%--x-asset-sources=%%'', ''%%--x-buildtrees-root=%%'', ''%%--downloads-root=%%'', ''%%--x-packages-root=%%'', ''%%--x-builtin-ports-root=%%'', ''%%--x-builtin-registry-versions-dir=%%'', ''%%--overlay-triplets=%%'').
 ====Configuration globale==== ====Configuration globale====
  
Ligne 101: Ligne 124:
 La présente méthode va avoir plusieurs conséquences : La présente méthode va avoir plusieurs conséquences :
   * Il n'est possible d'avoir qu'un seul dépôt "intégré" (déclaré dans ''C:\Users\xxx\AppData\Local\vcpkg'').   * Il n'est possible d'avoir qu'un seul dépôt "intégré" (déclaré dans ''C:\Users\xxx\AppData\Local\vcpkg'').
-  * Si un projet dépend d'une librairie qui est déjà dans ''vcpkg'' mais avec une version différente, il va y avoir conflit et risque d'erreur de compilation.+  * Si un projet dépend d'une librairie qui est compilé en local alors qu'elle est également dans ''vcpkg'' mais avec une version différente, il va y avoir conflit et risque d'erreur de compilation.
 </WRAP> </WRAP>
  
Ligne 290: Ligne 313:
 ====portfile.cmake==== ====portfile.cmake====
  
-  * Récupérer le code source+===Récupérer le code source===
  
-SHA512 se calcule depuis l'URL https://github.com/[REPO]/archive/[REF].tar.gz. Mais pour faire simple, mettre 0 (pas vide) et laisser le téléchargement échouer. ''vcpkg'' affichera le bon ''SHA512''Si la valeur change à chaque fois, il y a probablement un problème de droit. Ouvrir le fichier téléchargé dans le dossier ''download'' avec un éditeur de texte pour vérifier le contenu (probablement une page HTML).+SHA512 se calcule depuis l'URL https://github.com/[REPO]/archive/[REF].tar.gz ou ''%%curl -H "PRIVATE-TOKEN: ${TOKEN}" -L git@[GITLAB_REPOSITORY]/[PROJECT]/-/archive/[VERSION]/[PROJECT]-[VERSION].tar.gz --output ${version}.tar.gz%%''. Mais pour faire simple, mettre 0 (pas vide) et laisser le téléchargement échouer. ''vcpkg'' affichera le bon ''SHA512''Il est aussi possible de mettre ''SKIP_SHA512'' (très mauvaise idée en production).
  
-''vcpkg_check_features'' active le define ''WITH_HDF5'' si la feature ''hdf5'' est activée.+Si la valeur change à chaque fois, il y a probablement un problème de droit. Ouvrir le fichier téléchargé dans le dossier ''download'' avec un éditeur de texte pour vérifier le contenu (probablement une page HTML).
  
-''vcpkg_cmake_configure''. ''BUILD_SHARED_LIBS'' est automatiquement transmis. Pour avoir la liste complète des variables automatiquement transmises, voir ''vcpkg\scripts\cmake\vcpkg_configure_cmake.cmake''+''vcpkg_from_github'' : par défaut, c'est systématiquement ''REF'' et son ''SHA512'' associé qui est utilisé.
- +
-''vcpkg_from_github'' : par défaut, c'est systématiquement ''REF'' et son ''SHA512'' associé qui est utilisé. Pour forcer l'utilisation de la branche ''HEAD_REF'', il faut ajouter ''set(VCPKG_USE_HEAD_VERSION ON)'' avant.+
  
 <code cmake> <code cmake>
Ligne 311: Ligne 332:
 </code> </code>
  
-  * Compiler+Il est possible de pointer vers une branche (port à usage de développement uniquement). 
 + 
 +On remplace ''REF'' par ''HEAD_REF'', on supprime ''SHA512'' et on définit ''VCPKG_USE_HEAD_VERSION'' pour forcer l'utilisation de ''HEAD_REF''
 + 
 +<code cmake> 
 +set(VCPKG_USE_HEAD_VERSION ON) 
 + 
 +vcpkg_from_gitlab( 
 +  OUT_SOURCE_PATH SOURCE_PATH 
 +  GITLAB_URL ${GITLAB_REPOSITORY} 
 +  REPO ${PROJECT} 
 +  HEAD_REF "master"
 +</code> 
 + 
 +===Compiler=== 
 + 
 +''vcpkg_check_features'' active le define ''WITH_HDF5'' si la feature ''hdf5'' est activée. 
 + 
 +''vcpkg_cmake_configure''. ''BUILD_SHARED_LIBS'' est automatiquement transmis. Pour avoir la liste complète des variables automatiquement transmises, voir ''vcpkg\scripts\cmake\vcpkg_configure_cmake.cmake''.
  
 <code cmake> <code cmake>
Ligne 319: Ligne 358:
  
 vcpkg_cmake_configure( vcpkg_cmake_configure(
-    SOURCE_PATH ${SOURCE_PATH}+    SOURCE_PATH ${SOURCE_PATH} OPTIONS ${FEATURE_OPTIONS}
 ) )
 </code> </code>
  
-  * Installer+===Installer===
  
 <code cmake> <code cmake>
 vcpkg_cmake_install() vcpkg_cmake_install()
 +vcpkg_copy_pdbs()
 </code> </code>
  
-  * Patcher+===Patcher===
  
 Il faut ensuite tester l'installation et patcher pour rendre l'installation compatible avec vcpkg. Il faut ensuite tester l'installation et patcher pour rendre l'installation compatible avec vcpkg.
Ligne 350: Ligne 390:
 </code> </code>
  
-  * Subtilités+===Subtilités=== 
 + 
 +  * Accès aux variables d'environnement de Windows
  
 Sous Windows, les variables d'environnement ne sont pas passées à vcpkg et donc pas non plus à CMake. Sous Windows, les variables d'environnement ne sont pas passées à vcpkg et donc pas non plus à CMake.
Ligne 362: Ligne 404:
  
 La modification d'une variable dans ''VCPKG_ENV_PASSTHROUGH'' entrainera la recompilation des paquets. Contrairement à ''VCPKG_ENV_PASSTHROUGH_UNTRACKED''. [[https://learn.microsoft.com/en-us/vcpkg/users/triplets|Triplets reference]] La modification d'une variable dans ''VCPKG_ENV_PASSTHROUGH'' entrainera la recompilation des paquets. Contrairement à ''VCPKG_ENV_PASSTHROUGH_UNTRACKED''. [[https://learn.microsoft.com/en-us/vcpkg/users/triplets|Triplets reference]]
 +
 +  * Connaître l'architecture source / destination
 +
 +L'architecture source (hôte qui compile) : `CMAKE_HOST_<SYSTEM>`.
 +
 +L'architecture de destination (target qui exécutera) : `VCPKG_TARGET_IS_<SYSTEM>`. `WIN32` et `LINUX` sont dépréciés car il y a confusion facile entre l'hôte et la target.
 +
 ====Publication des modifications==== ====Publication des modifications====
  
Ligne 381: Ligne 430:
 git add ports/package/* git add ports/package/*
 git commit -m "[package] new port" git commit -m "[package] new port"
-vcpkg format-manifest ports/package/vcpkg.json +./vcpkg format-manifest ports/package/vcpkg.json 
-./vcpkg.exe x-add-version --overwrite-version package+./vcpkg x-add-version package --overwrite-version
 git add versions git add versions
 git commit -a -m "[package] new port" git commit -a -m "[package] new port"
 git push git push
 +</code>
 +
 +====Dépôt vcpkg local====
 +
 +  * Création d'un dépôt ''git''
 +
 +Plutôt que de devoir cloner tout le dépôt vcpkg de Microsoft, il est possible de faire son propre dépôt (registry) et d'y ajouter les packages. [[https://learn.microsoft.com/en-us/vcpkg/produce/publish-to-a-git-registry|Tutorial: Publish packages to a private vcpkg registry using Git]] {{ :prog:vcpkg:tutorial_publish_packages_to_a_private_vcpkg_registry_using_git_microsoft_learn_3_8_2024_12_59_10_pm_.html |Archive du 10/01/2024 le 08/03/2024}}
 +
 +<code bash>
 +mkdir vcpkg-registry
 +cd vcpkg-registry
 +git init
 +mkdir ports
 +mkdir versions
 +</code>
 +
 +<file javascript versions/baseline.json>
 +{
 +  "default": {}
 +}
 +</file>
 +
 +<code bash>
 +git add versions/baseline.json
 +git commit -m "Initial commit"
 +</code>
 +
 +  * Création d'un dépôt ''filesystem''
 +
 +Voir exemple [[https://github.com/vcpkg/example-filesystem-registry/|example-filesystem-registry]] {{ :prog:vcpkg:example-filesystem-registry-2021-05-06.zip |Archive du 06/05/2021 le 08/03/2024}}
 +
 +Les différentes sont dans les fichiers ''versions/*-/XXXX.json'', à la place des champs ''git-tree'', il faut remplir le champ ''path'' :
 +
 +<file javascript port.json>
 +{
 +  "versions": [
 +    {
 +      "version": "1.0.0",
 +      "path": "$/ports/XXXX/1.0.0"
 +    }
 +  ]
 +}
 +</file>
 +
 +L'arborescence du dossier ''ports'' est donc légèrement différente et il n'y a pas besoin d'appeler ''%%vcpkg x-add-version ...%%''.
 +
 +  * Ajout des paquets au dépôt
 +
 +Ajouter ensuite les paquets selon la méthode du paragraphe précédent.
 +
 +Si le registry n'a pas de binaire ''vcpkg.exe'', il est possible d'utiliser celui du dépôt de Microsoft et de spécifier l'emplacement du dossier du registry :
 +
 +<code bash>
 +../vcpkg-microsoft/vcpkg --x-builtin-ports-root=./ports --x-builtin-registry-versions-dir=./versions x-add-version --all --verbose
 +</code>
 +
 +  * Utilisation de plusieurs dépôts en même temps
 +
 +Il n'est pas possible de spécifier en ligne de commande un registry secondaire sans passer par un fichier ''vcpkg-configuration.json''. Cela n'impose pas la présence d'un fichier ''vcpkg.json'' et il reste donc possible d'utiliser ''vcpkg'' en mode classique ou manifest.
 +
 +Si le fichier ''vcpkg.json'' existe, il faut créer le fichier ''vcpkg-configuration.json'' à côté de ce fichier.
 +
 +Si ''vcpkg.json'' n'existe pas, il faut créer le fichier ''vcpkg-configuration.json'' dans le même dossier que ''VCPKG_ROOT'' (le registry principal).
 +
 +<file javascript vcpkg-configuration.json>
 +{
 +    "$schema": "https://raw.githubusercontent.com/microsoft/vcpkg-tool/main/docs/vcpkg-configuration.schema.json",
 +    "default-registry": {
 +        "kind": "git",
 +        "baseline": "ab887c562326c686478284d9076d722c1ec4b48c",
 +        "reference": "master",
 +        "repository": "https://github.com/microsoft/vcpkg.git"
 +    },
 +    "registries": [
 +        {
 +            "kind": "git",
 +            "baseline": "cb7613262642f41dc3ee3a1ddc11ed82e391c21d",
 +            "reference": "main",
 +            "repository": "https://example.com/vcpkg-registry.git",
 +            "packages": [
 +                "hdf5"
 +            ]
 +        }
 +    ]
 +}
 +</file>
 +
 +Attention, ''baseline'' doit être dans le passé de la branche ''reference'' et non dans son futur via une autre branche.
 +
 +Le dossier temporaire de clone des dépôts git sont dans ''C:\Users\[USER]\AppData\Local\vcpkg\registries''.
 +
 +=====Ajout / modification d'un triplet=====
 +
 +Voir la documentation [[https://learn.microsoft.com/fr-fr/vcpkg/users/triplets|triplet]] de vcpkg.
 +
 +====Variables les plus courantes====
 +
 +===Toutes plateformes===
 +
 +  * ''VCPKG_TARGET_ARCHITECTURE'' : architecture des librairies à générer (''x64'', ...),
 +  * ''VCPKG_LIBRARY_LINKAGE'' : compilation en ''dynamic'' ou ''static'' des librairies générer,
 +  * ''VCPKG_CRT_LINKAGE'' : compilation en ''dynamic'' ou ''static'' avec la librairie standard de Visual Studio. Par expérience, j'ai souvent moins de problème à mettre ''dynamic'' quand configurer un projet avec les binaires de vcpkg.
 +  * ''VCPKG_BUILD_TYPE'' : laisser vide pour compiler en ''Debug'' et ''Release''. Mettre ''release'' (sans la majuscule) pour compiler uniquement en Release. Uniquement ''debug'' n'est pas supporté.
 +  * Flags de compilation : ''VCPKG_CXX_FLAGS'', ''VCPKG_CXX_FLAGS_DEBUG'', ''VCPKG_CXX_FLAGS_RELEASE'', ''VCPKG_C_FLAGS'', ''VCPKG_C_FLAGS_DEBUG'', ''VCPKG_C_FLAGS_RELEASE'', ''VCPKG_LINKER_FLAGS'', ''VCPKG_LINKER_FLAGS_DEBUG'', ''VCPKG_LINKER_FLAGS_RELEASE''.
 +
 +===Windows uniquement===
 +
 +  * ''VCPKG_ENV_PASSTHROUGH'' et ''VCPKG_ENV_PASSTHROUGH_UNTRACKED'' : toutes les variables d'environnement de Windows sont ignorés. Il faut ajouter le nom des variables dans ces variables CMake pour que vcpkg les prennent en compte. Les variables dans ''VCPKG_ENV_PASSTHROUGH'' sont pris en compte dans le calcul du hash pour savoir s'il faut recompiler. Les variables dans ''VCPKG_ENV_PASSTHROUGH_UNTRACKED'' ne sont pas prises en compte (mot de passe par exemple).
 +  * ''VCPKG_PLATFORM_TOOLSET'' : version de Visual Studio à reprendre (''v140'', ''v141'', ''v142'', ''v143'', ''ClangCL''). Equivalent à l'option ''-T'' de CMake.
 +
 +====Personnalisation avancée====
 +
 +Il est possible d'appliquer des options de compilation spécifiques pour certains paquets :
 +
 +<code cmake>
 +set(VCPKG_LIBRARY_LINKAGE static)
 +if(${PORT} MATCHES "qt5-")
 +    set(VCPKG_LIBRARY_LINKAGE dynamic)
 +endif()
 </code> </code>
prog/vcpkg.1709637617.txt.gz · Dernière modification : 2024/03/05 12:20 de root