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

STM32 Nucleo BoardでMicropythonを楽しむ

Micropythonをビルドしてボードにインストールする

はじめに

遅ればせながらMicropythonに興味が出てきた。まずはSTマイクロエレクトロニクスのSTM32 Nucleo BoardにMicropythonを入れて動かすことからを始める。

使用したボード

STM32 Nucleo Board STM32F446RET

主なCPUの仕様

  • CPU:STM32F446RET6

  • CPUコア:ARM32bit Cortex-M4(+FPU)

  • 周波数:最大180MHz

  • フラッシュ:512KB

  • SRAM:128KB+4KB(Backup)

購入先

秋月電子

ソースからコンパイルする

開発環境 *1

必要な開発ツール *1

Micropythonのビルドに必要な開発ツール

  • git
  • gcc (cross compiler)
  • build-essential
  • cmake (3.4.2 or later)
  • pkg-config
  • libusb-1.0

そのほか

  • screen or picocom などのターミナルソフト

パッケージのインストール *3

私の環境では以下のパッケージをインストールした。足りないパッケージをインストールする

sudo apt-get install libffi-dev
sudo apt-get install gcc-arm-none-eabi
sudo apt-get install cmake
sudo apt-get install libusb-1.0.0-dev
sudo apt-get install screen

書き込みユーティリティ *1 *3

ビルドしたmicropythonのバイナリをボードに書き込むツールStlink Toolsをビルドする。すべてのユーザが使えるようにインストールする場合である。

git clone https://github.com/texane/stlink.git
cd stlink
make release
make debug
cd build/Release
sudo make install
sudo ldconfig

ビルド *2

ここでMicropythonをソースからビルドする。対象とするボードに合わせてmakeするが、どのボードが対応しているかは、treeコマンドを実行するとわかる。自分のボードにあったボード名でビルドする

# get source
git clone https://github.com/micropython/micropython
# This command should be executed from the root directory of this repository.
cd micropython
make -C mpy-cross
# All other commands below should be executed from the ports/stm32/ directory.
cd ports/stm32/
make submodules
# this command to find your board 
tree -d boards/
# select board name & exectute make
make BOARD=NUCLEO_F446RE
# write binary to flash ram on board, use stlink tool
sudo make BOARD=NUCLEO_F446RE deploy-stlink

テスト *2

PC上のubuntuからターミナルソフトを使ってボード上のMicropythonにアクセスする

screenの場合

# ctl+ a, k でターミナル終了
sudo screen /dev/ttyACM0 115200

picocomの場合

# ctl+a, ctl+x でターミナル終了
sudo picocom --b 115200 /dev/ttyACM0

参考文献

*1 compilling.md

*2 README.md

*3 寝台急行はまなす

ブログをはじめるにあたって

 コンピュータやその周辺の新しい技術に興味があるので、この分野で自分が楽しいと感じてはじめたことや調べたことについて書いていこうと思います。特に今はシングルボードコンピュータFPGAなどに興味があります。

 このブログをはじめようと思ったきっかけは月並みな理由ですが、今まで他の人の情報をもらってばかりでいた自分が少しでも他の方に役立てればいいなと思ったことと、自分がやったことを少しでも記録に残したいと思ったからです。まだはじめたばかりでうまく書けるかわかりませんし、いつまで続くかもわかりませんが、思い立った時に少しずつ書いていこうと思います。