clang を使用してインクルードファイルの出力
そんなわけで、clang の libclang と cindex.py を使用した簡単な C++ のコード解析です。
とりあえず、インクルードしているヘッダーファイルの出力とか。
[Python ソース]
import sys import clang.cindex target = "main.cpp" index = clang.cindex.Index.create() tree = index.parse(target) for value in tree.get_includes(): print value.source.name
[C++ ソース]
#include <string> int main(){ return 0; }
[出力]
main.cpp c:/MinGW/lib/gcc/mingw32/4.5.0/include/c++\string c:/MinGW/lib/gcc/mingw32/4.5.0/include/c++/mingw32\bits/c++config.h c:/MinGW/lib/gcc/mingw32/4.5.0/include/c++/mingw32\bits/c++config.h c:/MinGW/lib/gcc/mingw32/4.5.0/include/c++\string c:/MinGW/lib/gcc/mingw32/4.5.0/include/c++\string c:/MinGW/lib/gcc/mingw32/4.5.0/include/c++\bits/char_traits.h c:/MinGW/lib/gcc/mingw32/4.5.0/include/c++\bits/stl_algobase.h c:/MinGW/lib/gcc/mingw32/4.5.0/include/c++\bits/stl_algobase.h c:/MinGW/lib/gcc/mingw32/4.5.0/include/c++\bits/functexcept.h c:/MinGW/lib/gcc/mingw32/4.5.0/include/c++\bits/stl_algobase.h c:/MinGW/lib/gcc/mingw32/4.5.0/include/c++\bits/stl_algobase.h c:/MinGW/lib/gcc/mingw32/4.5.0/include/c++\bits/stl_algobase.h c:/MinGW/lib/gcc/mingw32/4.5.0/include/c++\bits/stl_algobase.h c:/MinGW/lib/gcc/mingw32/4.5.0/include/c++\bits/stl_pair.h c:/MinGW/lib/gcc/mingw32/4.5.0/include/c++\bits/move.h c:/MinGW/lib/gcc/mingw32/4.5.0/include/c++\bits/move.h c:/MinGW/lib/gcc/mingw32/4.5.0/include/c++\bits/stl_algobase.h c:/MinGW/lib/gcc/mingw32/4.5.0/include/c++\bits/stl_iterator_base_types.h c:/MinGW/lib/gcc/mingw32/4.5.0/include/c++\bits/stl_algobase.h c:/MinGW/lib/gcc/mingw32/4.5.0/include/c++\bits/stl_algobase.h c:/MinGW/lib/gcc/mingw32/4.5.0/include/c++\bits/stl_algobase.h c:/MinGW/lib/gcc/mingw32/4.5.0/include/c++\bits/char_traits.h c:/MinGW/lib/gcc/mingw32/4.5.0/include/c++\bits/postypes.h c:/MinGW/lib/gcc/mingw32/4.5.0/include/c++\cwchar c:/MinGW/lib/gcc/mingw32/4.5.0/include/c++\cwchar c:/mingw/include\wchar.h c:/mingw/include\wchar.h c:/mingw/include\wchar.h c:/mingw/include\wchar.h c:/MinGW/lib/gcc/mingw32/4.5.0/include/c++\bits/char_traits.h c:/MinGW/lib/gcc/mingw32/4.5.0/include/c++\cwchar c:/MinGW/lib/gcc/mingw32/4.5.0/include/c++\string c:/MinGW/lib/gcc/mingw32/4.5.0/include/c++\bits/allocator.h c:/MinGW/lib/gcc/mingw32/4.5.0/include/c++/mingw32\bits/c++allocator.h c:/MinGW/lib/gcc/mingw32/4.5.0/include/c++\ext/new_allocator.h c:/MinGW/lib/gcc/mingw32/4.5.0/include/c++\new c:/MinGW/lib/gcc/mingw32/4.5.0/include/c++\new c:/MinGW/lib/gcc/mingw32/4.5.0/include/c++\string c:/MinGW/lib/gcc/mingw32/4.5.0/include/c++\bits/localefwd.h c:/MinGW/lib/gcc/mingw32/4.5.0/include/c++/mingw32\bits/c++locale.h c:/MinGW/lib/gcc/mingw32/4.5.0/include/c++\clocale c:/MinGW/lib/gcc/mingw32/4.5.0/include/c++/mingw32\bits/c++locale.h c:/MinGW/lib/gcc/mingw32/4.5.0/include/c++\bits/localefwd.h c:/MinGW/lib/gcc/mingw32/4.5.0/include/c++\bits/localefwd.h c:/MinGW/lib/gcc/mingw32/4.5.0/include/c++\cctype c:/MinGW/lib/gcc/mingw32/4.5.0/include/c++\string c:/MinGW/lib/gcc/mingw32/4.5.0/include/c++\bits/ostream_insert.h c:/MinGW/lib/gcc/mingw32/4.5.0/include/c++\string c:/MinGW/lib/gcc/mingw32/4.5.0/include/c++\bits/stl_function.h c:/MinGW/lib/gcc/mingw32/4.5.0/include/c++\string c:/MinGW/lib/gcc/mingw32/4.5.0/include/c++\bits/basic_string.h c:/MinGW/lib/gcc/mingw32/4.5.0/include/c++\ext/atomicity.h c:/MinGW/lib/gcc/mingw32/4.5.0/include/c++/mingw32\bits/gthr.h c:/MinGW/lib/gcc/mingw32/4.5.0/include/c++/mingw32\bits/gthr-default.h c:/MinGW/lib/gcc/mingw32/4.5.0/include/c++\ext/atomicity.h c:/MinGW/lib/gcc/mingw32/4.5.0/include/c++\bits/basic_string.h c:/MinGW/lib/gcc/mingw32/4.5.0/include/c++\string
こんな感じで、clang を使用すれば比較的簡単に C++ のコード解析を行うことが出来ます。
しかし、明確なドキュメントが見当たらず、どこまで出来るのかがよく分からないので、今後も実際にコードを書いてみて色々と試してみたいと思います。
多分続く…?
[Version]
- clang 3.0
- python 2.7
[注意]
使用している、clang は、svn のものを使用しているので、現行のリリース版である、clang 2.9 では動かない可能性があります。
cindex.py も2.9 と 3.0 では、中身が違っていました。