RustでRaspberry Piの開発をするにあたってプロジェクト雛形が欲しいなと思ったので、Nix flakesで作っておこうと思います。
Nix flakesについては以下の記事で導入の紹介をしていますので、そちらを参照ください。
Nixpkgsを使ったRustの開発環境自体は以下のChip8エミュレータなどでも使っているように、rustcなどの必要なパッケージを指定すれば比較的簡単に構築できます。
なおNix flakesではtemplate機能があり、 nix flake show templates
で公式が配布しているtemplateを参照できます。
これらは、あくまでもサンプル的な位置付けのようですが、 nix flake init --template 'templates#rust'
などとするとそれを利用してflake.nixを作成することもできます。
今回はクロスコンパイルでRaspberry Pi Picoに対する開発環境ということで、probe-rsによるDebug Probeの利用、flip-linkをlinkerに利用するなど、組込みクロスコンパイル環境を構築していきます。
以前Rusty Keysプロジェクトを参考に、Rustの開発環境構築をやってみましたが、今回はこれをNix flakesを使ってやってみようと思います。
Raspberry Pi Debug Probeと環境セットアップ
前回はRaspberry Pi Picoをデバッグプローブとして利用しましたが、今回は「Raspberry Pi Debug Probe」(以下Debug Probe)を利用します。
Debug Probeは公式から2023年2月に発売されたデバッグプローブです。
Raspberry Pi デバッグプローブ — スイッチサイエンス
機能はPicoで代用している場合と同等ですが、ケース付きでコンパクトになっており、各種ケーブルも同梱されているので私はこちらを利用しています。
公式ドキュメントも充実しており、firmwareも以下のGithubから適宜ダウンロードしてアップデートすることが可能です。
Raspberry Pi Debug Probe - Raspberry Pi Documentation
接続はこのような感じです。
なおホストには以前セットアップしたRaspberry Pi 5を使っています。
probe-rsやflip-linkのインストール
RustyKeyでも使っていた probe-rs
や flip-link
はRustプロジェクトのrunnerやlinkerとしてCLIから利用されます。
NixOS環境では実行ファイルはNixのderivationになっている必要があるので、cargo経由でインストールしても実行できません。 他のLinux Distroであればランタイム依存がなければ実行はできますが、Nixで管理しているパッケージとの依存もありますし、Nixのポリシーに従って管理している方が取り回しがよいので、flake.nixでインストールします。
|
|
rust-overlayでrustupの機能を利用する
Nixpkgsを利用していなければrustupでtargetのツールチェインをインストールしますが、Nix環境ではrustupでやっているようなことはNixで処理します。 そのため、rustのツールチェインをカスタマイズするためにoverlayを利用します。
非公式ですが、NixにはRustツールチェインのoverlayがいくつかあります。今回私はrust-overlayを利用します。
rust-overlayでは、rustupが提供している以下のような機能を利用することができます。
- Overrides - The rustup book:betaやnihgtlyといったツールチェインのoverride
- Components - The rustup book:rustfmtなどのcomponentのインストール
- Cross-compilation - The rustup book:クロスコンパイラのインストール
overlayを利用して、Pico向けのターゲットである thumbv6m-none-eabi
をインストールします。
|
|
ついでに必要となるcomponentもインストールしています。
まとめ
結果的にはrust-overlayを利用することで、シンプルかつ簡単にプロジェクトを構築することができました。
以下のようにNix自体にもRustに限らずクロスコンパイルをするための環境を作る方法があるので、試したりしていたのですがflake.nixが結構複雑になった上に最終的に狙ったように動作させることはできませんでした。
Cross compilation — nix.dev documentation
Rustの場合は自身のエコシステムでクロスコンパイラの提供をしているので、rust-overlayを使っていく方が筋がよかったのだろうと思います。
構築したプロジェクトは以下のようになりました。