Raspberry PI OS (64-bit) で最新のClangを使う


Raspberry PI OS (64-bit) で最新のClangを使う

 すでにいろいろなところで同じ内容のことが書かれていると思うが、数年ぶりに自分で実施したのでここに記載する。

公式のclang+llvmを使う

 ここではArch64のClang+llvmのバイナリをこちらからダウンロードする。これを記載時の最新版は15.0.1なので、clang+llvm-15.0.1-aarch64-linux-gnu.tar.xzをダウンロードした。

バイナリのダウンロード

 以下のような方法でダンロードしたファイルを展開する。

$ mkdir workplace && cd workplace
$ tar -Jxvf clang+llvm-15.0.1-aarch64-linux-gnu.tar.xz

バイナリの移動

 展開したバイナリを好きな場所に移動する。

$ sudo mv clang+llvm-15.0.1-aarch64-linux-gnu /usr/local/clang-15.0.1-official

環境変数の設定

 このままではコンパイラを実行できないので、シェルの環境変数の$PATHと$LD_LIBRARY_PATHにパスをセットする。

 以下のコマンドまたはエディタでパスを追加する。ただ記載を間違えたときは、間違っていた箇所を修正してもう一度sourceコマンドを実行するのではなく、いったんログアウトしてログインし直す。

$ cd ~
$ echo 'export PATH=/usr/local/clang-15.0.1-official/bin:$PATH' >> .bashrc
$ echo 'export LD_LIBRARY_PATH=/usr/local/clang-15.0.1-official/lib:$LD_LIBRARY_PATH' >> .bashrc
$ source ~/.bashrc

パスの確認

 最後にパスが通っているか確認する。

$ which clang
/usr/local/clang-15.0.1-official/bin/clang

自分でclangをビルドする

 前述の公式からダウンロードしたバイナリをそのまま使ってもよいが、やはり自分でビルドしないと気持ちがわるいので、次に説明する方法でビルドすることにした。

ninjaのビルド

 clangをビルドにするにはninjaが必要なので、はじめにninjaが使えるようにする。ビルドの方法はソースファイルのREADME.md にすべて書いてあるが、以下にcmakeを使う方法の抜粋を記載する。

ソース

$ cd ~/workplace
$ git clone https://github.com/ninja-build/ninja.git

Cmake&ビルド

$ cd ninja
$ cmake -Bbuild-cmake
$ cmake --build build-cmake
$ make

テスト

ビルドした結果を以下の方法でチェックすることができる。

$ ./build-cmake/ninja_test

インストール

いつも通りインストールする。デフォルトのインストール先は/usr/local/binでした。

$ sudo make install
$ sudo ldconfig

clangのビルド 1回目

ソース

$ git clone https://github.com/llvm/llvm-project.git
$ cd llvm-project
$ git tag -l

Cmake

 今回のビルドの条件は以下のオプションの通りで、clangだけでなく、libcxx、libcxxabi、lldも同時にビルドする。インストール先は/usr/local/clang-15.0.1-1stである。

$ CC=/usr/local/clang-15.0.1-official/bin/clang CXX=/usr/local/clang-15.0.1-official/bin/clang++ cmake -G Ninja -DLLVM_ENABLE_PROJECTS="clang;libcxx;libcxxabi;lld" -DCMAKE_INSTALL_PREFIX=/usr/local/clang-15.0.1-1st -DCMAKE_BUILD_TYPE=Release -DLLVM_ENABLE_ASSERTIONS=On -DLLVM_ENABLE_TERMINFO=OFF -DLLVM_TARGETS_TO_BUILD=AArch64 ../llvm

ビルド&インストール

$ ninja -j$(nproc)
$ sudo ninja install
$ sudo ldconfig

環境変数の設定

シェルの環境変数をいまビルドしたclangをインストールしたパスに変更し、環境変数を反映する

PATH=/usr/local/clang-15.0.1-1st/bin:$PATH
LD_LIBRARY_PATH=/usr/local/clang-15.0.1-1st/lib:$LD_LIBRARY_PATH

clangのビルド2回目

Cmake

先ほどビルドしたファイルを削除してもう一度ビルドし直す。ビルドの条件はインストール先以外は同じである。

$ cd ~/workplace/llvm-project
$ rm -rf build #前回の削除
$ mkdir build && cd build
$ CC=/usr/local/clang-15.0.1-1st/bin/clang CXX=/usr/local/clang-15.0.1-1st/bin/clang++ cmake -G Ninja -DLLVM_ENABLE_PROJECTS="clang;libcxx;libcxxabi;lld" -DCMAKE_INSTALL_PREFIX=/usr/local/clang-15.0.1 -DCMAKE_BUILD_TYPE=Release -DLLVM_ENABLE_ASSERTIONS=On -DLLVM_ENABLE_TERMINFO=OFF -DLLVM_TARGETS_TO_BUILD=AArch64 ../llvm

ビルド&インストール

$ ninja -j$(nproc)
$ sudo ninja install
$ sudo ldconfig

環境変数の設定

シェルの環境変数をいまビルドしたclangのパスに変更する

PATH=/usr/local/clang-15.0.1/bin:$PATH
LD_LIBRARY_PATH=/usr/local/clang-15.0.1/lib:$LD_LIBRARY_PATH