Open4
MacOS + neovim + coc で ccls (C/C++ language server)を動かす
cclsをインストール
brew install ccls
homebrew 経由で clang を入れている場合、headerファイルの配置が通常と異なるらしいので
以下のコマンドで配置を調べる。
clang++ -xc++ -fsyntax-only -v /dev/null
出力結果に以下のような部分があるので控えておく
/usr/local/include
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/12.0.0/include
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks (framework directory)
CocConfigを開き、languageServer に以下のようにcclsの設定を記述。
{
"languageServer": {
"ccls": {
"command": "ccls",
"filetypes": ["c", "cpp", "objc", "objcpp"],
"rootPatterns": [
".ccls-root",
"compile_commands.json",
".vim/",
".git/",
".hg/"
],
"initializationOptions": {
"cache": {
"directory": "/tmp/ccls"
},
"clang": {
"resourceDir": "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/12.0.0/include",
"extraArgs": [
"-isystem/usr/local/include",
"-isystem/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1",
"-isystem/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/12.0.0/include",
"-isystem/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include",
"-isystem/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include",
"-isystem/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks"
]
}
}
}
}
}
注意点としては、clang.extracArgs に先程控えた ヘッダファイルの配置を記入する。
その際 -isystem を先頭につける。
これがないと ccls がヘッダファイルを見つけられず
#include <stdio.h>
のような記述がエディタ上でのみnot foundエラーになる。
compilerの設定情報をcclsに教えて上げる必要があるので、compile_command.json というファイルをプロジェクトルートに作成したい
以下のようなファイルになる。
[
{
"arguments": [
"/usr/bin/clang",
"-c",
"-o",
"./build/kilo",
"kilo.c"
],
"directory": "/Users/moss0321/dev/projects/kilo",
"file": "/Users/moss0321/dev/projects/kilo/kilo.c",
"output": "/Users/moss0321/dev/projects/kilo/./build/kilo"
}
]
このファイルを手動で作成するのは面倒なので、bare という ツールを使う
brew install bare
bare の 引数にコンパイル用のコマンドを渡してあげると自動で compile_command.json生成してくれる。
適当にMakefileにビルドコマンドを定義して
hello:
clang hello.c -o ./build/hello
bare に渡す
bare -- make
comipile_command.json が生成されている