公開日: 2023年11月30日 / 最終更新日: 2024年10月14日

FreeBSD で Raspberry Pi Pico SDK をビルドする

Raspberry Pi Pico (以下 Pico) 公式の SDK (pico-sdk) およびサンプルプログラム (pico-examples) はいまのところ利用する予定はありませんが、資料としては第一級であり大いに参考になると思います。そこで、これらをビルドして実行できる開発環境を作っておくことにします。ビルドにあたっては libstdc++ というライブラリが必要です。これを、以前別の記事で FreeBSD 上に構築したクロス開発環境に追加インストールします。

libstdc++ のありか

pico-sdk と pico-examples のビルド方法は Raspberry Pi 公式のドキュメント Getting started with Raspberry Pi Pico-series に簡潔に書かれています。ただ一点、よくわからないところがあって、2.2 節 Install the Toolchain に「Ubuntu や Debian では libstdc++-arm-none-eabi-newlib もインストールせよ」との記載があります。なんぞこれ?? FreeBSD の ports/packages を検索してもそれらしいものは見当たりません。「FreeBSD は Ubuntu や Debian ではないから、既にインストールされているのかな?」と都合よく考えて pico-examples のビルドを強行しても返り討ちに遭います。いろいろ調べたところ、灯台下暗しとでもいいますか、GCC のソースコードに同梱されていることがわかりました。

libstdc++ のビルドとインストール

という訳で、既にインストール済みのクロス開発用 GCC と同様にして libstdc++ もビルドとインストールを行います。クロス開発用 GCC のビルドとインストールについては次の記事を参照してください。

この記事の手順と同じように GCC のソースコード取得から configure スクリプトの実行まで行います (前回の作業結果が残っていれば、この作業は不要です)。ビルド用のディレクトリやインストール先ディレクトリも前回と同じです。また、configure のオプションはとりあえず GCC をビルドしたときと同じにしていますが、これで必要十分かは精査していません。

% cd ~/pico/arm-none-eabi-build/
% wget https://ftp.gnu.org/gnu/gcc/gcc-13.2.0/gcc-13.2.0.tar.xz
%tar Jxf gcc-13.2.0.tar.xz
% cd ~/pico/arm-none-eabi-build/gcc-build
% ../gcc-13.2.0/configure --target=arm-none-eabi --prefix=/home/mijinco/pico/arm-none-eabi --with-cpu=cortex-m0plus --enable-languages=c,c++ --without-headers --with-newlib --with-no-thumb-interwork --with-mode=thumb

あとは次のようにしてビルドとインストールを行います。

% gmake all-target-libstdc++-v3 install-target-libstdc++-v3

libstdc++ のインストール前後でインストール先ディレクトリ (上記の例では ~/pico/arm-none-eabi/) の内容を比較したところ、次のように更新と新規作成が行われていました。ぱっと見た感じ、問題なさそうかなと思います。

  • [新規] arm-none-eabi/include/c++/
  • [新規] arm-none-eabi/include/c++/
  • [新規] arm-none-eabi/lib/arm/autofp/v5te/fpu/libstdc++.*
  • [新規] arm-none-eabi/lib/arm/autofp/v5te/fpu/libstdc++exp.*
  • [新規] arm-none-eabi/lib/arm/autofp/v5te/fpu/libsupc++.*
  • [新規] arm-none-eabi/lib/thumb/autofp/v7/fpu/libstdc++.*
  • [新規] arm-none-eabi/lib/thumb/autofp/v7/fpu/libstdc++exp.*
  • [新規] arm-none-eabi/lib/thumb/autofp/v7/fpu/libsupc++.*
  • [新規] arm-none-eabi/lib/thumb/libstdc++.*
  • [新規] arm-none-eabi/lib/thumb/libstdc++exp.*
  • [新規] arm-none-eabi/lib/thumb/libsupc++.*
  • [更新] lib/gcc/arm-none-eabi/13.2.0/arm/autofp/v5te/fpu/libgcc.a
  • [更新] lib/gcc/arm-none-eabi/13.2.0/arm/autofp/v5te/fpu/libgcov.a
  • [更新] lib/gcc/arm-none-eabi/13.2.0/thumb/autofp/v7/fpu/libgcc.a
  • [更新] lib/gcc/arm-none-eabi/13.2.0/thumb/autofp/v7/fpu/libgcov.a
  • [更新] lib/gcc/arm-none-eabi/13.2.0/thumb/libgcc.a
  • [更新] lib/gcc/arm-none-eabi/13.2.0/thumb/libgcov.a
  • [更新] lib/gcc/arm-none-eabi/13.2.0/libgcc.a
  • [更新] lib/gcc/arm-none-eabi/13.2.0/libgccov.a
  • [新規] share/gcc-13.2.0/

picotool のビルドとインストール

Pico SDK の古いバージョンでは、ELF ファイルから UF2 ファイルへ変換するのに elf2uf2 というツールを使っていました (過去記事「Raspberry Pi Pico の L チカプログラムをビルドして動かす」参照)。Pico SDK 2.0 からは elf2uf2 に代わり picotool という新しいツールを使うようになったようです。というわけでこれもビルドしてインストールします。なお、picotool を FreeBSD でビルドする際にいくつか問題がありました。補足をご覧ください。

では実際の手順です。だいたい [1] に書かれている手順にしたがっています。なお、リポジトリのクローン先を ~/pico/repo/、インストール先を ~/pico/tools/ としています。

% cd ~/pico/repo
% git clone https://github.com/raspberrypi/picotool.git
% cd picotool
% mkdir build; cd build
% export PICO_SDK_PATH=../../pico-sdk
% cmake -DCMAKE_INSTALL_PREFIX=~/pico/tools -DPICOTOOL_FLAT_INSTALL=1 ..
% gmake install

pico-sdk と pico-examples をビルドする

それでは前出の Getting started にしたがって pico-sdk と pico-examples をビルドしてみましょう。あらかじめ CMake を ports/packages からインストールしておいてください。

まずはソースコードを取得します。clone 先は ~/pico/repo/ としています。

% cd ~/pico/repo/
% git clone https://github.com/raspberrypi/pico-sdk.git --branch master
% cd pico-sdk
% git submodule update --init
% cd ..
% git clone https://github.com/raspberrypi/pico-examples.git --branch master

ちなみに Pico SDK をアップデートするときは次のようにします。

% cd ~/pico/repo/
% git pull
% git submodule update

ビルド用の作業ディレクトリを作ります。また、pico-sdk ディレクトリへの パスを環境変数 PICO_SDK_PATH にセットおきます。

% cd pico-examples
% mkdir build
% cd build
% export PICO_SDK_PATH=../../pico-sdk

CMake を実行し、その後試しに blink (L チカ) を選んでビルドします。cmakeコマンドを実行する際、picotool_DIRの値に picotool へのパスを指定します。

% cmake -Dpicotool_DIR=~/pico/tools/picotool ..
% cd blink
% gmake

ビルドに成功すると blink.uf2 が出力されます。あとはこのファイルをこれまでと同様にして Pico に書き込み、LED がチカチカすることを確認します。

補足: picotool を FreeBSD でビルドする場合の問題点

環境によっては発生しないかもしれませんが、おもに下記の 3 つの問題点があります。

1. 「__taple_なんちゃら.h がない」といわれる

これは FreeBSD をアップデートする際に当該ファイルが壊れてしまうことがある?ためのようです。暫定対策については次の記事を参照してください。

2. 「be16toh 等のマクロが再定義されている」といわれる

picotool のソースコードの elf/portable_endian.h に修正が必要です。公式リポジトリに修正方法が示されています。develop ブランチにはコミットされているので、いずれ master ブランチでも修正されると思います。

3. <cuchar> をインクルードしないようにする

これは私の環境 (FreeBSD 13.3-R) では発生しなかったので、詳細はよくわかりません。13.2-R 以前で発生する問題のようです。これも上記 2. と同じコミットハッシュで修正されているので、修正方法はそちらを参照してください。

参考資料

Raspberry Pi Pico 実験室