Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente |
prog:vcpkg [2024/03/08 13:06] – Ajout de "Dépôt vcpkg local" root | prog:vcpkg [2024/08/28 14:09] (Version actuelle) – [Récupérer le code source] : fix typo root |
---|
* ''%%--x-install-root=%%'' pour l'emplacement du dossier d'installation. | * ''%%--x-install-root=%%'' pour l'emplacement du dossier d'installation. |
| |
Il y a d'autres options pour des dossiers spécifiques mais ils ont moins nécessaires (''%%--x-asset-sources=%%'', ''%%--x-buildtrees-root=%%'', ''%%--downloads-root=%%'', ''%%--x-packages-root=%%''). | 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==== |
| |
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> |
| |
====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> |
</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> |
</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. |
</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. |
| |
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==== |
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" |
====Dépôt vcpkg local==== | ====Dépôt vcpkg local==== |
| |
* Création du dépôt | * 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}} | 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}} |
git commit -m "Initial commit" | git commit -m "Initial commit" |
</code> | </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 | * Ajout des paquets au dépôt |
Ajouter ensuite les paquets selon la méthode du paragraphe précédent. | 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'utilise celui du dépôt de Microsoft et de spécifier l'emplacement du dossier du registry : | 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> | <code bash> |
* Utilisation de plusieurs dépôts en même temps | * Utilisation de plusieurs dépôts en même temps |
| |
Il faut créer le fichier ''vcpkg-configuration.json'' à côté du fichier ''vcpkg.json''. | 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> | <file javascript vcpkg-configuration.json> |
| |
Le dossier temporaire de clone des dépôts git sont dans ''C:\Users\[USER]\AppData\Local\vcpkg\registries''. | 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> |