Cmake
Pour produire une suite logiciele en langage C ou C++ qui suppose la compilation de nombreux fichiers sources, la liaison de librairies tierces statiques ou dynamiques, la production d’un ou plusieurs exécutable, librairies statiques ou partagées, selon la suite de compilation qu’on utilise le format qui décrit la génération de la solution diffère : Un simple makefile si on utilise un compilateur Open source tel que GCC ou clang. Les plus pressés pourront utiliser Ninja.
Si on utilise le compilateur de MSVC de Microsoft, dans ce cas on aura besoin d’un fichier .sln ou bien d’un Nmakefile.
Si on compile sous MacOS, dans ce cas on utilisera XCode et le compilateur AppleClang. Le fichier qui décrit la solution sera dans le format .xcodeproj.
Si on veut compiler notre solution avec ces trois compilateurs pour Windows, Linux et Mac on devrit en théorie maintenir un fichier .sln, un Makefile et un .xcodeproj. Sachant que le format .sln évolue à chaque nouvelle version de Visual Studio, et de même pour le format de Xcode. De même il existe de nombreux dialectes de Makefiles et un makefile en soi est constitué de commandes shell et d’appels à des programmes et utilitaires qui peuvent varier selon le système d’exploitation, la distribution Linux, le compilateur utilisé, la version du compilateur, et ainsi de suite.
Cmake est capable de générer pour nous des makefiles, des projets Visual Studio ou Xcode à la demande, à partir d’un fichier CmakeLists.txt
D’autre solutions similaires ayant la même utilité que cmake existent : autotools, meson, MSBuild, scons, bazel, xmake…
Cmake s’est toutefois imposé comme standart de-facto aujourd’hui.
Les dásavantages de Cmake est qu’il ne donne pas autant de contrôle qu’une solution .sln ou makefile natif. Il est surement recommandé d’être familier avec ces derniers et d’être capable de comprendre les fichiers généres par Cmake.
Procédure
On utilise généralement cmake en ligne de commande, après l’avoir installé, on devrait pouvoir tapper cmake dans un terminal et avoir une message expliquant les options acceptées par la commande.
On commence par creer un dossier où l’on veut construire le projet, il peut être un sous dossier du projet ou être complètement séparé de celui-ci.
cd <le chemin du dossier où se trouve votre CMakeLists.txt>
mkdir _build
pushd _build
cmake ..
Un message d’erreur dit CMake Error: The source directory "/<chemin vers votre projet>" does not appear to contain CMakeLists.txt.
Types de build
Par defaut Cmake proposer 5 types de préréglages pour générer une solution :
Debug
ajoute l’option-g
au compilateur, ce qui permet de l’ouvrir avecgdb
et de l’exécuter pas à pas.Release
ajoute l’option-O3 -DNDEBUG
qui génère du code très optimisé pour la vitesse, avec du code réagencé et des variables et fonctions élidées. Lesassert
sont désactivés.MinSizeRel
ajoute l’option-Os -DNDEBUG
optimise le programme en mode “small” ce qui génère un résultat de petite taille, aux dépens d’optimisations de vitesse. Lesassert
sont désactivés.RelWithDebInfo
ajoute l’option-O2 -g -DNDEBUG
qui produit du code optimisé mais également le débogage pas à pas, il est possible que certaines instructions et variables soient supprimées. Cela rend également le code assembleur plus facile à lire avec les noms de symboles originaux.
Affichage verbeux
Cmake cache par défaut les commandes invoquées par le compilateur et le linker, ce qui peut rendre le debogage difficile.
Pour les afficher, il faut modifier la propriété
CMAKE_VERBOSE_MAKEFILE
dans le fichier CMakeCache.txt
à TRUE
.
Alternativement en ligne de commande
cmake -DCMAKE_VERBOSE_MAKEFILE:BOOL=ON ..
depuis le dossier
de build.
A noter que contrairement à ce que son nom implique la verbosité augmente egalement pour les projets Visual Studio de type .sln.
Ressources
Une bonne explication sur la difference entre PUBLIC, PRIVATE et INTERFACE https://www.youtube.com/watch?v=8l53O3FaJdM 🌍⤴