🫠

LinuxソースコードでLSP(Language Server Protocol)を使う

2023/06/12に公開

Linuxソースコードの中にcompiler_commands.jsonを生成するスクリプトがあるため、それを使うと簡単な手順でLSPを利用してタグジャンプ等ができるようになります。以下はLinuxマシンでclangdとVisual Studio Codeを使用する場合の例です。

手順

0. clangdのインストール

ディストリビューションのパッケージマネージャ経由で入手できるのではないかと思います。fedoraの場合はclang-tools-extraの中にあります。

1. compile_commands.jsonの生成

Linuxをビルドした後、scripts/clang-tools/gen_compile_commands.pyを実行することでclangdが使用するcompile_commands.jsonが生成できます。Linuxのコンパイル方法は割愛しますがLLVMツールチェインを使う場合は以下のようになります(GCCの場合は後述):

# (linuxソースコードのトップディレクトリ)
$ make LLVM=1 -j16 # アーキテクチャによりCC=clangの場合があります(以下URL参照)
$ ./scripts/clang-tools/gen_compile_commands.py

LLVMに対応しているアーキテクチャは以下に情報があります:
https://docs.kernel.org/kbuild/llvm.html#supported-architectures

2. 利用

利用方法は他のプロジェクトでclangdを利用する場合と同じだと思います。

まずVisual Studio Codeにclangd extentionを入れておきます:
https://marketplace.visualstudio.com/items?itemName=llvm-vs-code-extensions.vscode-clangd

Linuxソースのトップディレクトリをワークスペースとして開くとindexの生成処理が走りますの終わるまでしばし待ちます。生成が終わればタグジャンプ等できるようになります。なおindexはトップディレクトリ下の.cache以下に作成されますので何かあればこれを削除します。

少し使ってみたところ以下のようなclang-tidyのbugprone-sizeof-expressionのwarningが大量に出るので:

トップディレクトリ下に.clang-tidyを作成してdisalbeにする設定にしてしまった方がノイズが減るように思います。

.clang-tidy
Checks:
	-bugprone-sizeof-expression,

GCCの場合

GCCでコンパイルする場合も問題なくcompile_commands.jsonは生成できます。

$ make -j16
$ ./scripts/clang-tools/gen_compile_commands.py

ただし一部のコンパイルオプションはGCC独自のためデフォルト状態でVSCを開くと以下のようなerrorがでます:

こちらは以下のissueを参考にトップディレクトリ下に.clangdファイルを作成し、unknownなコンパイルオプションを無視する設定を追加すればerrorはなくなります:
https://github.com/clangd/clangd/issues/662#issuecomment-1447233948

終わりに

スクリプトがあるので簡単にLSPのセットアップができると思います。ただしコンパイルしていない箇所の情報は不完全になるのでアーキテクチャ毎の実装を見比べたいときなどにはあまり使えないように思います。個人的にはタグジャンプのためには普段GNU globalを使っているのですが、見るコードの範囲が決まっている場合は良いのではないでしょうか。

※ この辺りあまり詳しくないのでより良い使い方を知っている人がいたら教えて下さい

以上

Discussion