備忘録: WSL2 Ubuntuに Nervesの開発環境をセットアップしてみる

5月に WSL2 - Windows Subsystem for Linux 2 が正式リリースされたそうだ。
どの程度使えるモノだろうかと、ちょっと Nervesの開発環境をセットアップしてみることにした。その備忘録:grinning:

# 1.前準備
Windows10はアップデート済みで、WSL2のセッティングも終わっているとする。

WSL2にインストールする Linuxディストリビューションはポピュラーな Ubuntuにする。Microsoft Storeを開き、キーワード「WSL」で検索すると、下図のようにバージョン付きとバージョン無しの合わせて3つの Ubuntuが見つかった。バージョン無しの Ubuntuはその時点での最新のバージョンだそうなので、今回はコレを選んでみた - 実体は 20.04 LTSか:stuck_out_tongue_winking_eye:

WSL2 Ubuntuのターミナルと Windowsのコマンドプロンプト/PowerShellを行き来する作業では、Windows Terminalが便利なのでコレもインストールしておく。

![MicrosoftStore.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14158/0adef2c2-1314-38cd-4c68-7342628ed038.png)

念のために、Ubuntuの WSLバージョンが "2"となっていることを確認しておこう。
…OKだ:ok_hand:

```powershell:powershell
PS C:\Users\shozo> wsl -l -v
  NAME      STATE           VERSION
* Ubuntu    Stopped         2
```
# 2.Nervesのセットアップ
WSL2上では Linux-Ubuntu 20.04が動いているので、Nervesの開発環境のセットアップ手順は Ubuntuのそれとなんら変わらない。違いは、作成した NervesファームウェアをSDカードに書き込む時に Windows版 fwupが必要になることぐらいかな。どうやら WSL2からは SDドライブに直接アクセス出来ないようだ。

以下、Nerves ProjectのHPに掲載されている[Nerves installation](https://hexdocs.pm/nerves/installation.html#content)に沿ってセットアップを進める。

##2.1.debパッケージのインストール
まず、Erlang/Elixirをビルドする為に必要な debパッケージをインストールする。

```bash:bash
sudo apt update -y
sudo apt install build-essential automake autoconf git squashfs-tools ssh-askpass pkg-config curl
sudo apt install libssl-dev libncurses5-dev bc m4 unzip cmake python
```

Nervesを利用するだけなら上のパッケージのインストールだけで十分。
後述する Erlangのビルドの際中に、「いくつかライブラリが足りないとぞ」とワーニングが出るが、気にする必要はないようだ。

しかし、Nervesとは別に Erlang単体のフル活用も考えているならば、下記のパッケージをインストールしてワーニングを消しておこう。今回は、Erlangで wxWidgetsをちょっと触ってみたかったので、これらのパッケージもインストールした。

```bash:bash
sudo apt install openjdk-8-jdk unixodbc-dev libwxgtk3.0-gtk3-dev xsltproc fop libxml2-utils
```
次にfwupをインストールする。先にも触れた通り、UbuntuとWindowsの両方で行う。

```bash:bash
wget https://github.com/fhunleth/fwup/releases/download/v1.8.0/fwup_1.8.0_amd64.deb
sudo apt install ./fwup_1.8.0_amd64.deb
```
```powershell:powershell
choco install fwup /y
```
##2.2.Erlang/Elixirのビルド
Nervesの開発では、プリ・ビルドされたバイナリ([nerves_system_rpi3](https://github.com/nerves-project/nerves_system_rpi3/releases)など)を使用しているため、Erlang/Elixirのバージョンとの依存関係が発生する。そこで、Erlang/Elixirのバージョンを管理するために [asdf version manager](https://asdf-vm.com/#/)が利用されている。

ということで asdfのインストールから始める。

```bash:bash
git clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch v0.7.1
echo -e '\n. $HOME/.asdf/asdf.sh' >> ~/.bashrc
echo -e '\n. $HOME/.asdf/completions/asdf.bash' >> ~/.bashrc # optional
source ~/.bashrc
```
次に Erlang/Elixirのプラグインを取得し、Erlang/Elixirそれぞれをビルド&インストールする。

先に触れた通り、ODBCやwxWidgetsの debパッケージをインストールしていない場合は、Erlangのビルドでワーニングが出るが気にする必要はないようだ。

注)nerves_system_rpi3 v1.12.0からは Erlang/OTP 23に依存するので、erlang 23.0.2を選択しよう。

```bash:bash
asdf plugin-add erlang
asdf plugin-add elixir
asdf install erlang 23.0.2
asdf install elixir 1.10.3-otp-23
asdf global erlang 23.0.2
asdf global elixir 1.10.3-otp-23
```

最後に、mix回りのセットアップと sshの鍵を作成する。これで Nerves開発環境のセットアップは一通り終わりだ。

```bash:bash
mix local.hex
mix local.rebar

mix archive.install hex nerves_bootstrap

ssh-keygen
```

# 3.試しにBlinkyをビルドしてみる
さて、WSL2 Ubuntu上の Nerves開発環境がちゃんと使えるか試してみよう。
そうだなぁ、ターゲット・アプリは [nerves_exampls](https://github.com/nerves-project/nerves_examples)の blinkyを使おう。

```bash:bash
git clone https://github.com/nerves-project/nerves_examples.git
cd nerves_examples/blinky

export MIX_TARGET=rpi
mix deps.get
mix firmware
```
ビルドは、依存モジュールやアーカイブのダウンロードを含め、ネイティブな Ubuntu上と変わらずにすんなりと通った。

では、SDカードへの書き込みは?

```bash:bash
mix burn
```
Windows側で、管理者承認のダイアログがポップアップして一瞬ドキッとしたが、すべて「はい」で応えれば「とっとっとっとっとっ」と無事SDカードへの書き込みが出来た。まぁ、難点は SDドライブの名称が、"\\.\PhysicalDrive1"と物理ディスク名で表示されるところかな:sweat:

# 4.まとめ
WSL2 Ubuntuで Nervesしてみたら、驚いたことにネイティブな Ubuntu上での操作性と殆ど変わらなかった。さらに、VS code & Remote WSL拡張で WSL2に接続すれば、ファイルの編集はもちろんターミナルで mixを叩くこともでき超快適であった。これまで Windows派は Nervesをしたくても蚊帳の外だったが、WSL2で道が拓けたんじゃなかろうかと思う。
感無量:blush:

PS. おっと、upload.shによるネットワークファームウェアアップデートは試してなかった(汗)