clangdとは
clangのLanguage Server Protocol実装。
LSPはMicrosoftが提唱しているIDE支援のための統一プロトコル。
Language "Server"とあるとおり、言語支援のためのサーバーが常駐する。この手の機構を個別に備えた言語として、TypeScriptのtsserverとか、C#のOmniSharpなどが挙げられるけど、それの汎用版。
clangdはLLVMのフロントであるclangをベースとしたサーバーで、LLVMプロジェクトが公式に開発している。
コンパイラなので、コンパイルエラーの検出はもちろん、コード補完やフォーマット、定義ジャンプと参照元ジャンプ等には対応している。
なので、clang-formatやRTagsといったclang系ツールも、LSPクライアントを導入してしまえば、これらの個別設定をしなくてよい。
clangdのインストール
macだと、brew install llvm
とかするとclangdもインストールされるらしい。未確認。
僕は未だにmacports使ってたせいか、知らんうちに手元に入ってた。port install llvm-5.0
で勝手にインストールされるらしい。
LLVMのソースからビルドする場合は、 https://clang.llvm.org/get_started.htmlあたりを読むべし。clangdはclang-tools-extraに入ってるので、svn co
するのを忘れずに。
インストールしたら、 --version
で確認できるよ(以下はソースからビルドした版)。
$ clangd --version> LLVM (http://llvm.org/):> LLVM version 6.0.0svn> Optimized build with assertions.> Default target: x86_64-apple-darwin16.7.0> Host CPU: broadwell
エディタ側
vim
vimの場合は汎用LSPクライントをインストールし、こいつにclangdのパスを教えてやる流れ。
LSPクライアントはいくつかあるんだけど、僕は https://github.com/prabirshrestha/vim-lspを利用している。
他と使い比べたわけでもないんだけど、作者がMSの人だしLSP慣れてんのかなーと思ってこれ使ってる。
この人のpluginは vim / nvimの非同期周りを吸収するasync.vimってのが出てくるので、セットでインストールしておく。
Plug 'prabirshrestha/async.vim'
Plug 'prabirshrestha/vim-lsp'
letg:lsp_log_verbose =1letg:lsp_log_file = expand('~/vim-lsp.log')calllsp#register_server({
\ 'name': 'clangd',
\ 'cmd': {server_info->['clangd']},
\ 'whitelist': ['c','cpp','objc','objcpp'],
\ })" オムニ補完設定
autocmd FileType typescript setlocalomnifunc=lsp#complete
VSC
LLVMが拡張作ってるので、これを入れるがよろし。
また、user/projectの設定で、clangdの在処を直接指定することも可能。
{"clangd.path":"/absolute/path/to/clangd"}
compile_commands.json
clangdにコンパイラオプションとかを教える場合、compile_commands.json
を作って、カレントディクレトリなりに置くとclangdがよしなに探索してくれる。
または clangd起動時に -compile-commands-dir
オプションで、jsonファイルの在処を教える、でもよい。
compile_commands.json
を作る方法はいくつかある。
例えばcmakeの場合は下記のように、 CMAKE_EXPORT_COMPILE_COMMANDS
を有効にしてcmakeを実行すると、出力される。
cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=1 .
シンプルにMakefileのみのプロジェクトの場合、Bearを使う。
bear make
Bazelだと、
https://github.com/grailbio/bazel-compilation-database
とか
https://gist.github.com/bsilver8192/0115ee5d040bb601e3b7
があるようだが、きちんと確認してない。