| Les deux révisions précédentesRévision précédente | |
| prog:iwyu [2024/02/23 16:28] – Ajout des options à l'exécution root | prog:iwyu [2025/10/27 15:35] (Version actuelle) – Réécriture root |
|---|
| [[https://include-what-you-use.org|Site web]] | [[https://include-what-you-use.org|Site web]] |
| |
| ====CMake==== | =====CMake===== |
| | |
| * Configuration | |
| |
| S'intègre parfaitement avec [[prog:cmake|CMake]]. | S'intègre parfaitement avec [[prog:cmake|CMake]]. |
| Il faut commencer par activer l'option ''set(CMAKE_EXPORT_COMPILE_COMMANDS ON)''. | Il faut commencer par activer l'option ''set(CMAKE_EXPORT_COMPILE_COMMANDS ON)''. |
| |
| Puis lancer la génération des fichiers ''Makefile'' avec ''%%CC="clang" CXX="clang++" cmake -S . -B build%%'' pour générer également le fichier ''compile_commands.json''. | Puis lancer la génération du fichier ''compile_commands.json'' avec ''%%CC="clang" CXX="clang++" cmake -S . -B build%%''. |
| |
| * Exécution de l'analyse | 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. |
| | |
| | =====Execution===== |
| |
| <code bash> | <code bash> |
| iwyu_tool -p . -- -Xiwyu --mapping_file="$(pwd)/../.iwyu-suppressions" > fix.log | iwyu_tool -p . -- -Xiwyu --mapping_file="$(pwd)/../.iwyu-suppressions" -Xiwyu --no_default_mappings > fix.log |
| </code> | </code> |
| |
| Le dossier spécifié par ''-p'' est celui qui contient le fichier ''compile_commands.json''. | Le dossier spécifié par ''-p'' est celui qui contient le fichier ''compile_commands.json''. |
| |
| * Option d'exécution | ====Option d'exécution==== |
| |
| Si vous préférez les entêtes aux ''forward declaration'', il faut ajouter l'option ''%%--no_fwd_decls%%''. | 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. | 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. |
| |
| * Application des résultats | =====Patch===== |
| |
| <code bash> | <code bash> |
| |
| Par défaut, les headers ne sont pas modifiés. Il faut ajouter l'option ''%%--nosafe_headers%%''. | Par défaut, les headers ne sont pas modifiés. Il faut ajouter l'option ''%%--nosafe_headers%%''. |
| ====Options==== | |
| |
| * Filtrer les erreurs | =====Filtrer les erreurs===== |
| |
| 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. | 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. |
| <file txt .iwyu-suppressions> | <file txt .iwyu-suppressions> |
| [ | [ |
| { include: ["@\"gtest/.*\"", "private", "<jessica/test/test.h>", "public"] }, | {include : [ "@<Eigen\/src\/Core\/.*>", private, "<Eigen/Core>", public ]}, |
| { include: ["@<gtest/.*>", "private", "<jessica/test/test.h>", "public"] } | {include : [ "\"src/Core/ArrayBase.h\"", private, "<Eigen/Dense>", public ]}, |
| ] | {include : [ "@<nlohmann\/.*>", private, "<nlohmann/json.hpp>", public ]} |
| </file> | {include : [ "<bits/time.h>", private, "<ctime>", public ]}, |
| | {symbol : [ "uint32_t", private, "<cstdint>", public ]}, |
| | {symbol : [ "QDir", private, "<QDir>", public ]}, |
| | ]</file> |
| |
| 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 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. |
| |
| 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. | 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. |