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/21 14:15] – Ajout de "Fichiers chargés par les tests" root | prog:cmake [2024/12/12 11:33] (Version actuelle) – [Compilation] : ajout des options de compilation root | ||
---|---|---|---|
Ligne 2: | Ligne 2: | ||
====Compilation==== | ====Compilation==== | ||
+ | |||
+ | Pré-requis sous Linux | ||
+ | |||
+ | '' | ||
+ | |||
+ | Compilation | ||
<code bash> | <code bash> | ||
git clone https:// | git clone https:// | ||
cd cmake | cd cmake | ||
- | cmake -B build | + | cmake -B build -DCMAKE_USE_OPENSSL: |
- | 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 | ||
- | * Différences entre les générateurs | + | Il faut effacer le fichier '' |
- | En fonction des générateurs | + | * Différences entre les générateurs |
- | - Debug | + | Certaines générateurs ('' |
- | - Release | + | |
- | - RelWithDebInfo, | + | |
- | - MinSizeRel | + | |
- | '' | + | D'autres générateurs ('' |
- | '' | + | '' |
- | '' | + | '' |
====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 117: | Ligne 181: | ||
Ajouter à '' | Ajouter à '' | ||
- | '' | + | <code bash> |
+ | -DCMAKE_C_COMPILER=/ | ||
+ | </ | ||
+ | |||
+ | * '' | ||
+ | |||
+ | Ne pas spécifier '' | ||
+ | |||
+ | Sinon, il est aussi possible de mettre l' | ||
===FetchContent=== | ===FetchContent=== | ||
Ligne 142: | Ligne 214: | ||
====Interaction avec la ligne de commande==== | ====Interaction avec la ligne de commande==== | ||
- | * Passer une liste de paramètres qui sera réutilisé comme une liste. | + | ===Options=== |
+ | |||
+ | Les options sont les variables qui peuvent couramment être modifiées par l' | ||
+ | |||
+ | Les options sont des variables '' | ||
+ | |||
+ | Deux déclarations équivalentes d'une variable '' | ||
+ | |||
+ | <code cmake> | ||
+ | option(BUILD_STATIC "Build static libraries" | ||
+ | set(BUILD_STATIC OFF CACHE BOOL "Build static libraries" | ||
+ | </ | ||
+ | |||
+ | Il est possible de modifier une variable '' | ||
+ | |||
+ | <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> | ||
+ | cmake . -DBUILD_STATIC: | ||
+ | </ | ||
+ | |||
+ | ===Passer une liste de paramètres qui sera réutilisé comme une liste=== | ||
Le séparateur est le '';'' | Le séparateur est le '';'' | ||
Ligne 158: | Ligne 256: | ||
</ | </ | ||
- | ====Cas spécifiques==== | + | ====Environnement de compilation et de sortie==== |
- | ===Exécuter une action qui n'est rattachée à aucun programme/ | + | ===Environnement de sortie=== |
- | Il suffit de passer | + | <code cmake> |
+ | if(WIN32) | ||
+ | set(OS " | ||
+ | elseif(UNIX AND NOT APPLE) | ||
+ | set(OS " | ||
+ | elseif(APPLE) | ||
+ | set(OS " | ||
+ | else() | ||
+ | set(OS " | ||
+ | endif() | ||
+ | |||
+ | if(CMAKE_SIZEOF_VOID_P EQUAL 8) | ||
+ | set(ARCHITECTURE " | ||
+ | elseif(CMAKE_SIZEOF_VOID_P EQUAL 4) | ||
+ | set(ARCHITECTURE " | ||
+ | else() | ||
+ | set(ARCHITECTURE " | ||
+ | endif() | ||
+ | </ | ||
+ | |||
+ | ====Exécution d'une commande==== | ||
+ | |||
+ | ===En passant | ||
<code cmake> | <code cmake> | ||
- | # On crée une target qui sera ajoutée à la commande make par défaut. | + | add_custom_target(clang_fmt ALL COMMAND xxxxxx) |
- | add_custom_target(clang_fmt ALL) | + | |
- | # On définir une commande à exécuter. | + | |
- | add_custom_command(TARGET clang_fmt | + | |
</ | </ | ||
- | ===Exécuter uniquement le préprocesseur=== | + | ===Associé une commande à une target existante=== |
- | Il faut créer | + | * En passant par une target intermédiaire |
<code cmake> | <code cmake> | ||
- | add_library(file_obj OBJECT EXCLUDE_FROM_ALL file.cpp) | + | add_custom_target(clang_fmt_dep |
- | add_custom_target(file ALL COMMAND | + | |
+ | add_dependencies(clang_fmt clang_fmt_dep) | ||
</ | </ | ||
- | [[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/ | + | * Sans passer par une target intermédiaire |
+ | |||
+ | <code cmake> | ||
+ | add_custom_command(TARGET clang_fmt PRE_BUILD COMMAND ...) | ||
+ | </code> | ||
+ | |||
+ | * En passant par un fichier qui sera généré | ||
+ | |||
+ | <code cmake> | ||
+ | add_custom_command(OUTPUT file COMMAND ...) | ||
+ | |||
+ | add_dependencies(clang_fmt file) | ||
+ | </code> | ||
+ | |||
+ | ===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}) | ||
+ | ) | ||
+ | </code> | ||
+ | |||
+ | 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 205: | 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 222: | 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 295: | 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 353: | 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 361: | 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.1682079354.txt.gz · Dernière modification : 2023/04/21 14:15 de root