Utiliser IWYU dans le cadre d'un projet CMake

À l'heure où j'initie cette note (04/11/2014), IWYU (Include What You Use, disponible en version 3.3 sur Ubuntu 14.04 LTS et en version 3.4 sur Debian Jessie) ne peut être utilisé comme l'indique sa documentation lorsque les scripts Makefile d'un projet ont été générés par CMake. Toute tentative se solde par une erreur.

On peut y remédier en procédant à quelques manipulations préalables expliquées par le développeur Hinidu dans un rapport de bogue du projet neovim :

  • Dans un premier temps, on télécharge le script Python publié sur Github par Hinidu.
  • IWYU s'appuyant sur Clang, on configure CMake pour que la compilation des sources du projet soit réalisée par ce compilateur et non par GCC.
  • On ajoute à la ligne de commande de CMake l'option « -DCMAKE_EXPORT_COMPILE_COMMANDS:BOOL=ON » qui conduit CMake à copier dans un fichier nommé « compile_commands.json » toutes les commandes de compilation requises.
user@host:~$ cd /path/to/build
user@host:build$ cmake -DCMAKE_EXPORT_COMPILE_COMMANDS:BOOL=ON /path/to/sources
  • On se place dans le répertoire de compilation et on lance le script Python en lui passant en paramètre le nom du fichier dans lequel CMake a enregistré les commandes de compilation :
user@host:~$ cd /path/to/build
user@host:build$ iwyu.py compile_commands.json

On obtient ainsi la liste des modifications suggérées. Au passage, il faut être critique vis-à-vis de ces suggestions. Si beaucoup sont pertinentes, IWYU ne sait pas distinguer interfaces publiques et privées et a tendance à proposer de remplacer les premières par les secondes. C'est une erreur à ne pas commettre.