【2024年】AVR-Rust 開発環境構築 1 (Rust nightly コンパイラ, avr-gcc 編)

# 1: はじめに

基本的には、公式ガイドブックの通りに進めることで、環境を構築することができますが、一部つまづきポイントがありました。
Rustup や avr-gcc がインストールできれば、どの OS でも同じようなコマンドで操作できます。


* AVR-Rust 環境構築 関連記事
  1. 本記事（Rust nightly コンパイラ, avr-gcc 編）
  1. [ruduino, ATmega328P 編](https://qiita.com/BerandaMegane/items/24aa106179eac2f3e639)
  1. [avr-hal, atmega-hal, ATmega 編](https://qiita.com/BerandaMegane/items/8d92111170d78d9343ad)

## 1-1: 本資料を活用できる対象者

Rust が初めてでも、ガイドブック読みながらコマンド操作できれば問題ありません。

* AVR マイコンを C/C++ でプログラミングしたことがある方
* シェルやコマンドプロンプトでのコマンド操作にある程度慣れている方

## 1-2: これから構築する環境

* Rustup
  * Rust コンパイラやパッケージマネージャをまとめてインストールしてくれるパック
  * https://www.rust-lang.org/ja/tools/install
* avr-gcc
  * https://gcc.gnu.org/wiki/avr-gcc

avr-gcc は、AVR マイコンを C/C++ でプログラミングする際に必要なコンパイラです。
Linux で AVR マイコンをプログラミングする際には、おなじみのツールかと思われますが、Windows の方は Arduino IDE や Atmel Studio をインストールすると勝手にインストールされるので、意識したことはないかもしれません。

# 2: 作業手順

今回は Ubuntu on WSL2 と Windows 11 で動作を確認しています。

## 2-1: WSL2 インストール (省略可能)

Ubuntu on WSL2 で環境を構築したい方は、WSL2 を有効化し、Ubuntu をインストールしてください。作業手順に関しては省略します。

本資料を記述するにあたって、まっさらな環境で動作確認するため、Ubuntu を追加インストールしています。
追加インストール方法に関しては、次のブログが大変参考になりました。ありがとうございました。

[goodbyegangsterのブログ - WSL にまっさらな新規の Ubuntu 環境をつくる](https://goodbyegangster.hatenablog.com/entry/2022/10/25/015309)

## 2-2: Rustup のインストール

Rustup とは、Rust 公式が提供する管理ツールです。次のような機能を持ちます。

* Rust 自体のバージョン管理（インストール・アップデート）
* パッケージマネージャ Cargo のインストール
* ツールチェインの管理

参考サイト: [Zenn - インストール後にrustupを使ってすること](https://zenn.dev/suauiya/books/ef2d2c67c546361e4518/viewer/4bc94a19cf74da37bf8f)

OS ごとにインストール方法が異なります。次のサイトにアクセスし、指示に従ってインストールしてください。

<https://www.rust-lang.org/ja/tools/install>

### Rustup インストール (Ubuntu on WSL2 の場合)
Windows Subsystem for Linux でのインストール方法に従って、コマンドでインストールします。
スクリーン上の説明に従って Rust をインストールしてください。

```:WSL2
$ curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

(省略)
Current installation options:

   default host triple: x86_64-unknown-linux-gnu
     default toolchain: stable (default)
               profile: default
  modify PATH variable: yes

1) Proceed with standard installation (default - just press enter)
2) Customize installation
3) Cancel installation

> (そのまま Enter)
```

### Rust での Hello World!
Rust を使用するのが初めてであれば、`$ cargo new hello` でプロジェクトを作成し、"Hello World!" を実行してみると良いと思います。
cargo によるプロジェクトの作成・ビルド・実行の感覚が学べます。
（私は C, Java, Python ぐらいしか経験がなかったため、新鮮な感覚でした）

参考 Qiita [RUSTの環境構築とHello,world!について by @Veritas666777(tomato 3世)
](https://qiita.com/Veritas666777/items/c01a0df0c9b97f6b2a95)

## 2-3: AVR-Rust のインストール

Rust で書かれたプログラムを AVR マイコンで動くようコンパイルするには、AVR-Rust をインストールする必要があります。

* AVR-Rust プロジェクト <https://github.com/avr-rust>
* AVR-Rust ガイドブック <https://book.avr-rust.org/>

AVR-Rust ガイドブックを参考に、インストールを進めます。

### nightly コンパイラのインストール 

AVR-Rust ガイドブック [2. Installing the compiler](https://book.avr-rust.org/002-installing-the-compiler.html) には、以下の記載があります。

```:Google翻訳
AVRサポート付きのRustを使用するには、いくつかのソフトウェアをインストールする必要があります

* AVRサポートが有効になっているRustコンパイラ
* コンパイラのソースコード
　これは、AVR が一般に互いに ABI 互換性がないため、libcore を遅延コンパイルする必要があるため必須であり、そのため、コンパイル時に対象となる AVR デバイス用にコア ライブラリを明示的にコンパイルする必要があります。

注 必要なサードパーティ製ツールも必ずインストールしてください。これにはリンカーが含まれます。
```

"AVRサポートが有効になっているRustコンパイラ" とは、Nightly コンパイラのことです。
Rust は3つのチャネルでリリースされています。 (参考: [Rust公式 - Channels](https://rust-lang.github.io/rustup/concepts/channels.html))

* stable: 安定版、通常はこちらをそのまま利用する
* beta: ベータ版
* nightly: 毎晩のように更新されている非安定版。AVR サポートが有効。 

AVR-Rust ガイドブック [Installing via Rustup (recommended)](https://book.avr-rust.org/002-installing-the-compiler.html#installing-via-rustup-recommended) を読むと、nightly のインストールを進めることになっていますが、後述の rust-toolchain.toml ファイルによるバージョン指定が非常に便利なので割愛します。

#### もしも、手作業でインストールするとき
動作確認が取れている nightly のバージョンを指定し、インストールします。（1分程度）
こちらの環境ではとりあえず、nightly-2024-04-23 で動作が確認できました。
```:Ubuntu
$ rustup toolchain install nightly-2024-04-23
$ rustup component add rust-src --toolchain nightly-2024-04-23
```

AVR-Rust ガイドブックでは、次のように最新版の nightly コンパイラをインストールしていますが、バージョンによっては動作しませんでした。

```:Ubuntu
$ rustup toolchain install nightly
$ rustup component add rust-src --toolchain nightly
```

## 2-4: avr-gcc 関連のインストール

AVR-Rust ガイドブック [2.1. Installing required third party tools](https://book.avr-rust.org/002.1-installing-required-third-party-tools.html#21-installing-required-third-party-tools) には以下の記載があります。

```:Google翻訳
AVR Rustを使用するには、多数のサードパーティ製ツールが必要です。

    avr-gcc (リンカー フロントエンドとしてのみ使用)
    avr-binutils (リンカーサポート用)
    avr-libc (デバイス固有のランタイム ライブラリ用)
    avrdude (実際の AVR チップをフラッシュするため)

これらは、オペレーティング システムのパッケージ マネージャーによってインストールされる必要があります。 
```

それぞれのツールをインストールしていきましょう。

### avr-gcc インストール (Ubuntu)

公式ガイドブックに記載の通り、いくつかのツールをパッケージマネージャでインストールします。WSL2 経由でマイコンに書き込まない場合、avrdude は必要ありません。

```:Ubuntu
$ sudo apt update
$ sudo apt install binutils gcc-avr avr-libc avrdude  # avrdude は必要に応じて追加
```

### avr-gcc インストール (Windows)

winget でインストールすることができます。

```:winget インストール
> winget install --id=ZakKemble.avr-gcc -e
> winget install --id=AVRDudes.AVRDUDE -e  # avrdude は必要に応じて追加
```

私の環境では、Arduino IDE と Atmel Studio をインストールしていたので、元々 avr-gcc.exe が存在しましたが、最新版ではないのでパスを通して使用するのはおすすめできません。

* Arduino IDE (avr-gcc 7.3.0)
  * `C:\Users\user\AppData\Local\Arduino15\packages\arduino\tools\avr-gcc\7.3.0-atmel3.6.1-arduino7\`
  * 入手先 <https://www.arduino.cc/en/software>
* Microchip Studio (avr-gcc 5.4.0, 旧 Atmel Studio)
  * `C:\Program Files (x86)\Atmel\Studio\7.0\toolchain\avr8\avr8-gnu-toolchain\bin`
  * 入手先 <https://www.microchip.com/en-us/tools-resources/develop/microchip-studio>

# 3: 最後に

この資料を書いているのは、[実践Rustプログラミング入門](https://www.shuwasystem.co.jp/book/9784798061702.html) を読み始めた程度の Rust 言語歴2日目の初心者です。
未だにクレートって何？という状態ではありますが、AVR マイコンを Rust で開発するまでの環境構築をまとめてみました。
AVR マイコンで Rust を動かそうと試行錯誤している人の助けになれば幸いです。私は試行錯誤に2週間かかりました。

インストールした Rust nightly コンパイラと avr-gcc を使って、実際にLチカプログラムを動かす手順は、続きの記事で紹介しています。

https://qiita.com/BerandaMegane/items/24aa106179eac2f3e639