S'intègre parfaitement avec CMake.
Il faut commencer par activer l'option set(CMAKE_EXPORT_COMPILE_COMMANDS ON).
Puis lancer la génération du fichier compile_commands.json avec CC="clang" CXX="clang++" cmake -S . -B build.
Il est important d'utiliser le compilateur clang / clang++ car iwyu est basé en interne sur llvm. Il est préférable d'utiliser des header compatibles.
iwyu_tool -p . -- -Xiwyu --mapping_file="$(pwd)/../.iwyu-suppressions" -Xiwyu --no_default_mappings > fix.log
Il est possible de mettre autant de -Xiwyu --mapping_file= que l'on veut.
Le dossier spécifié par -p est celui qui contient le fichier compile_commands.json.
Ajouter -Xiwyu --no_fwd_decls si vous préférez les entêtes aux forward declaration.
Ajouter -Xiwyu --no_default_mappings si le mapping par défaut est mauvais.
Par défaut, iwyu va analyser tous les fichiers sources (.cpp, .cc, …) depuis le fichier compile_commands.json. Les fichiers entête analysés doivent avoir le même nom (hors extension) que celui du fichier contenant le code source. Si on veut analyser d'autres fichiers, il faut utiliser l'option -Xiwyu --check_also="*path/*.h" (format wildcard). Les --check_also sont cumulables.
fix_includes.py --nosafe_headers < fix.log
Par défaut, les headers ne sont pas modifiés. Il faut ajouter l'option --nosafe_headers.
Il est possible de supprimer certains avertissements en utilisant un fichier (ici .iwyu-suppressions). Il est important que le chemin de ce fichier soit absolu.
[
{include : [ "@<Eigen\/src\/Core\/.*>", private, "<Eigen/Core>", public ]},
{include : [ "\"src/Core/ArrayBase.h\"", private, "<Eigen/Dense>", public ]},
{include : [ "@<nlohmann\/.*>", private, "<nlohmann/json.hpp>", public ]}
{include : [ "<bits/time.h>", private, "<ctime>", public ]},
{symbol : [ "uint32_t", private, "<cstdint>", public ]},
{symbol : [ "QDir", private, "<QDir>", public ]},
]
Dans la première partie private, on met le nom de l'entête erroné. Si le texte commence par @, la recherche est une expression régulière.
Dans la seconde partie public, on met le nom du juste entête.
Dans le code source, il y a un script mapgen/iwyu-mapgen-qt.py qui permet de générer du fichier de correspondance. Il est impératif de l'utiliser avec la version exacte de Qt.
Attention, tout est codé en expression régulière et iwyu n'est pas du tout optimisé pour ça. Il est conseillé de remplacer tous les "@[\"<](Qt3DCore/)?qcomponent\\.h[\">]" par "<qcomponent.h>" et éventuellement d'ajuster en fonction des premiers résultats.
Il est conseillé de ne pas utiliser ce script et d'ajouter manuellement la correspondance symbole / header.