久々に作業を行ったので記録として残しておきます。
試用環境はUbuntu16.04.2LTSです。
デフォルトのClangは3.8でした。
まずソースをリポジトリより取得します。
$ mkdir clang
$ cd clang
$ sudo apt-get build-dep -y llvm clang
$ svn co http://llvm.org/svn/llvm-project/llvm/trunk llvm$ cd llvm/tools
$ svn co http://llvm.org/svn/llvm-project/cfe/trunk clang
$ cd clang/tools
$
svn co http://llvm.org/svn/llvm-project/cfe/trunk clang
$ cd ../../../projects
$ svn co http://llvm.org/svn/llvm-project/compiler-rt/trunk compiler-rt
$ cd ../..
ビルド用のディレクトリを作成してcmakeでMakefile作成し、ビルドします
$ mkdir llvm.build
$ cd llvm.build
$ cmake -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr/local ../llvm
$ make
ビルドが私のマシンが非力なのか大体8時間15分ほど時間がかかりました。寝る前に流して朝起きるとまだビルドが75%程で仕方ないのでそのままPCをつけたまま出かけました。
さて動作確認です。
/usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.23' not found (required by <new software>)
あれ?どうやらライブラリがないと言われている様です。
現在のライブラリを以下のコマンドで確認すると確かに該当バージョンが含まれていません。
$ strings /usr/lib/x86_64-linux-gnu/libstdc;;.so.6 | grep GLIBCXX
調べるとそのライブラリはgccをビルドすると含まれているそうです。
よかったこの間gcc7.1.0をビルドしたばかりで既にビルドした物が手元にあります。
$ cd gcc/build
$ find ./ -name "libstdc++*"
"./x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.23"
このファイルのようです。
現在の環境のものをリネームしてこのファイルに置き換える作業をします。
$ sudo cp ./x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.23 /usr/lib/x86_64-linux-gnu/
$ sudo cp libstdc++.so.6.0.23
$ sudo mv libstdc++.so.6 libstdc++.so.6.bak
$ sudo ln -s libstdc++.so.6.0.23 libstdc++.so.
$ ls -lsta libstdc++*
権限を他のものと揃えて終わります。
$ sudo chmod 644 libstdc++.so.6.0.23
これで一応clangが動作するようになりました。