Homebrew で最新の libc++ と clang をビルドする

追記(9/23)

homebrew-versionsllvm34 というフォーミュラが入っているので,公式に最新の LLVM を入れるには,このフォーミュラを使ったほうが良い.このフォーミュラを使うと,インストールはサンドボックスの中に行われ,システムの clang と衝突しないように 3.4 サフィックスが付くようになっている.なお,下記のパッチは当たっていないので注意.


Homebrew には LLVM 用のフォーミュラがあり,--with-clang --HEAD オプションを付けてインストールすると最新の clang をインストールすることが出来る. しかし,ビルドした clang は /usr/include/c++/4.2.1 を見に行くため,Mac にデフォルトで入っている gcc 4.2.1 を見に行こうとしてしまう. これを回避するには -I {最新の gcc の標準ライブラリのヘッダへのパス} のように明示的にインクルードパスを追加してやらなければならず面倒.

そこで LLVM 用のフォーミュラに手を加え,最新の libc++ をビルドし,それを clang が利用するようにした.

https://github.com/rhysd/homebrew/blob/13dbf9d3af83297eec66eeee8e579d82ab598da2/Library/Formula/llvm.rb

clang のインクルードパスは lib/Frontend/InitHeaderSearch.cpp にハードコーディングされているので,そこにビルドした libc++ へのパスを追加するパッチを書いて,それを適用した. 本当は XCode の libc++ を使えればもっと話が早いけれど,clang 3.4 が XCode の libc++ の [[noreturn]] アトリビュートまわりでエラーを吐いたので,自前で libc++ をビルドすることにした. 一応プルリクエストを書いたけど,「libc++ は XCode と重複してるから駄目!」とか言われそうな気もする.

今すぐインストールしたい人は次のコマンドで一発でインストール出来る.Homebrew 便利.

$ brew install https://raw.github.com/rhysd/homebrew/13dbf9d3af83297eec66eeee8e579d82ab598da2/Library/Formula/llvm.rb --HEAD --with-clang --with-libcxx --disable-assertions

Homebrew に libc++ を入れたいという話や llvm を libc++ 込みでビルドしたいという話は何度か issues に上がっているものの,libc++ の重複とか llvm.rb の中に libc++ を含めるかどうかで議論になって結局うやむやになってしまっていたので今回は自分が書いてみた.

XCode の clang はバージョニングが Apple 独自のものになっていて,何をどこまで実装しているのかが分からないのをどうにかしてくれれば,わざわざビルドしなくてもそっちを使うんだけれど…(どこかに載っていたら教えてほしいです)