Tutoriel CMake

CMake est un outil de construction de projet, comparable à make et Makefile présentés en cours. Il est plus moderne et de plus haut niveau : un en sens on pourrait dire que c'est un outil pour générer des Makefile. En ce sens, CMake part de plus loin et nécessite une étape supplémentaire avant la compilation : celle de générer le matériel qui permettra de lancer la compilation (comme par exemple générer un Makefile). Il utilise pour cela un fichier CMakeLists.txt.

Détaillons tout ça en repartant de l'exercice 2 de la série 1 (compilation de deux versions du calcul de la factorielle).

À noter que CMake est un outil puissant (donc complexe) dont nous n'apprendrons ici qu'à utiliser que les bases les plus fondamentales. Pour pousser l'apprentissage plus loin, vous pouvez consulter la documentation officielle.

Un nouveau projet de plusieurs fichiers

Le point de départ est d'avoir un répertoire associé à votre « projet ». Par « projet » on entend l'ensemble des fichiers allant ensemble pour faire un exécutable.

Commencez donc par créer un nouveau répertoire, p.ex. fact_cmake et copiez y les fichiers nécessaires :

mkdir fact_cmake
cp factmain.cc factorielleRecursive.cc factorielleIterative.cc demander_nombre.cc demander_nombre.h factorielle.h fact_cmake

Ouvrez ensuite ces fichiers (ceux du nouveau « projet », pas les anciens utilisés pour make) dans Geany ou dans QtCreator. Si vous utilisez ce dernier, ouvrez les fichiers sans les intégrer à un projet en faisant simplement:

Open File or Project

puis ouvrez directement le fichier concerné (donc sans passer par la création d'un projet). Faites alors abstraction du message indiquant que ces fichiers ne sont intégrés à aucun projet. Nous y remédierons un peu plus tard.

Pour pouvoir utiliser CMake pour compiler votre nouveau «projet», il faut créer un fichier CMakeLists.txt à la racine du répertoire de votre projet. Créez donc un tel fichier CMakeLists.txt, vide pour le moment (par exemple à à l'aide de l'éditeur Geany ou dans QtCreator en utilisant New File or Project > General > Empty file).
Il est impératif que ce fichier soit ainsi nommé.

Ajoutez ensuite dans ce fichier les lignes suivantes:

cmake_minimum_required(VERSION 3.5)
project(TEST_COMPILATION_SEPAREE)
  
set(CMAKE_CXX_STANDARD 11) # ou 17, 20 ou 23

# set(CMAKE_BUILD_TYPE Debug)

set(CMAKE_CXX_FLAGS "-Wall")

include_directories(${PROJECT_SOURCE_DIR})

file(GLOB PROJECT_SHARED_SOURCES
     "${PROJECT_SOURCE_DIR}/demander_nombre.cc"
     "${PROJECT_SOURCE_DIR}/demander_nombre.h"
     "${PROJECT_SOURCE_DIR}/factorielle.h"
)

add_executable (factorielleRecursive ${PROJECT_SOURCE_DIR}/factmain.cc
 ${PROJECT_SOURCE_DIR}/factorielleRecursive.cc
 ${PROJECT_SHARED_SOURCES}
)
add_executable (factorielleIterative ${PROJECT_SOURCE_DIR}/factmain.cc
 ${PROJECT_SOURCE_DIR}/factorielleIterative.cc
 ${PROJECT_SHARED_SOURCES}
)

Quelques explications:

Voilà, nous sommes maintenant prêts à lancer notre compilation/édition de lien au moyen de CMake !

Construction des cibles à la main

Comme pour make, il n'est pas nécessaire d'utiliser un EDI comme Qt Creator pour lancer la compilation et l'exécution des cibles au moyen de CMake. On peut très bien le faire « à la main » (si vous utilisez Qt Creator, voir la section suivante). Tapez simplement (dans le terminal, mis dans le bon répertoire:

      cmake .
   

Note: le . (point) de la commande ci-dessus désigne un répertoire : le répertoire courant; mais on peut, bien sûr, mettre un autre nom de répertoire si le fichier CMakeLists.txt est ailleurs : c'est le nom du répertoire où ce trouve ce fichier qu'il faut donner à cmake

Voyez que cmake a en effet construit un Makefile (que vous pouvez aller voir, juste pour voir la différence entre les bases minimales vues en cours et ce qu'un vrai Makefile de pro contient !)

Vous pouvez ensuite, à votre guise, lancer l'une ou l'autre ou les deux des cibles exécutables:

    make factorielleRecursive
ou
    make factorielleIterative
ou simplement
    make

qui fait les deux (bien sûr si une des deux cibles a déjà été faite et est à jour, cela ne va pas la refaire).

Note: À noter que la commande make n'existe pas telle quelle dans l'installation MinGW sous Windows. Dans cet environnement, la commande s'appelle en effet mingw32-make.
Si vous compilez « à la main » depuis un terminal Windows, il faut donc taper mingw32-make au lieu de taper make.
Une autre solution, plus simple mais plus intrusive (= à refaire si vous mettez à jour ou réinstallez le compilateur) est de changer le nom de cet exécutable mingw32-make simplement en make. Pour cela, allez dans C:\MinGW\bin et là-bas renommez le fichier mingw32-make.exe simplement make..exe

Construction des cibles dans QtCreator

Si vous utilisez Qt Creator, vous pouvez maintenant créer un projet QtCreator de façon analogue à ce qui est décrit ici. Vous verrez que la commande de «build» (petit marteau) permet de créer les deux cibles, que vous pouvez tour à tour choisir pour les exécuter.

Pour conclure cette introduction

Cmake permet de faire bien d'avantage que ce qui est décrit ici. Comme indiqué en introduction, vous pouvez investiguer la documentation officielle pour pousser vos compétences sur cet outil plus loin si vous le souhaitez (et en avez le temps !!).


Dernière mise à jour le 28 février 2023
Last modified: Tue Feb 28, 2023