CMake rattrape qmake en performance

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.

Leave a comment

This site uses Akismet to reduce spam. Learn how your comment data is processed.