🦔

clangd(VScode)でのcompile_commands.jsonの位置を指定する設定

2025/01/14に公開

前提

Windows上のVSCode+clangd extensionでの話

どこで設定するのか

File>Preferences>Settingsで画面を開いて
Workspace タブ> clangdをクリックした画面のclangd: Argumentsで設定できます

あとProjectフォルダ直下の.clangdファイルでproject共通のinclude path,Define,その他コンパイルに渡す引数を設定できます

(compile_commands.json,compile_flags.txtに追加されるみたい。
因みにcompile_commands.jsonはファイル単位で個別に設定して適用
compile_flags.txtは同フォルダ全てのファイルに適用
clangdで解析するファイルのあるフォルダからこの二つのファイルを検索してなかったら親フォルダに上って再検索のようです
優先順位は解析するファイルがcompile_commands.jsonで定義されていればそちら、なければcompile_flags.txtなのでどちらか片一方の設定が有効になるようです
.clangdの設定は上記の二つの設定と共存するようです)

以下 .clangdの例(開発環境はgccのC++20で使用)

If:
    PathMatch: .*

CompileFlags:
    Add:
        - -std=gnu++20
        - -fchar8_t
        - --include-directory=\\wsl.localhost\Ubuntu-24.04\home\xxx\images\linux\sdk\sysroots\cortexa9t2hf-neon-xilinx-linux-gnueabi\usr\include\
        - -D_TIME_BITS=64
        - -D_FILE_OFFSET_BITS=64
        - -D__ARM_PCS_VFP
        - -U__STRICT_ANSI__
        - -Wuninitialized
        - -Werror=return-type
        - -D_GNU_SOURCE
        - -D__GCC_ATOMIC_TEST_AND_SET_TRUEVAL=1
        - -D__GCC_ATOMIC_BOOL_LOCK_FREE=2
        - -D__GCC_ATOMIC_POINTER_LOCK_FREE=2
        - -D__GCC_ATOMIC_CHAR_LOCK_FREE=2
        - -D__GCC_ATOMIC_SHORT_LOCK_FREE=2
        - -D__GCC_ATOMIC_INT_LOCK_FREE=2
        - -D__GCC_ATOMIC_LONG_LOCK_FREE=2
        - -D__GCC_ATOMIC_LLONG_LOCK_FREE=2
        - -D__GCC_ATOMIC_WCHAR_T_LOCK_FREE=2
        - -D__GCC_ATOMIC_CHAR8_T_LOCK_FREE=2
        - -D__GCC_ATOMIC_CHAR16_T_LOCK_FREE=2
        - -D__GCC_ATOMIC_CHAR32_T_LOCK_FREE=2

動機

VSCode+clangdにおいてWorkspaceのfolder(VScodeで最初に指定するfolder)にさらにWorkspace共通のコードのfolder(File>Add Folder to workspce)している状態

共通のコードからWorkspaceのfolderのヘッダファイルをincludeしているのですが

Defaultだとcompile_commands.jsonはWorkspace folderと共通コードのfolderで別々となります

また、共通コードのcompile_commands.jsonはinclude pathをWorkspace毎に切り替える必要があるがDefaultだと共通のコードのfolderのcompile_commands.jsonを使用するためinclude pathをworkspaceに合わせて切り替えることができず、workspace毎にcompile_commands.jsonを書き換える必要がでてきます

ですので共通コードのcompile_commands.jsonのDefaultのProject以下以外のところに指定する方法を探していました

蛇足

WSL上の開発環境で開発しているのですが(petalinux VSCodeベース)そのclangdが古いのでclangd上ではエラーばかりになります
それでWSL上のファイルをWindows上のVSCodeを動かしてその上でより最新のclangdを動かすことを考えました

一つのProjectで完結するのでしたら、それ以上はなにもなかったのですが、複数のプロジェクトのソースコードの一部を共有して開発している状態なので共有コードをどういう形でシェアするかというのがでてきて、WSL上の開発環境ではシンボリックリンクでシェアをしていました

ここで問題となるのがWSL上のシンボリックリンクはWindows上では未対応となり、Windows上のVScodeでも共有コードをWSL上と同じようには見れないことです

Windows上のVScodeで共有コードにアクセスするために使ったのが「add folder to workspace」となります
これでファイルに編集等はなんとかなりました

次にclangdですが、include pathやdefineをcompile_commands.jsonに追加して解析してくれるようになったのですが、
「add folder to workspace」で追加したフォルダについてはcompile_commands.jsonの内容をWorkspaceが変わるとinclude pathを変える必要があることがわかりました

そこで表題のcompile_commands.jsonの位置を指定する方法が必要となり今回の記事の内容となっています

「add folder to workspace」で追加したフォルダのcompile_commands.jsonをworkspaceのフォルダに保持することで
workspaceを切り替えてもそのworkspaceのcompile_commands.jsonを参照する形なのでinclude pathを切り替えられるって感じ

とりあえずなんとかなってよかった

参考になれば幸いです

Discussion