CentOS 7 (rootなし) でLLVM 15をビルドする方法

入ってるパッケージが諸々古すぎるので、周辺のライブラリのビルドから始める必要がある。

そのへんを自動でやってくれるようにシェルスクリプトにまとめた。 /tmp に tmpfs がいなかったり、ホームディレクトリが NFS だったりする環境のものなので、_build_dir 系の変数は変更して使ったほうがいいと思う。

ビルド手順

まず、標準で入っている GCC は LLVM をビルドするには古すぎるので、GCC のビルドから始める必要がある。 古い LLVM から徐々にバージョンアップしていく方法でもいいが、最新の GCC はビルドできるので。ついでに GCC も最新にしてやる方が首尾が良いと思う。

で、最新の GCC をビルドするには周辺のライブラリが古すぎるので、最初にとりかかるべきはこれらのビルドということになる。 具体的には、GMP と MPFR、MPC をビルドする必要がある。

GMP のビルド

普通に tarball を落としてきて configure からの make で OK。 configure するときに、--prefix をインストールしたいディレクトリに変更する。

MPFR のビルド

これも configure からの make で OK。

MPC のビルド

適当に RPATH を埋め込んでほしいので、環境変数 LD_RUN_PATH を他のライブラリ群をインストールしたディレクトリに設定して export しておく。

MPC は MPFR に依存しているので、configure するときに --with-mpfr で MPFR をインストールした prefix を指定する。 あとは make からの make install で OK。

GCC のビルド

LD_RUN_PATH はさっきと同じ感じで。

GCC は out-of-source ビルドしかサポートしていないので、適当なビルドディレクトリを作り、そこから configure スクリプトを実行する。 configure 時に --with-gmp, --with-mpfr, --with-mpc でそれぞれインストールしたディレクトリを指定する。 これは任意だが、--enable-languages=c,c++ とかを指定しておくとビルド時間を短縮できると思う。

あとは make して make install すれば OK。

LLVM のビルド

GCC は 32 ビットのライブラリを $prefix/lib に、64 ビットのライブラリを $prefix/lib64 に置くので、 LD_RUN_PATH に両方を含める必要がある (export LD_RUN_PATH="$prefix/lib:$prefix/lib64" とか)。 あとは環境変数 CCCXX をさっきビルドした GCC に向けておく。 そうしないと CMake は PATH にあるコンパイラではなくシステムにインストールされた (/usr/bin とかにある) コンパイラを使おうとしてしまうらしかった。

あとは CMake での Makefile の生成時に -DLLVM_ENABLE_PROJECTS とかでビルドするプロジェクトを絞るとか。 今回は clang と clangd があればいいやということで clang;clang-tools-extra を指定した。 あとは -DCMAKE_BUILD_TYPE とか -DCMAKE_INSTALL_PREFIX とかを適当に設定して Makefile を生成してビルドする。

こいつはかなりメモリを喰うらしくて、並列ビルドだと途中でメモリを喰いつくして死んでいた。

これがビルドできたら適当に RPATH が設定された GCC と Clang が使えるようになっている。