ブログズミ: [C/C++][Clang] include 解析ツールを作った
ちょっと前に clang で include 依存関係解析を書きましたが、最終的にやりたいことができるツールが既にあったので使ってみました。
Include-What-You-Use
ツールは
Include-What-You-Use といいます。
こちらの存在は以下の記事を見て知りました。
Include-What-You-Use も clang の AST を利用して解析しているそうです。
ホームページのダウンロードリンクに Windows バイナリがあったので、今回はこれを使いました。
Downloads
また、使用方法は Github のドキュメントを参照。
How to Run
CXX を include-what-you-use にしてビルドすれば良いようです。
iutest で試した結果がこちら。
$ make CXX=include-what-you-use sample
include-what-you-use -I../../include -g -Wall -Wextra -Wundef -c ../../samples/main.cpp
In file included from ../../samples/main.cpp:24:
In file included from ../../samples/../include/iutest.hpp:23:
In file included from ../../include/iutest_core.hpp:20:
In file included from ../../include/internal/iutest_result_reporter.hpp:20:
In file included from ../../include/internal/iutest_core_impl.hpp:20:
In file included from ../../include/internal/iutest_internal.hpp:20:
In file included from ../../include/internal/../iutest_pred.hpp:20:
In file included from ../../include/iutest_assertion.hpp:20:
In file included from ../../include/iutest_result.hpp:20:
In file included from ../../include/internal/iutest_message.hpp:20:
In file included from ../../include/internal/../iutest_env.hpp:20:
In file included from ../../include/internal/iutest_charcode.hpp:20:
In file included from ../../include/internal/iutest_port.hpp:24:
In file included from ../../include/internal/iutest_internal_defs.hpp:20:
In file included from ../../include/internal/../iutest_defs.hpp:20:
../../include/internal/iutest_compiler.hpp:38:12: fatal error: 'windows.h' file not found
# include <windows.h>
^
../../samples/main.cpp should add these lines:
#include <vcruntime_new.h> // for operator new
#include "internal/../impl/../iutest_env.hpp" // for Environment
#include "iutest_config.hpp" // for IUTEST_HAS_LIB
#include "util/iutest_util_output.hpp" // for Console
../../samples/main.cpp should remove these lines:
- #include <iostream> // lines 50-50
The full include-list for ../../samples/main.cpp:
#include <vcruntime_new.h> // for operator new
#include "../include/iutest.hpp" // for AddGlobalTestEnvironment
#include "internal/../impl/../iutest_env.hpp" // for Environment
#include "iutest_config.hpp" // for IUTEST_HAS_LIB
#include "util/iutest_util_output.hpp" // for Console
---
Makefile:104: ターゲット 'main.o' のレシピで失敗しました
make: *** [main.o] エラー 7
Windows バイナリを使っているため、Windows sdk のパスを通さないといけません。
が、とりあえず sample.cpp に不要な iostream の include があるのがわかったので修正しました。
Visual Studio でできないか?
Visual Studio の拡張機能でないかなーと見ましたが、今現在はないもよう。
Clang for Windows があるし、このへんも対応してくれるとうれしいなーと思いました。
(※ なんとかできないか調査中)
2016/4/14 追記
include-what-you-use-cl を公開しました。
こちらは Visual Studio のプラットフォームツールセットとして、Include-What-You-Use を使えるようにするツールです。
git clone して install.bat を実行するとインストールされます。
別途、Include-What-You-Use.exe へのパスを通しておく必要があります。
インストールすると、プラットフォームツールセットに Include-What-You-Use の選択肢が出ます。
ビルドすると以下のように結果が出ます。
(※エラー出るかもしれませんが、依存関係の解析はできてるはず。)
(※なんでツールセットなのかは、ツールセットの定義の仕方の勉強がてらです。)
追記ここまで
==============
最後に
今回は、軽く触れる程度に Include-What-You-Use を紹介させていただきました。
では、また今度。