Clang で AST を弄りたくて
Clang で AST(抽象構文木)をイジるために色々いじってみました。
そのための下地づくりをしたいと思います。
Clang の力を借りて何かしたいときはここから始めないといけない…。みたい。
まずは、llvmプロジェクトのリポジトリをクローンします。
$ git clone https://github.com/llvm/llvm-project.git
かなーり時間がかかりますがしかたありません。
で、Cmake をつかってビルド&インストールをするのですが、私の環境ではNinjaを使うよりもGNU Make を使うほうがはるかに早いので以下を実行しました。
どれだけ違うかというと
ninja :165m
gmake :58m
次に、付け加えたいプロジェクトを llvm-project/clang-tools-extra のディレクトリに追加します。
$ mkdir -p ${llvm-project のディレクトリ}/clang-tools-extra/ディレクトリ名
$ vim ${llvm-project のディレクトリ}/clang-tools-extra/ディレクトリ名/ソースコード.cpp
でもって、次にこれをビルドできるようにします。
$ echo 'add_subdirectory(プロジェクト名:つまりディレクトリ名)' >> clang-tools-extra/CMakeLists.txt
$ vim clang-tools-extra/ディレクトリ名/CMakeLists.txt
以下の設定をCmakeLists.txtに書きます。
CMakeLists.txt
set(LLVM_LINK_COMPONENTS support)
add_clang_executable(プロジェクト名
ソースコード.cpp
)
target_link_libraries(プロジェクト名
PRIVATE
clangTooling
clangBasic
clangASTMatchers
)
あとはソースコード.cppを畫いて、ビルドしなおします。[2]のソースコードを参考に書いてみてください。
これを含んだパッケージをビルドしてみます。
$ mkdir llvm-project-build
$ cmake3 ${llvm-project のディレクトリ} -DLLVM_ENABLE_PROJECTS="clang;clang-tools-extra" -DCMAKE_C_COMPILER=gcc -DCMAKE_CXX_COMPILER=g++
で、ふつーにビルド&インストールします。
$ make -j6 <-環境に合わせてください。
$ sudo make install
これで、ビルドがうまくいったら実行できるはずです。
$ ./bin/プロジェクト名 解析したいプログラム名 --
何もなければ何も起こらないのでこれでOKです。
…のはず。
これで、あとはいじっているソースコードを変更するたびに
$ make プロジェクト名
をすれば勝手にビルドしてくれます。
参考URL:
[1] https://llvm.org/docs/GettingStarted.html
[2] https://clang.llvm.org/docs/LibASTMatchersTutorial.html