IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Vous êtes nouveau sur Developpez.com ? Créez votre compte ou connectez-vous afin de pouvoir participer !

Vous devez avoir un compte Developpez.com et être connecté pour pouvoir participer aux discussions.

Vous n'avez pas encore de compte Developpez.com ? Créez-en un en quelques instants, c'est entièrement gratuit !

Si vous disposez déjà d'un compte et qu'il est bien activé, connectez-vous à l'aide du formulaire ci-dessous.

Identifiez-vous
Identifiant
Mot de passe
Mot de passe oublié ?
Créer un compte

L'inscription est gratuite et ne vous prendra que quelques instants !

Je m'inscris !

CMake rattrape qmake en temps de compilation
Grâce à l'implémentation des en-têtes précompilés et des unités de compilation uniques

Le , par dourouc05

119PARTAGES

7  0 
Qt 6 n’utilisera plus qmake pour gérer la compilation, c’est sûr. Le remplaçant actuellement prévu est CMake, mais il accuse un certain retard en termes de performance : le temps de compilation d’un projet explose en passant de qmake à CMake, dans certains cas. C’est pour cela que les développeurs de Qt apportent des contributions à CMake pour améliorer ces défauts — relativement mineurs, au vu de l’écosystème qui s’est construit autour de CMake.

qmake peut utiliser les en-têtes précompilés, mais CMake ne le peut pas, du moins de manière native (il existe des dizaines de modules d’extension pour les activer, cependant). Un prototype d’inclusion existe depuis deux ans, mais n’a pas été fusionné avec CMake. Les développeurs de Qt ont continué le développement : le code initial ne fonctionnait qu’avec Visual Studio et Xcode, la nouvelle version peut aussi être utilisée avec Ninja et des Makefile. Deux styles de génération de fichiers d’en-têtes précompilés sont disponibles : à la Visual C++, avec un pch.h et un pch.c qui, une fois compilés, donnent un pch.pch et un pch.obj (qui doit être utilisé pendant l’édition des liens) ; à la GCC, avec un pch.h et un pch.c qui, une fois compilés, donnent uniquement un pch.gch (sans changement à l’étape d’éditions des liens). Pour la compilation de Qt Creator, cette modification de CMake apporte des gains de vitesse entre 22 % et 37 % :


Une autre amélioration récente de CMake, requise pour les en-têtes précompilés, est la gestion de la compilation par lots (avec une unité de compilation unique, amalgamée ou jumbo, entre autres noms). Au lieu d’assembler les fichiers d’en-tête les plus utiles, il s’agit de combiner plusieurs fichiers source (donc des .cpp) en un seul, afin d’appeler moins souvent le compilateur (donc de moins souvent lire les fichiers d’en-tête, d’instancier les templates). Le reste de la chaîne de compilation apprécie aussi, puisqu’il y a moins de fichiers objet à lier. L’inconvénient est que tous les projets ne sont pas compatibles. En combinant les fichiers source huit par huit, le temps de compilation de Speedcrunch diminue de 23 % à 54 %, selon le compilateur.


Les modifications proposées ne sont pas encore incluses dans les dernières versions de CMake, la revue de code est toujours en cours, mais il est plus que probable qu’elles y seront pour la sortie de Qt 6 (pas avant 2020).

Source : Precompiled Headers and Unity (Jumbo) Builds in upcoming CMake.

Une erreur dans cette actualité ? Signalez-nous-la !

Avatar de air-dex
Membre expert https://www.developpez.com
Le 02/08/2019 à 20:17
Citation Envoyé par Matthieu76 Voir le message
J'ai jamais vraiment compris l'intérêt de CMake, pour build il ne suffit pas simplement de faire un Makefile et de build avec le compilateur ?
La vitesse de compilation est-elle le seul intérêt à utiliser CMake ?
Un Makefile n'est pas énormément portable. Son bon fonctionnement dépendra directement de la configuration de la machine du développeur (OS, emplacement et noms des outils de dev...).

CMake résout ce problème de portabilité. Tu donnes à CMake deux fichiers : un fichier CMakeLists.txt décrivant le projet indépendamment de la configuration du développeur et un fichier CMakeCache.txt avec des données relatives à la configuration du développeur. À partir de ces deux fichiers, CMake est capable de :
  • Générer un fichier d'automatisation de build (Makefile, Ninja, Ant...).
  • Compiler un programme à partir d'une toolchain que tu lui passes en paramètre (MSVC, GCC...).
  • Générer des fichiers projets pour les EDI (Visual Studio, Eclipse, Qt Creator...).
  • Faire tourner les tests (CTest).
  • S'occuper du packaging de l'application (CPack).


Concrètement tu partages :
  • Le fichier CMakeLists.txt indépendant de la machine du développeur. C'est le même fichier pour tout le monde.
  • Un sample de CMakeCache.txt où le développeur mettra sa configuration personnelle.


CMake fera le café pour le reste. Autant te dire que c'est un outil très puissant.

Ses concurrents se nomment Maven, Gradle ou encore qmake.

Après pourquoi CMake ? On est ici sur une news Qt donc je vais répondre pour Qt. Les développeurs de Qt souhaitent remplacer le vieillissant et vénérable qmake à l'horizon de Qt 6. CMake est l'heureux élu pour succéder à qmake (je te passe les détails de la succession, à base de Qbs). CMake est donc la solution qui t'évitera d'avoir à réécrire ton fichier projet quand ton projet passera à Qt 6, où tu n'auras plus ni Qbs, ni qmake. L'un des travaux actuels des développeurs de Qt consiste donc à mettre CMake et qmake à parité voire plus, afin que l'arrêt de qmake se passe bien et que ce ne soit pas une grosse perte.
7  0 
Avatar de Matthieu76
Membre éclairé https://www.developpez.com
Le 02/08/2019 à 17:33
J'ai jamais vraiment compris l'intérêt de CMake, pour build il ne suffit pas simplement de faire un Makefile et de build avec le compilateur ?
La vitesse de compilation est-elle le seul intérêt à utiliser CMake ?
0  0 
Avatar de Matthieu76
Membre éclairé https://www.developpez.com
Le 06/08/2019 à 11:19
Merci pour tes précisions.
Juste encore un petite question :
CMake est-il utilisé avec des outils tel que MS Azure, Jenkins ou encore Docker pour pourvoir déployer sur des serveurs ou existe-il des méthodes plus adapté pour compiler et déployer simplement ?
0  0