MacOS catalinaでhomebrewで入れたclangとclangdを使う方法


導入

MacOS catalinaを入れたら/usr/includeが蒸発
mojaveでも同様の事象が合ったが、別途/usr/includeを作る方法がサポートされていた。
しかし今回のアプデでそれがなくなり、xcodeの方からうまく今までの/usr/includeにあたるものを持ってくる必要がある。

clang

コンパイル時にsysrootオプションを付与する。

clang++ main.cpp -o main --sysroot=/Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk

参考
https://anatofuz.hatenablog.com/entry/2019/10/09/174913

clangd

ソースコードと同階層のcompile_flags.txtに以下を書き込む

-I/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1
-I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include

参考
https://twitter.com/false/status/1168529432115470337

追記

と思ったけどcompile_flags.txtにも同様に

--sysroot=/Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk

を書き込んだらうまく補完が動いた。
原理的にはそりゃそうなんだろうけど、初めに試した時はうまく動かなかった。
compile_commands.jsonと干渉してたのか消した後に動いた。

更に追記

clang及びclang++については以下のようなエイリアスを設定

SYSROOT='/Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk'
alias clang="clang --sysroot=${SYSROOT}"
alias clang++="clang++ --sysroot=${SYSROOT}"

そしてcompile_flags.txtについては、どこに置いておけばうまく読み込んでくれるのか(同階層にcompile_flags.txtがなかったら再起的に上の階層を読み込んでくれるのか)試していたら恐らくホームに置いておけば良いっぽいのでホームに置いた。
これで表面上は今までと同じように使えることになった。

追記及び補足(19/10/13)

pyenvでpythonをインストールしようとしたが、homebrewでインストールしたclangではpythonのビルドがうまくできなかった。
pyenvを使う時はシステムのclangに戻す必要があるかもしれない

追記(19/10/15)

SDKROOTなる環境変数を設定すれば良いらしい
https://qiita.com/imbsky/items/da709a514dded95b8575#_reference-3447ae53b2cd77fc530b
sysrootを指定する環境変数ありそうだなと思いつつググっても見つからなかったのでありがたい

終わり

xcodeが絡むといろいろ厄介だ
それにしても毎回オプションを付与したりtxtファイルを用意するのは面倒、makeファイル作るなり自動生成するなりするしかないのか