Ink

Contents related to tech, hobby, etc

LSPサーバーとして使うclangdにビルドフラグを設定する

|

LSPサーバーとして使うclangdにビルドフラグを設定する

公式ページ: https://clangd.llvm.org/installation

  • 同じディレクトリに compile_flags.txt ファイルを作れ

  • 一行に一フラグずつ書け

C言語(とC++言語)のLSPサーバーに、LLVMプロジェクトのclangdがあります。 何も設定しないで使おうとすると

$ clang foo.cc

とビルドされるものと解釈して動きます。 これだと大体のプログラムはフラグが足りないため、 フラグを設定する方法が2通り用意されています。

  • compile_commands.json

  • compile_flags.txt

compile_commands.json: ビルドツールを使用する場合

プロジェクトの中にある各ファイルのコンパイルコマンドを定義できます。 これは基本的にはツールによって生成されます。

clangd は、今編集しているファイルの親ディレクトリに このファイルを探しにいきます。

下に2つの例を上げていますが、これ以外のツールでも生成出来るものがあるそうです。

参考: compilecommands.jsonの仕様

CMakeを使っている場合

cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=1

とすることで、ビルドディレクトリに compile_commands.json を 出力します。 プロジェクトルートとは異なる場合であった場合は手動で (シムリンクorコピーすることで)移動する必要があります。

他のビルドツールを使っている場合

bearを使用することで様々なビルドツールでも使うことができるようです。

bear -- <<使用しているビルドコマンド>>

とすることで、生成できます。 仕組み的には、ビルドコマンドで普通にビルドし、そのログから コンパイラの呼び出しを特定& compile_commands.json を作るようです。

(READMEを雑に読んだ程度の知識)

compile_flags.txt: 手動ビルド、若しくはフラグが少ない場合

手動でのビルドをしている場合や、フラグが少ない場合は compile_flags.txt を使う方が楽でしょう。

但し 同じディレクトリにある全てのソースに対して同じフラグが設定される ので注意が必要です。

このファイルはシンプルな構文で、一行に一つフラグを記入するだけです。

例えばgtk4を用いて以下のようにコンパイルしていた場合:

clang $(pkg-config --cflags gtk4) -o somefile somefile.c $(pkg-config --libs gtk4)

以下のようにしてあげれば良いでしょう。

pkg-config --cflags --libs gtk4 | tr ' ' '\n'
-I/usr/include/gtk-4.0
-I/usr/include/pango-1.0
-I/usr/include/glib-2.0
-I/usr/lib/glib-2.0/include
-I/usr/include/harfbuzz
-I/usr/include/freetype2
-I/usr/include/libpng16
-I/usr/include/libmount
-I/usr/include/blkid
-I/usr/include/fribidi
-I/usr/include/cairo
-I/usr/include/lzo
-I/usr/include/pixman-1
-I/usr/include/gdk-pixbuf-2.0
-I/usr/include/graphene-1.0
-I/usr/lib/graphene-1.0/include
-mfpmath=sse
-msse
-msse2
-I/usr/include/gio-unix-2.0
-pthread
-lgtk-4
-lpangocairo-1.0
-lpango-1.0
-lharfbuzz
-lgdkpixbuf-2.0
-lcairo-gobject
-lcairo
-lvulkan
-lgraphene-1.0
-lgio-2.0
-lgobject-2.0
-lglib-2.0