Raspberry PiでのLLVMツールチェインのビルド
aptでインストールしたClang / LLVMで最新のLLVMツールチェインをビルドする前提です。
$ sudo apt install binutils cmake clang libc++-dev libc++abi-dev llvm ninja -y
で必要なツールをインストール。あとまだ追加でライブラリが必要かもしれませんが適宜必要に応じて入れてください。
以下環境変数の設定
$ export CC=clang \
$ export CXX=clang++ \
$ export AR=llvm-ar
$ export AS=llvm-as
$ export LD=ld.lld
$ export NM=llvm-nm
$ export RANLIB=llvm-ranlib
$ export STRIP=llvm-strip
$ export OBJCOPYY=llvm-objcopy
$ export OBJDUMP=llvm-objdump
$ export READELF=llvm-readelf
$ export C_FLAGS="-O3 -mcpu=native -pipe" \
$ export CXX_FLAGS="-O3 -mcpu=native -pipe" \
$ export LDFLAGS=""
LLVMのソースフォルダの名前がllvm-project-15.0.3.srcだとして
$ cd llvm-project-15.0.3.src/
$ mkdir build && cd build
$ cmake -G Ninja \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_INSTALL_PREFIX=/usr/local \
-DLLVM_BINUTILS_INCDIR=/usr/include/ \
-DBUILD_SHARED_LIBS=OFF \
-DLLVM_BUILD_LLVM_DYLIB=OFF \
-DLLVM_CCACHE_BUILD=ON \
-DLLVM_ENABLE_LIBCXX=ON \
-DLLVM_ENABLE_LLD=ON \
-DLLVM_ENABLE_LTO=Thin \
-DLLVM_ENABLE_PIC=ON \
-DLLVM_INSTALL_UTILS=ON \
-DLLVM_LINK_LLVM_DYLIB=OFF \
-DLLVM_PARALLEL_COMPILE_JOBS=4 \
-DLLVM_PARALLEL_LINK_JOBS=2 \
-DLLVM_ENABLE_PROJECTS="bolt;clang;clang-tools-extra;cross-project-tests;libclc;lld;polly;pstl" \
-DLLVM_ENABLE_RUNTIMES="compiler-rt;libc;libcxx;libcxxabi;libunwind" \
-DLLVM_ENABLE_THREADS=ON \
-DLLVM_TARGET_ARCH=AArch64 \
-DLLVM_TARGETS_TO_BUILD=AArch64;ARM \
../llvm
でビルドの準備が出来るので
$ ninja
$ sudo ninja install
でビルド、インストール。
以下各項目解説:
-DCMAKE_BUILD_TYPE=Release
よくReleaseじゃなくてDebugを指定してる例がありますが、LLVMの開発者じゃなければDebugを指定するとビルドに時間がかかる上遅いバイナリが出来るはすなのでReleaseにしておいた方がいいと思います。
-DCMAKE_INSTALL_PREFIX=/usr/local
インストール先の指定。
-DLLVM_BINUTILS_INCDIR=/usr/include/
LLVMでLTOを使えるようにするのにbinutilsのヘッダを指定する必要があるそうで、sudo apt install binutils
でインストールした場合のヘッダは/usr/includeにあります。
-DBUILD_SHARED_LIBS=OFF
-DLLVM_BUILD_LLVM_DYLIB=OFF
Shared LibraryをビルドするならBUILD_SHARED_LIBSを有効にしそうなものだけど、開発者じゃなくただ使うだけならLLVM_BUILD_LLVM_DYLIBの方をONにしろとのこと。
特に必要なく、またリンクに大量の時間がかかるのでOFFで。
-DLLVM_CCACHE_BUILD=ON
ビルド時にcccacheを有効にするか。必要に応じて有効にしてください。
-DLLVM_ENABLE_LIBCXX=ON
libc++を使ってビルドするか。 ONで。
-DLLVM_ENABLE_LLD=ON
ビルド時のリンカにLLDを使用するか。ONで。
-DLLVM_ENABLE_LTO=Thin
ビルド時Link Time Optimizationを適用するか。適用したほうが速いバイナリが出来ると思いますが、リンクに時間がかかったりリンク時に必要なRAMの容量が多くなるためリンクがうまくいかなければスワップを増やすかOFFにしてください。
-DLLVM_ENABLE_PIC=ON
Position Independent Codeの設定なのでONで。
-DLLVM_INSTALL_UTILS=ON
ユーティリティをインストールするか。不要である確信があればOFFで良いと思います。
-DLLVM_LINK_LLVM_DYLIB=OFF
Shared Libraryにリンクするかですが、なぜかONだとリンクに失敗したのでOFFにしました。
Shared Libraryをビルドする意味があまりないのでShared LibraryへのリンクもOFFで。
-DLLVM_PARALLEL_COMPILE_JOBS=4
並列で走るコンパイルのスレッド数。ラズパイは4コアなので4。
-DLLVM_PARALLEL_LINK_JOBS=2
並列で走るリンクの数。4で走らせるのがいちばんはやいと思いますがラズパイのRAM容量次第ではメモリが足りなくてエラーになるのでその場合はスワップを増やすかこの値をちいさくしてください。
-DLLVM_ENABLE_PROJECTS="bolt;clang;clang-tools-extra;cross-project-tests;libclc;lld;lldb;polly;pstl" \
-DLLVM_ENABLE_RUNTIMES="compiler-rt;libc;libcxx;libcxxabi;libunwind" \
ビルドするプロジェクト、ランタイムの指定。基本的には全部有効にしておいた方が後からやり直しがなくて良いと思います。不要なプロジェクトに確信がある時だけ不要な所を削ってください。
-DLLVM_ENABLE_THREADS=ON
スレッドの有効化。ONで。
-DLLVM_TARGET_ARCH=AArch64
対象のアーキテクチャ。64bit OSラズパイ前提なのでAArch64。32bit OSならARMを指定してください。
-DLLVM_TARGETS_TO_BUILD=AArch64;ARM
ビルドするLLVMで対応するアーキテクチャ。基本的にはLLVM_TARGET_ARCHと同じで大丈夫ですが、もし出来上がったLLVMでkernelをビルドする予定があればARMも指定しておいたほうが良いです。
以上がビルドを通して、正常に動作させるための必要性低減の設定です。ビルドはラズパイ4Bで1日くらいかかります。おつかれさまでした!
Discussion