217 votes

Comment fonctionne exactement CMake ?

Je ne demande pas ça juste pour moi. J'espère que cette question sera une référence pour les nombreux débutants qui, comme moi, ont trouvé tout à fait perplexe de savoir ce qui se passait exactement dans les coulisses lorsque, pour un si petit groupe de personnes, il n'y a pas d'autre solution. CMakeLists.txt fichier

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

et un si 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 CMakeFiles dossier avec tant de fichiers et de dossiers

CMakeCCompiler.cmake               CMakeOutput.log    Makefile.cmake
cmake.check_cache                  CMakeSystem.cmake  progress.marks
CMakeCXXCompiler.cmake             CMakeTmp           TargetDirectories.txt
CMakeDetermineCompilerABI_C.bin    CompilerIdC        Tutorial.dir
CMakeDetermineCompilerABI_CXX.bin  CompilerIdCXX
CMakeDirectoryInformation.cmake    Makefile2

Ne pas comprendre ce qui se passait dans les coulisses (c'est-à-dire pourquoi tant de fichiers devaient être générés et quel était leur but), a été le plus grand obstacle à l'apprentissage de CMake.

Si quelqu'un le sait, pouvez-vous l'expliquer pour la postérité ? Quel est le but de ces fichiers, et quand je tape cmake . Que configure et génère exactement cmake avant de construire le projet ?

121voto

ComicSansMS Points 12749

Le secret est que vous n'avez pas besoin de comprendre ce que font les fichiers générés.

CMake introduit beaucoup de complexité dans le système de construction, dont la plupart ne sont rentables que si vous l'utilisez pour construire des projets logiciels complexes.

La bonne nouvelle est que CMake fait un bon travail pour garder une grande partie de ce désordre loin de vous : Utilisez constructions hors-source et vous n'avez même pas besoin de regarder les fichiers générés. Si vous ne l'avez pas fait jusqu'à présent (ce qui, je suppose, est le cas, puisque vous avez écrit cmake . ), veuillez les vérifier avant de poursuivre . Mélanger le répertoire de construction et le répertoire source est vraiment pénible avec CMake et n'est pas la façon dont le système est censé être utilisé.

En un mot : Au lieu de

cd <source_dir>
cmake .

toujours utiliser

cd <build_dir_different_from_source_dir>
cmake <source_dir>

J'utilise généralement un sous-dossier vide build dans mon répertoire source comme répertoire de construction.

Pour vous faciliter la tâche, laissez-moi vous donner un aperçu rapide des fichiers pertinents que CMake génère :

  • Fichiers de projet/Makefiles - Ce qui vous intéresse vraiment : Les fichiers nécessaires à la construction de votre projet sous le générateur sélectionné. Il peut s'agir de n'importe quoi, d'un Makefile Unix à une solution Visual Studio.
  • CMakeCache.txt - Il s'agit d'un stockage persistant de chaînes de clés/valeurs qui est utilisé pour mettre en cache les valeurs entre les exécutions. Les valeurs stockées ici peuvent être des chemins vers les dépendances de la bibliothèque ou si un composant optionnel doit être construit du tout. La liste des variables est en grande partie identique à celle que vous voyez lorsque vous exécutez ccmake o cmake-gui . Il peut être utile d'y jeter un coup d'œil de temps en temps, mais je recommanderais d'utiliser les outils susmentionnés pour modifier l'une ou l'autre des valeurs si possible.
  • Fichiers générés - Il peut s'agir de fichiers source générés automatiquement ou de macros d'exportation qui vous aident à réintégrer votre projet construit avec d'autres projets CMake. La plupart de ces éléments ne sont générés que sur demande et n'apparaîtront pas dans un projet simple comme celui de votre question.
  • Tout autre chose est à peu près du bruit pour garder le système de construction heureux. En particulier, je n'ai jamais eu besoin de me préoccuper de ce qui se passe à l'intérieur du fichier CMakeFiles sous-répertoire.

En général, vous ne devriez pas toucher aux fichiers que CMake génère pour vous. Tous les problèmes peuvent être résolus à partir de CMakeLists.txt d'une manière ou d'une autre. Tant que le résultat construit votre projet comme prévu, vous êtes 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.

20voto

Patryk Points 1842

Comme indiqué sur son site web :

Cmake est un système de construction multiplateforme et open-source permettant de gérer le processus de construction de logiciels à l'aide d'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 produit Makefile qui sont utilisés pour construire votre logiciel (principalement sur la plate-forme Linux/Unix).

Cmake permet de fournir des fichiers de construction multiplateforme qui génèrent des fichiers projet/make spécifiques à la plateforme pour une compilation/plateforme particulière.

Par exemple, vous pouvez essayer de compiler votre logiciel sous Windows avec Visual Studio, puis avec une syntaxe correcte dans votre fichier de configuration. CMakeLists.txt vous pouvez lancer

cmake .

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

Si vous souhaitez construire votre logiciel sur une plateforme Linux/Unix, il vous suffit d'aller dans le répertoire des sources où se trouvent vos fichiers de données. CMakeLists.txt et déclencher le même cmake . et il générera tous les fichiers nécessaires pour que vous puissiez construire un logiciel par le biais d'une simple make o make all .

Vous trouverez ici une très bonne présentation des principales fonctionnalités de Cmake. http://www.elpauer.org/stuff/learning_cmake.pdf

EDIT

Si vous souhaitez faire des inclusions de bibliothèque dépendantes de la plate-forme / des définitions de variables, etc., vous pouvez utiliser cette syntaxe dans les éléments suivants CMakeLists.txt fichier

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

Il y a aussi beaucoup de commandes avec lesquelles vous êtes capable d'empêcher la construction d'échouer et en place Cmake vous notifiera que par exemple vous n'avez pas les bibliothèques de boost. filesystem y regex installé 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 va générer les makefiles pour le système/IDE/compilateur approprié.

6voto

Mister Jeps Points 95

La façon exacte dont CMake fonctionne est une question pour les développeurs, donc cette question ne peut pas être répondue ici.

Cependant, nous pouvons donner quelques conseils utiles quant à savoir quand vous devez utiliser CMake et quand vous devez donc vous préoccuper de son fonctionnement. Je ne suis pas non plus un fan des réponses du type "oh ça marche tout simplement" - parce que, surtout dans le domaine des logiciels, RIEN ne "marche tout simplement" et vous devez TOUJOURS entrer dans les détails à un moment donné.

CMake est un outil de niveau industriel. Il automatise plusieurs processus TRÈS complexes et prend en compte de nombreuses variables dont vous n'avez peut-être pas conscience, surtout en tant que développeur relativement nouveau, travaillant probablement avec une connaissance limitée de tous les systèmes d'exploitation et outils de construction que CMake peut gérer. La raison pour laquelle tant de fichiers sont générés et pourquoi les choses semblent si complexes est que tous ces autres systèmes sont complexes et doivent être pris en compte et automatisés. En outre, il y a les questions de "cache" et d'autres fonctionnalités de l'outil qui permettent de gagner du temps. Comprendre tout ce qu'il y a dans CMake signifierait comprendre tout ce qu'il y a dans ces outils de construction et systèmes d'exploitation et toutes les combinaisons possibles de ces variables, ce qui comme vous pouvez l'imaginer est impossible.

Il est important de noter que si vous n'êtes pas en charge de la gestion d'un grand système de construction multiplateforme, et que votre base de code est de quelques KLOC, peut-être jusqu'à 100KLOG, l'utilisation de CMake semble un peu comme l'utilisation d'une machine d'abattage d'arbres de 100 000 dollars pour enlever les mauvaises herbes de votre jardin de fleurs de 2 pieds par 2 pieds. (D'ailleurs, si vous n'avez jamais vu une telle machine, vous devriez en chercher une sur youtube, elles sont étonnantes).

Si votre système de construction est petit et simple, il est probable qu'il soit préférable de simplement écrire vos propres makefiles à la main ou de les script vous-même. Lorsque vos makefiles deviennent lourds ou que vous avez besoin de construire une version de votre système sur une autre plateforme, alors vous pouvez passer à CMake. À ce moment-là, vous aurez beaucoup de problèmes à résoudre et vous pourrez poser des questions plus ciblées à son sujet. En attendant, consultez certains des grands livres qui ont été écrits sur CMake, ou encore mieux, écrivez-en un vous-même ! 8)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X