Mac OSX 10.6 に、llvmとclangをインストール

# http://clang.llvm.org/get_started.html
mkdir llvm
cd llvm
svn co http://llvm.org/svn/llvm-project/llvm/trunk trunk
cd trunk/tools
svn co http://llvm.org/svn/llvm-project/cfe/trunk clang # version 3.1
cd .../projects
svn co http://llvm.org/svn/llvm-project/compiler-rt/trunk compiler-rt

#buildする際は、別途出力用ディレクトリを用意するのが推奨らしいので
cd ../../../ #llvmのあるディレクトリまで移動
mkdir build
cd build
../llvm/trunk/configure --enable-optimized #デフォルトはDebugビルドらしいのでReleaseビルドにする.
make -j4 #-jnのnの数だけ並列でビルドするらしい.

libLLVMSupport.aの生成に失敗してビルドが終了した。正確に言うと、生成はできているけれど不完全で、makeを続けると、ldが`archive has no table of contents'のエラーを吐くようになる。色々調べた結果として、ranlibへのパスが通っていなかった事が原因らしい。自分の環境では、ranlibは`/Developer/usr/bin'の中にあるので環境変数に追加する。

export PATH=/Developer/usr/bin:$PATH

make -j4
make check-all # 回帰テスト ここで失敗しなければちゃんとbuildできているはず…なので

#sudo make install-clang
#sudo make install-libs

以上で、llvmとclangのビルドとインストールは成功しているはず……なので、libc++をビルドする。

# http://libcxx.llvm.org/

export PATH=/path/to/build/Release+Asserts/bin:$PATH #clang, clang++へのパスを通す.

curl -O http://home.roadrunner.com/~hinnant/libcppabi.zip # libc++をbuildするために必要
unzip libcppabi.zip
sudo cp cxxabi.h /usr/include
sudo cp libc++abi.dylib /usr/lib
svn co http://llvm.org/svn/llvm-project/libcxx/trunk libcxx
cd libcxx/lib
export TRIPLE=-apple-
export MACOSX_DEPLOYMENT_TARGET=10.6
./buildit

iostream.cppのビルドでアサーションにひっかかってこけた。

手詰り感ぱないのでllvmとclangをSVNのtrunkではなくて配布されているアーカイブからビルドする。さようなら、constexpr。

curl -O http://llvm.org/releases/3.0/llvm-3.0.tar.gz
curl -O http://llvm.org/releases/3.0/clang-3.0.tar.gz
tar zxvf llvm-3.0.tar.gz
tar zxvf clang-3.0.tar.gz
mv llvm-3.0.src llvm
mv clang-3.0.src llvm/tools/clang
mkdir build
cd build
../llvm/configure --enable-optimized
make -j4
make check-all

ここまでやった上で3.0のclangにパスを通しlibc++のビルドを実行するとうまくいく。svnのtrunkの3.1がまだ上手く動かないのか、配布バイナリのオプションにアサーションを付加していないから、3.0でもアサーションを付けるとコケるのかは調べてない(ビルド長いの……)

/path/to/llvm/configure --enable-optimized --enable-assersions 
make -j4

でllvmとclangをビルド仕直してから、libc++をビルドしたらうまくいったので、多分svnのtrunkがまだ不完全なのではないかな。もう面倒だからこれ以上は調べない。

ビルドに成功したので、

cd /usr/lib
sudo ln -sf /path/to/libcxx/lib/libc++.1.dylib libc++.1.dylib
sudo ln -sf libc++.1.dylib libc++.dylib
cd /usr/include/c++
sudo ln -sf /path/to/libcxx/include v1

とした上でlibc++のテスト

cd /path/to/libcxx/test
export OPTIONS="-std=c++0x -stdlib=libc++ -U__STRICT_ANSI__ -D__STDC_FORMAT_MACROS"
./testit


In file included from version.pass.cpp:12:
/usr/include/c++/v1/atomic:535:2: error: #error <atomic> is not implemented
#error <atomic> is not implemented

はい、は未実装ですね。わかります。というか、いくつかのテストは失敗する。