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:56] – Ajout de "Passer une liste de paramètres qui sera réutilisé comme une liste" 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 242: | 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 266: | 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 324: | 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 332: | 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.1680595010.txt.gz · Dernière modification : 2023/04/04 09:56 de root