prog:cmake
Différences
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente | ||
prog:cmake [2023/04/04 09:51] – [Messages d'erreur] : suppression. Tous les messages sont hors sujet root | prog:cmake [2024/08/30 15:13] (Version actuelle) – Ajout des commandes externes aux targets root | ||
---|---|---|---|
Ligne 2: | Ligne 2: | ||
====Compilation==== | ====Compilation==== | ||
+ | |||
+ | Pré-requis sous Linux | ||
+ | |||
+ | '' | ||
+ | |||
+ | Compilation | ||
<code bash> | <code bash> | ||
Ligne 7: | Ligne 13: | ||
cd cmake | cd cmake | ||
cmake -B build | cmake -B build | ||
- | cmake --build build | + | cmake --build build --parallel 16 |
- | cmake --install build | + | sudo cmake --install build |
</ | </ | ||
Ligne 20: | Ligne 26: | ||
<code bash> | <code bash> | ||
+ | # Etape de configuration. | ||
CXXFLAGS=" | CXXFLAGS=" | ||
+ | # Etape de compilation. | ||
cmake --build build/ --target all --parallel --config " | cmake --build build/ --target all --parallel --config " | ||
</ | </ | ||
Ligne 31: | Ligne 39: | ||
En compilant pour '' | En compilant pour '' | ||
- | En utilisant '' | + | En utilisant |
[[https:// | [[https:// | ||
</ | </ | ||
+ | * Effacer le cache et regénérer les CMakeLists.txt | ||
+ | |||
+ | Il faut effacer le fichier '' | ||
* Différences entre les générateurs | * Différences entre les générateurs | ||
- | En fonction des générateurs ('' | + | Certaines |
- | | + | D' |
- | - Release | + | |
- | - RelWithDebInfo, | + | |
- | - MinSizeRel | + | |
- | '' | + | '' |
- | '' | + | '' |
- | + | ||
- | '' | + | |
====Cross compilation pour Android==== | ====Cross compilation pour Android==== | ||
Ligne 65: | Ligne 71: | ||
</ | </ | ||
- | La version de '' | + | La version de '' |
[[https:// | [[https:// | ||
+ | |||
=====CMakeLists.txt===== | =====CMakeLists.txt===== | ||
====Cas courants==== | ====Cas courants==== | ||
+ | |||
+ | Voir une version à jour avec tous les commentaires dans [[https:// | ||
+ | |||
+ | ===add_library=== | ||
+ | |||
+ | * Depuis le code source | ||
+ | |||
+ | <code cmake> | ||
+ | add_library(Librairie sources.cpp sources.hpp CMakeLists.txt) | ||
+ | add_library(NameSpace:: | ||
+ | set(Librairie_SRC ${CMAKE_CURRENT_SOURCE_DIR}/ | ||
+ | ${CMAKE_CURRENT_SOURCE_DIR}/ | ||
+ | set(Librairie_HEADER ${CMAKE_CURRENT_SOURCE_DIR}/ | ||
+ | target_sources( | ||
+ | Librairie | ||
+ | PRIVATE ${Librairie_SRC} | ||
+ | PUBLIC FILE_SET HEADERS BASE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/ | ||
+ | </ | ||
+ | |||
+ | Le fichier '' | ||
+ | |||
+ | <code cmake> | ||
+ | target_link_libraries(Librairie PUBLIC Librairie2) | ||
+ | </ | ||
+ | |||
+ | Ici, '' | ||
+ | |||
+ | '' | ||
+ | |||
+ | '' | ||
+ | |||
+ | '' | ||
+ | |||
+ | * Depuis une librairie dynamique précompilée | ||
+ | |||
+ | <code cmake> | ||
+ | add_library(Librairie SHARED IMPORTED GLOBAL) | ||
+ | set_target_properties( | ||
+ | Librairie | ||
+ | PROPERTIES | ||
+ | IMPORTED_LINK_INTERFACE_LANGUAGES " | ||
+ | IMPORTED_LOCATION_DEBUG librairie-d.dll | ||
+ | IMPORTED_LOCATION_RELEASE librairie.dll | ||
+ | IMPORTED_IMPLIB_DEBUG librairie-d.lib | ||
+ | IMPORTED_IMPLIB_RELEASE librairie.lib | ||
+ | ) | ||
+ | </ | ||
+ | |||
+ | '' | ||
+ | |||
+ | '' | ||
+ | |||
+ | '' | ||
+ | |||
+ | '' | ||
+ | |||
===Librairie header-only=== | ===Librairie header-only=== | ||
- | Follow guide: | + | Suivre les guides |
Exemple sans '' | Exemple sans '' | ||
Ligne 90: | Ligne 153: | ||
===Activation de l' | ===Activation de l' | ||
+ | |||
Le LTCG (Link Time Code Generation) est identique à l' | Le LTCG (Link Time Code Generation) est identique à l' | ||
Ligne 113: | Ligne 177: | ||
}} | }} | ||
- | ===Utiliser clang==== | + | ===Utiliser clang=== |
Ajouter à '' | Ajouter à '' | ||
- | '' | + | <code bash> |
+ | -DCMAKE_C_COMPILER=/ | ||
+ | </ | ||
+ | |||
+ | * '' | ||
+ | |||
+ | Ne pas spécifier '' | ||
+ | |||
+ | Sinon, il est aussi possible de mettre l' | ||
===FetchContent=== | ===FetchContent=== | ||
Ligne 140: | Ligne 212: | ||
* Générer le fichier '' | * Générer le fichier '' | ||
- | ====Cas spécifiques==== | + | ====Interaction avec la ligne de commande==== |
- | ===Exécuter une action qui n'est rattachée à aucun programme/ | + | ===Options=== |
- | Il suffit de passer | + | Les options sont les variables qui peuvent couramment être modifiées |
+ | |||
+ | Les options sont des variables | ||
+ | |||
+ | Deux déclarations équivalentes d'une variable '' | ||
<code cmake> | <code cmake> | ||
- | # On crée une target qui sera ajoutée à la commande make par défaut. | + | option(BUILD_STATIC "Build static libraries" |
- | add_custom_target(clang_fmt ALL) | + | set(BUILD_STATIC OFF CACHE BOOL "Build static libraries" |
- | # On définir une commande à exécuter. | + | |
- | add_custom_command(TARGET clang_fmt COMMAND xxxxxx) | + | |
</ | </ | ||
- | ===Exécuter uniquement le préprocesseur=== | + | Il est possible de modifier une variable '' |
- | Il faut créer | + | <code cmake> |
+ | option(BUILD_STATIC "Build static libraries" | ||
+ | set(BUILD_STATIC OFF CACHE BOOL "Build static libraries" | ||
+ | </ | ||
+ | |||
+ | Enfin la valeur finale d'une variable | ||
<code cmake> | <code cmake> | ||
- | add_library(file_obj OBJECT EXCLUDE_FROM_ALL file.cpp) | + | cmake . -DBUILD_STATIC: |
- | add_custom_target(file ALL COMMAND make file.cpp.i) | + | |
</ | </ | ||
- | [[http://anadoxin.org/blog/generating-preprocessed-sources-in-cmake-projects.html|Generating preprocessed sources in CMake projects]] {{ :prog:cmake:generating_preprocessed_sources_in_cmake_projects_-_antek_s_tech_blog_2020-07-21_18_01_14_.html |Archive du 21/11/2018 le 21/ | + | ===Passer une liste de paramètres qui sera réutilisé comme une liste=== |
+ | |||
+ | Le séparateur est le '';'' | ||
+ | |||
+ | Bash: | ||
+ | |||
+ | <code bash> | ||
+ | cmake ... -DLISTE=" | ||
+ | </code> | ||
+ | |||
+ | CMakeLists.txt, sans les guillemets. | ||
+ | |||
+ | <code cmake> | ||
+ | ${LISTE} | ||
+ | </code> | ||
+ | |||
+ | ====Environnement de compilation et de sortie==== | ||
+ | |||
+ | ===Environnement de sortie=== | ||
+ | |||
+ | <code cmake> | ||
+ | if(WIN32) | ||
+ | set(OS " | ||
+ | elseif(UNIX AND NOT APPLE) | ||
+ | set(OS "Linux/Unix" | ||
+ | elseif(APPLE) | ||
+ | set(OS " | ||
+ | else() | ||
+ | set(OS " | ||
+ | endif() | ||
+ | |||
+ | if(CMAKE_SIZEOF_VOID_P EQUAL 8) | ||
+ | set(ARCHITECTURE "64-bit" | ||
+ | elseif(CMAKE_SIZEOF_VOID_P EQUAL 4) | ||
+ | set(ARCHITECTURE "32-bit" | ||
+ | else() | ||
+ | set(ARCHITECTURE " | ||
+ | endif() | ||
+ | </ | ||
+ | |||
+ | ====Exécution d'une commande==== | ||
+ | |||
+ | ===En passant par une nouvelle target=== | ||
+ | |||
+ | <code cmake> | ||
+ | add_custom_target(clang_fmt ALL COMMAND xxxxxx) | ||
+ | </ | ||
+ | |||
+ | ===Associé une commande à une target existante=== | ||
+ | |||
+ | * En passant par une target intermédiaire | ||
+ | |||
+ | <code cmake> | ||
+ | add_custom_target(clang_fmt_dep COMMAND ...) | ||
+ | |||
+ | add_dependencies(clang_fmt clang_fmt_dep) | ||
+ | </ | ||
+ | |||
+ | * Sans passer par une target intermédiaire | ||
+ | |||
+ | <code cmake> | ||
+ | add_custom_command(TARGET clang_fmt PRE_BUILD COMMAND ...) | ||
+ | </ | ||
+ | |||
+ | * En passant par un fichier qui sera généré | ||
+ | |||
+ | <code cmake> | ||
+ | add_custom_command(OUTPUT file COMMAND ...) | ||
+ | |||
+ | add_dependencies(clang_fmt file) | ||
+ | </ | ||
+ | |||
+ | ===Spécificité au générateur Visual Studio=== | ||
+ | |||
+ | Normalement, | ||
+ | |||
+ | Mais Visual Studio va également analyser la sortie standard. Si le contenu de la sortie standard est faussement considéré comme une erreur, il faut rediriger la sortie standard vers NUL. | ||
+ | |||
+ | <code cmake> | ||
+ | if(CMAKE_GENERATOR MATCHES " | ||
+ | set(IGNORE_ERROR_IN_LOG ">" | ||
+ | else() | ||
+ | set(IGNORE_ERROR_IN_LOG "" | ||
+ | endif() | ||
+ | |||
+ | add_custom_target(targ COMMAND ... ${IGNORE_ERROR_IN_LOG}) | ||
+ | ) | ||
+ | </ | ||
+ | |||
+ | Ce problème peut se produire en lançant la commande `python | ||
+ | |||
+ | < | ||
+ | " | ||
+ | (CustomBuild target) -> | ||
+ | CUSTOMBUILD : error : pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts. [...\target.vcxproj] | ||
+ | C:\Program Files\Microsoft Visual Studio\2022\Community\MSBuild\Microsoft\VC\v170\Microsoft.CppCommon.targets(254, | ||
+ | |||
+ | 15 Warning(s) | ||
+ | 2 Error(s) | ||
+ | </code> | ||
===Dépendances dans un sous-dossier=== | ===Dépendances dans un sous-dossier=== | ||
Ligne 187: | Ligne 364: | ||
[[https:// | [[https:// | ||
+ | |||
+ | ====Rustines à appliquer systématiquement==== | ||
+ | |||
+ | * '' | ||
+ | |||
+ | Il faut forcer la configuration si le fichier a été supprimé depuis la configuration initiale de CMake. | ||
+ | |||
+ | <code cmake> | ||
+ | configure_file(version.h.in version.h) | ||
+ | # Need to regenerate version.h if you remove it. | ||
+ | # https:// | ||
+ | set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS | ||
+ | " | ||
+ | </ | ||
====Déprécié==== | ====Déprécié==== | ||
Ligne 204: | Ligne 395: | ||
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/ | DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/ | ||
</ | </ | ||
+ | |||
+ | ====Divers==== | ||
+ | |||
+ | ===Exécuter uniquement le préprocesseur=== | ||
+ | |||
+ | Il faut créer une target compilable en l' | ||
+ | |||
+ | <code cmake> | ||
+ | add_library(file_obj OBJECT EXCLUDE_FROM_ALL file.cpp) | ||
+ | add_custom_target(file ALL COMMAND make file.cpp.i) | ||
+ | </ | ||
+ | |||
+ | [[http:// | ||
+ | |||
====Tests==== | ====Tests==== | ||
Ligne 224: | Ligne 429: | ||
... | ... | ||
endif(BUILD_TESTING) | endif(BUILD_TESTING) | ||
+ | </ | ||
+ | |||
+ | ===Fichiers chargés par les tests=== | ||
+ | |||
+ | La compilation sous Windows supporte simultanément plusieurs build (Debug, Release, ...). Donc, le dossier où se trouve les tests et le dossier de travail (working directory) n'est pas le même. L'un est (par exemple) '' | ||
+ | |||
+ | Donc (à faire en connaissance de cause) pour copier un fichier du dossier source vers : | ||
+ | |||
+ | * le dossier de travail | ||
+ | |||
+ | <code cmake> | ||
+ | add_custom_command( | ||
+ | TARGET test | ||
+ | POST_BUILD | ||
+ | COMMAND | ||
+ | ${CMAKE_COMMAND} -E copy_if_different | ||
+ | " | ||
+ | " | ||
+ | </ | ||
+ | |||
+ | * le dossier de l' | ||
+ | |||
+ | <code cmake> | ||
+ | add_custom_command( | ||
+ | TARGET test | ||
+ | POST_BUILD | ||
+ | COMMAND | ||
+ | ${CMAKE_COMMAND} -E copy_if_different " | ||
+ | $< | ||
</ | </ | ||
Ligne 248: | Ligne 482: | ||
endif() | endif() | ||
endforeach() | endforeach() | ||
+ | </ | ||
+ | |||
+ | Dans le cas de Qt, il va manquer tout l' | ||
+ | |||
+ | Solution Qt 1: copier les dlls comme précédemment et définir une variable d' | ||
+ | |||
+ | Solution Qt 2: ajouter tout l' | ||
+ | |||
+ | <code cmake> | ||
+ | add_custom_command( | ||
+ | TARGET target | ||
+ | POST_BUILD | ||
+ | COMMAND | ||
+ | ${CMAKE_COMMAND} -E env VCINSTALLDIR=${CMAKE_GENERATOR_INSTANCE}/ | ||
+ | ${WINDEPLOYQT_EXECUTABLE} --qmldir ${CMAKE_CURRENT_SOURCE_DIR} --pdb | ||
+ | " | ||
</ | </ | ||
Ligne 306: | Ligne 556: | ||
[[https:// | [[https:// | ||
- | * Afficher toutes les étapes, | + | * Afficher toutes les étapes, |
Ajouter l' | Ajouter l' | ||
+ | |||
+ | * Afficher le temps d' | ||
+ | |||
+ | Ajouter les options '' | ||
+ | |||
+ | {{: | ||
* Activer l' | * Activer l' | ||
Ligne 314: | Ligne 570: | ||
Ajouter dans le '' | Ajouter dans le '' | ||
+ | * Afficher le temps pour chaque compilation pour chaque objet | ||
+ | <code cmake> | ||
+ | set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE " | ||
+ | set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK " | ||
+ | </ | ||
+ | |||
+ | Ne fonctionne que pour les Makefile et Ninja. Pas avec Visual Studio. | ||
+ | |||
+ | Inconvénient : il faut tout compiler sans l' | ||
+ | |||
+ | ====Ninja==== | ||
+ | |||
+ | * Limiter le nombre de lieur en parallèle | ||
+ | |||
+ | Il est possible de limiter le nombre de link en parallèle. Le lieur est consommateur en ressource. Il peut être nécessaire de limiter leur nombre à une valeur plus basse que le nombre de compilateur. | ||
+ | |||
+ | <code cmake> | ||
+ | set(CMAKE_JOB_POOLS " | ||
+ | set(CMAKE_JOB_POOL_LINK link) | ||
+ | </ |
prog/cmake.1680594709.txt.gz · Dernière modification : 2023/04/04 09:51 de root