Comment fonctionne exactement CMake?

Je ne le demande pas seulement pour moi. J’espère que cette question sera une référence pour les nombreux débutants qui, comme moi, ont trouvé cela complètement perplexe quant à ce qui se passait exactement dans les coulisses d’un si petit fichier CMakeLists.txt .

 cmake_minimum_required (VERSION 2.6) project(Tutorial) add_executable(Tutorial tutorial.cpp) 

et un petit tutorial.cpp

 int main() { return 0; } 

il y a tellement de fichiers générés

 CMakeCache.txt cmake_install.cmake Makefile CMakeLists.txt tutorial.cpp 

et un dossier CMakeFiles avec autant de fichiers et de dossiers

 CMakeCComstackr.cmake CMakeOutput.log Makefile.cmake cmake.check_cache CMakeSystem.cmake progress.marks CMakeCXXComstackr.cmake CMakeTmp TargetDirectories.txt CMakeDetermineComstackrABI_C.bin ComstackrIdC Tutorial.dir CMakeDetermineComstackrABI_CXX.bin ComstackrIdCXX CMakeDirectoryInformation.cmake Makefile2 

Ne pas comprendre ce qui se passait en coulisse (c.-à-d. Pourquoi des fichiers devaient être générés et quel était leur but) était le principal obstacle à l’apprentissage de CMake.

Si quelqu’un le sait, pourriez-vous, s’il vous plait, l’expliquer pour la postérité? Quel est le but de ces fichiers, et quand je tape cmake . , qu’est-ce que la configuration et la génération de cmake avant de construire le projet?

Le secret est que vous n’avez pas à comprendre ce que font les fichiers générés.

CMake introduit une grande complexité dans le système de construction, dont la plupart ne rapportent que si vous l’utilisez pour créer des projets logiciels complexes.

Les bonnes nouvelles sont que CMake fait un bon travail pour garder beaucoup de ce désordre loin de vous: Utilisez des versions hors source et vous n’avez même pas à regarder les fichiers générés. Si vous ne l’avez pas fait jusqu’ici (ce qui est probablement le cas, puisque vous avez écrit cmake . ), Veuillez les vérifier avant de continuer . Mélanger le répertoire de construction et le répertoire source est vraiment pénible avec CMake et ce n’est pas la manière dont le système est censé être utilisé.

En un mot: au lieu de

 cd  cmake . 

toujours utiliser

 cd  cmake  

au lieu. J’utilise généralement un sous-dossier vide dans mon répertoire source en tant que répertoire de construction.

Pour soulager votre douleur, permettez-moi de donner un bref aperçu des fichiers pertinents générés par CMake:

  • Fichiers de projet / Makefiles – Ce qui vous intéresse réellement: Les fichiers nécessaires à la construction de votre projet sous le générateur sélectionné. Cela peut être quelque chose d’un Makefile Unix à une solution Visual Studio.
  • CMakeCache.txt – Il s’agit d’un stockage de chaîne de clé / valeur persistante utilisé pour mettre en cache la valeur entre les exécutions. Les valeurs stockées ici peuvent être des chemins vers des dépendances de bibliothèque ou un composant optionnel doit être créé. La liste des variables est identique à celle que vous voyez lors de l’exécution de ccmake ou de cmake-gui . Cela peut être utile à regarder de temps en temps, mais je vous recommande d’utiliser les outils susmentionnés pour modifier les valeurs si possible.
  • Fichiers générés – Cela peut être n’importe quoi, des fichiers sources générés automatiquement aux exportations de macros qui vous aident à réintégrer votre projet intégré avec d’autres projets CMake. La plupart d’entre elles ne sont générées qu’à la demande et n’apparaîtront pas dans un projet simple tel que celui de votre question.
  • Tout le rest est assez bruyant pour garder le système de construction heureux. En particulier, je n’ai jamais eu à me soucier de tout ce qui se passe dans le sous-répertoire CMakeFiles .

En général, vous ne devriez pas jouer avec les fichiers générés par CMake pour vous. Tous les problèmes peuvent être résolus dans CMakeLists.txt d’une manière ou d’une autre. Tant que le résultat construit votre projet comme prévu, vous allez probablement bien. Ne vous inquiétez pas trop des détails sanglants – car c’est ce que CMake essayait de vous épargner en premier lieu.

Comme indiqué sur son site internet:

Cmake est un système de génération multi-plateforme et open-source pour gérer le processus de génération de logiciels en utilisant une méthode indépendante du compilateur

Dans la plupart des cas, il est utilisé pour générer des fichiers de projet / make – dans votre exemple, il a créé Makefile qui est utilisé pour construire votre logiciel (principalement sous Linux / Unix).

Cmake permet de fournir des fichiers de construction multi-plateformes qui généreraient des fichiers de projet / make spécifiques à la plateforme pour un compilateur / une plate-forme spécifique.

Par exemple, vous pouvez essayer de comstackr votre logiciel sous Windows avec Visual Studio, puis avec la syntaxe appropriée dans votre fichier CMakeLists.txt , vous pouvez lancer

 cmake . 

dans le répertoire de votre projet sur la plate-forme Windows et Cmake générera tous les fichiers de projet / solution nécessaires ( .sln etc.).

Si vous souhaitez créer votre logiciel sur une plate-forme Linux / Unix, il vous suffit d’accéder au répertoire source où se trouve votre fichier CMakeLists.txt et de déclencher le même cmake . et il générera tous les fichiers nécessaires à la création de logiciels via sipmle make ou make all .

Ici, vous avez une très bonne présentation sur les fonctionnalités clés de Cmake http://www.elpauer.org/stuff/learning_cmake.pdf

MODIFIER

Si vous souhaitez que la bibliothèque dépend de la plate-forme inclue des définitions / variables, vous pouvez utiliser cette syntaxe dans le fichier CMakeLists.txt

 IF(WIN32) ...do something... ELSE(WIN32) ...do something else... ENDIF(WIN32) 

Il y a aussi beaucoup de commandes avec lesquelles vous pouvez empêcher la construction d’échouer et Cmake vous informera que par exemple vous n’avez pas installé les bibliothèques de filesystem et le regex sur votre système. Pour ce faire, vous pouvez utiliser la syntaxe suivante:

 find_package(Boost 1.45.0 COMPONENTS filesystem regex) 

Après avoir vérifié qu’il générera les fichiers Make pour le système / IDE / compilateur approprié.