nerves_system_*から読み解くNervesの動向

本記事は [#NervesJP Advent Calendar 2020](https://qiita.com/advent-calendar/2020/nervesjp) の5日目です。
前日の4日目は、@pojiro さんの [なぜ僕はNervesに期待するのか](https://qiita.com/pojiro/items/99a60dc8a4427b79ddc7) でした。
個人的には、この一文が熱くて、素晴らしい記事だと思っています。
> 「Webと組み込みが融合するからこそ解ける問題」を解くのがIoT


---

本題です。

ご存知の通り、NervesはElixirで動作するIoTフレームワークです。
そして、動作対象となっている機器は、Nerves1.7.0の（2020.12.4）時点では、以下となっています。

* Raspberry Pi A+, B, B+
* Raspberry Pi Zero and Zero W
* Raspberry Pi 2
* Raspberry Pi 3 B, B+
* Raspberry Pi 4
* BeagleBone Black, BeagleBone Green, BeagleBone Green Wireless, and PocketBeagle
* Generic x86_64
* OSD32MP1 

最新情報は、NervesのHexDocsの[Supported Targets and Systems](https://hexdocs.pm/nerves/targets.html)で確認できます。

さて、これらの対象機器を操作する際には、対象機器用のライブラリモジュール（`nerves_system_rpi0`や`nerves_system_rpi4`など）が必要になります。

Nervesでは、プロジェクトを新規作成すると`mix.exs`に対象機器全てのライブラリモジュールが記述されています。その際には、バージョンの指定も行われています。
これは便利である反面、たまに環境不備が起きて`mix firmware`ができないといった弊害が発生する場合があります。

そのため、ライブラリモジュールのバージョンの特徴を知っておくことが大事になります。

## おさらい

おさらいです。

Nervesの対象機器用のライブラリモジュールは、対象機器ごとに用意されています。
たとえば、Raspberry Pi Zeroの場合には[nerves_system_rpi0](https://github.com/nerves-project/nerves_system_rpi0)、Raspberry Pi 3 B/B+の場合には[nerves_system_rpi3](https://github.com/nerves-project/nerves_system_rpi3)、BeagleBone Greenの場合には[nerves_system_bbb](https://github.com/nerves-project/nerves_system_bbb)といった具合です。

そして、これらの対象機器用のライブラリモジュールのベースには、Nervesシステムが動くための[Buildroot](https://buildroot.org/)用のライブラリモジュール[nerves_system_br](https://github.com/nerves-project/nerves_system_br)があります。

そのため、nerves_system_brのバージョンが上がった際には、そのバージョンアップで発生した変更点は大なり小なりnerves_system_rpi0やnerves_system_rpi3に影響が出てくると言うわけです。

これらを、ここでは便宜上`nerves_system_*`と記述します。

そして、結果的にnerves_system_*の変更は、Nerves側への影響となってあらわれます。

## nerves_system_*の影響確認

参考までに、nerves_system_*の変更点の影響を確認してみます。

### 影響例1：ディレクトリの変更

2020.08.30リリースの[nerves_system_brのv1.12.4](https://github.com/nerves-project/nerves_system_br/releases/tag/v1.12.4)では、書き込み可能なアプリケーションディレクトリが/root から /data に変更されました。
このリリースの数日後の2020.09.12に、[nerves_system_rpi0のv1.12.2](https://github.com/nerves-project/nerves_system_rpi0/releases/tag/v1.12.2)がリリースされ、リリースノートにディレクトリの変更が触れられています。

しかし、この変更によるNervesのバージョンアップは行われていません。
よって、Nervesのバージョンだけに着目しているとディレクトリの変更については見落としてしまうわけです。

### 影響例2：Erlang/OTPのバージョン指定

2020.06.12リリースの[nerves_system_brのv1.12.0](https://github.com/nerves-project/nerves_system_br/releases/tag/v1.12.0)では、Erlang/OTP 23.0.2以上の環境が必要になりました。
数日後の2020.06.17に、[nerves_system_rpi0のv1.12.0](https://github.com/nerves-project/nerves_system_rpi0/releases/tag/v1.12.0)がリリースされ、リリースノートにはErlang/OTP 23にアップデートしろと書かれています。

しかし、この変更でもNervesのバージョンアップは行われていません。
よって、Nervesの新規プロジェクトを作ったら、ある日突然「Erlang/OTP 23にアップデートしろ」と要求されるわけです。

### 影響例3：OSD32MP1のサポート

[OSD32MP1-BRK](https://octavosystems.com/octavo_products/osd32mp1-brk/)をサポートするライブラリモジュール[nerves_system_osd32mp1](https://github.com/nerves-project/nerves_system_osd32mp1)があります。
これは、2020.05.27にv0.1.0が[タグ付け](https://github.com/nerves-project/nerves_system_osd32mp1/releases)されました。

Nerves本体に対象機器として正式に取り込まれたのはNervesのv1.7.0からです。
v1.7.0のリリースは2020.10.8なので、nerves_system_osd32mp1の最初のタグ付けから約4ヶ月後です。しかし、nerves_system_osd32mp1と言うプロジェクトが出来上がったことで、NervesではそのうちOSD32MP1-BRKをサポートする予定であることがわかります。

## まとめ

Nervesの動向を、Nervesが利用するライブラリモジュール側から確認してみました。
こうしてみると、Nerves本体側からはアナウンスがなくても、何かしらのバージョンアップ対応が今後必要になりそうとか、新しいボードのサポートが行われそうと言うのがわかってきます。
一方で、ある日突然何かしらのバージョンアップ対応を要求されたら、それはnerves_system_*側の影響である可能性があります。

そのため、nerves_system_*の情報も参照すると良いでしょう。

自分の場合は、nerves_system_brとnerves_system_rpi0をWatchしています。
リリースされると通知が来るので、あらかじめ対策が必要そうなことがチェックできるのが便利です。

と、こんなところで今回のアドベントカレンダーの記事といたします。


6日目は、@kikuyuta さんが担当されます。お楽しみに。