Cet article s'appuie sur un extrait du chapitre 1 - Structure et configuration d'un projet C++/Qt 6 avec CMake du livre Qt 6 en pratique écrit par Mériadeg Perrinel.

Avec Qt6, The Qt Group a pris une décision stratégique majeure en adoptant CMake comme système de construction principal, abandonnant progressivement qmake qui était utilisé depuis Qt3. Cette transition marque un tournant important dans l'écosystème Qt et reflète l'évolution des pratiques de développement modernes.

Les avantages de CMake sont nombreux : support natif de multiples compilateurs (GCC, Clang, MSVC), génération automatique pour différents systèmes de construction (Make, Ninja, Visual Studio, Xcode), gestion avancée des dépendances et une syntaxe moderne qui facilite la maintenance des projets complexes. Les IDE comme Qt Creator ou Visual Studio sont capables d'ouvrir et de piloter des projets CMake assez facilement. CMake est stable et évolue régulièrement, ce qui en fait un outil fiable pour se lancer dans la création d'un projet.

CMake & Qt 6De nombreux projets tiers étant déjà configurés avec CMake, l'intégration de Qt dans des écosystèmes de développement existants s'en voit ainsi grandement simplifiée.

L'intégration de CMake s'est accompagnée de la création de nouvelles macros spécifiquement fournies par Qt pour faciliter l'adoption de CMake par les développeurs Qt. Ces macros encapsulent des tâches courantes et automatisent des processus complexes comme la génération de code à partir des fichiers .ui, le traitement du Meta-Object System (MOC) ou encore la gestion des ressources Qt.

Ces outils permettent aux développeurs de bénéficier de la puissance de CMake tout en conservant la simplicité d'utilisation qui caractérise l'écosystème Qt. Aussi, l'une des premières étapes de migration d'un projet legacy vers Qt 6 consiste-t-elle à revoir les CMakeLists pour prendre en compte ces nouvelles macros.

Citons par exemple les deux macros de base qt_add_executable et qt_add_library qui surchargent à la sauce Qt les macros classiques add_executable et add_library. Toutefois la macro la plus importante est sans conteste qt_add_qml_module qui apporte une valeur ajoutée incroyable au projet au travers de l'ajout d'un module QML :

qt_add_qml_module(TARGET URI uri VERSION version …)

Cette fonction, à la différence des autres, n'est pas fournie par le module Qt Core mais par le module Qt Quick. En effet, elle permet de définir un module QML que l'on associe éventuellement à une autre TARGET que l'on appelle BACKEND TARGET. Le paramètre VERSION permet sans surprise d'indiquer la version du module et le paramètre URI permet de préfixer l'emplacement des fichiers QML associés au module. Ce paramètre est nécessaire pour la configuration du projet mais prend son intérêt quand on définit plusieurs modules QML car cela permet de bien les séparer. Cette fonction possède également de nombreux paramètres optionnels. L'un d'entre eux, QML_FILES est celui qui permet d'ajouter des fichiers QML au module. Ces fichiers sont compilés et embarqués dans le binaire associé à la TARGET. Les fichiers QML listés par la macro sont alors soumis au linter QML, ce qui a pour effet de vérifier la validité syntaxique des fichiers QML automatiquement lors de la compilation de la TARGET.