Utiliser ccache pour compiler Qt plus vite

Pour ceux qui recompilent souvent Qt, et qui détestent passer 3 heures à le faire à chaque fois qu'ils font une modification assez lourde pour justifier une recompilation complète, voici une petite astuce: utilisez ccache.

Je l'utilise dans la plupart de mes projets, car il est extrémement simple à utiliser. Il suffit de l'installer (sous n'importe quelle distribution Linux, Windows ne semble pas bien supporté), et d'ajouter devant l'invocation du compilateur le petit keyword ccache. Ccache est assez intelligent pour détecter qu'il cross-compile, donc cette astuce marche très bien même pour des compilateurs d'archis exotiques.

Pour Qt, c'est plus compliqué: en effet, le processus de compilation se sert de ce qu'on appelle les mkspecs pour déterminer quel compilateur utiliser. Ça lui permet de compiler pour n'importe-quelle architecture très simplement (changer d'archi = spécifier un autre mkspec). Du coup, pour utiliser ccache lors de la compilation de Qt, il faut aller modifier le fichier qmake.conf qui se trouve dans le dossier mkspec associé à votre architecture.

Ne vous inquiétez pas, c'est plus simple qu'il ne le paraît. Tout ce que vous avez à faire, c'est:
1- de lancer le script ./configure avec vos options habituelles, en ajoutant l'option -no-pch, qui désactive l'utilisation des headers précompilés (ccache ne les prend pas en charge)
2- d'ajouter ccache devant les noms des compilateurs, dans le fichier mkspecs/default/qmake.conf, de cette façon:

 QMAKE_CC                = ccache gcc # ajouter ccache devant le nom du compilo
 QMAKE_CXX               = ccache g++

Le répertoire mkspecs/default est un lien symbolique qui se trouve à la racine des sources de Qt, et qui est mis à jour lors du ./configure pour pointer vers l'architecture correcte. Pas besoin de le faire pour les étapes de link et de génération de librairies, dans ce cas ccache ne sert à rien.

Vous allez me dire que de désactiver les headers précompilés fait perdre en vitesse de compilation, ce qui est le cas la première fois; mais lors d'une recompilation, ccache va prendre en charge les 99% de fichiers non changés en piochant dans son cache, ce qui coûte bien moins cher.

Pour petit exemple, la recompilation complète de Qt en mode debug:

$ time gmake -j3
real    5m19.755s
user    7m13.655s
sys     1m54.516s

Les statistiques de ccache, qu'on obtient en tapant ccache -s:

cache directory                     /home/user/.ccache
cache hit                           3180
cache miss                             0
called for link                        4
files in cache                     19581
cache size                           1.8 Gbytes
max cache size                       3.0 Gbytes

J'avais bien sûr compilé Qt juste avant, la ligne "cache hit" indique que la compilation a utilisé le cache 3180 fois, et "cache miss" montre qu'aucun fichier n'a été réellement recompilé. Si vous changez un seul fichier dans Qt, la recompilation réelle ne se passera que pour ce fichier, le reste sortira du cache.

blogroll