なんの話か

CMakeのCUDA関連のプロジェクトで、LSPを用いたコード補完を行う場合のtips的なものです。
主にVimでCoc-clangdを使っていたときに遭遇した問題と対応を書いていきます。

cmakeとInclude directoryについて

CUDA関連のcmakeのプロジェクトでは、Response fileでinclude directoryが渡されてしまうため、LSP clientによってはこれを認識できず、include directoryが認識されません。結果、#include まで入力しても、欲しいincludeファイルが候補として現れなかったり、手動でheaderファイルを書いても、header内のコンテンツが補完候補として現れなくなります。Responseファイルは、コンパイラのコマンド引数の文字数制限を回避するための仕組みで、これ自体はありがたいものなのですけどね。

解決策として、少なくとも2通り:

  1. Responseファイルの使用をやめる
  2. Responseファイルの中身をcompile_commands.jsonに展開する
が考えられます。

1は、CMakeLists.txtに

set(CMAKE_CUDA_USE_RESPONSE_FILE_FOR_INCLUDES 0)

と書くだけです。 </p>

2は、生成されるcompile_commands.json中の中にResponseファイルのpathが書かれているので、その内容をcompile_commands.jsonに直書きするだけです。これを簡単に行うスクリプトがこちら。 compile_commands.jsonを生成した後、build directory内で

sh ./inc_options.sh compile_commands.json
とすればinclude directoryが展開され、上書きされます。