2016年4月11日月曜日

[C++] Include-What-You-Use で依存関係を確認する

ブログズミ: [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 を紹介させていただきました。
では、また今度。


0 件のコメント:

コメントを投稿