CUDAとcmakeとLanguage server
なんの話か
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通り:
- Responseファイルの使用をやめる
- Responseファイルの中身をcompile_commands.jsonに展開する
1は、CMakeLists.txtに
と書くだけです。 </p>
2は、生成されるcompile_commands.json中の中にResponseファイルのpathが書かれているので、その内容をcompile_commands.jsonに直書きするだけです。これを簡単に行うスクリプトがこちら。 compile_commands.jsonを生成した後、build directory内で とすればinclude directoryが展開され、上書きされます。