かつかれーのメモ帳

実験ノートか勉強記録

Windows環境でllvmとcclsをビルドしてcoc.nvimを導入する

タイトルの通りの備忘録。Windowsだと情報がそれほど多くなくて、1日溶かしてしまった…

llvmのビルドについては良い記事が既に存在する。
Windows環境でLLVM、Clang、lld(Ver11.0.0)をビルドする手順 - 単子葉類プログラマーのメモ

簡単にまとめておくと

という感じ。build/Release/binにパスを通して、llvmの準備は完了。

cclsもほぼ同様にビルドが行える。

  • 公式の手順の通り、最新版を
    git clone --depth=1 --recursive https://github.com/MaskRay/ccls
  • ccls/buildディレクトリを作成
  • CMakeLists.txtの頭の方に
    SET(Clang_DIR "(前略)/llvm-project/build/lib/cmake/clang")
    SET(LLVM_DIR "(前略)/llvm-project/build/lib/cmake/llvm")
    を追記
  • CMakeでccls/buildを書き先にして、他の設定は特に弄らずConfigure→Generate
  • VSソリューションが作成されるので、Release, x64 設定でビルド
    • overrideされるはずのものがされていない、というエラーに対しては"override"のコメントアウトで対応したが問題なさそうだった。

ccls/build/Releaseにccls.exeがあるはずなので、このディレクトリにパスを通す。

これでcocからcclsを利用する準備が整った。cocの設定はWindows特有の要素があまりなく、dein等で導入したあと:CocConfigコマンドから設定を書けば問題ない。設定が保存されるファイルはnvimの設定フォルダ直下のcoc-settings.json
わかりやすいまとめは NeoVimでC/C++を書くときはcoc.nvim + cclsが良さげ | endaaman.me とか。
VSのプロジェクトみたいな感じで、コンパイル対象のファイル一覧をcclsに知らせるために、compile_commands.jsonをプロジェクトにつき1つ作成する。おそらく一番簡単なのはClangの出力結果をまとめる方法。
Compilation database — Sarcasm notebook にある通り、

clang++ -MJ a.o.json -Wall -std=c++11 -o a.o -c a.cpp
clang++ -MJ b.o.json -Wall -std=c++11 -o b.o -c b.cpp
のようにファイルごとにjsonを生成して、それを単純に連結したものを[]で括ってcompile_commands.jsonにする。この辺はclang++を叩くところも含めて適当にバッチなどで処理できる。

適切なcompile_commands.jsonを有するフォルダ(例えば以下のような感じ)で補完が出来ていれば成功。ちゃんと出来ていればmain.cppがtest.h(プロトタイプ宣言)をincludeしてtest.cppに定義されている関数を呼ぶ、といった形になっていても補完やジャンプが利く。

│  main.cpp
│ test.cpp
│ test.h
│ compile_commands.json (main.cppとtest.cppを対象に上記手順で生成)
└─ccls-cache
│ (以下略)