Help us understand the problem. What is going on with this article?

ElixirでIoT#4.1:Nerves開発環境の準備(2020年7月版)

この記事は#NervesJP Advent Calendar 2019の1日目です.れっつじょいなす!

はじめに

どうもこんにちわ
Nervesとは,関数型言語ElixirにてIoTシステム開発を実現するフレームワークです.
『ElixirでIoT』の世界に革新をもたらします!

詳細な解説はIoT ALGYANで実施したWebinarのこちらの資料もご笑覧ください.

image.png

さぁ皆さん!今すぐにでもNervesやりたくなってきたでしょ!??

Nervesを使うには,まずは環境構築だっ!となるわけですが,幾つか注意点(a.k.a ハマりどころ)があったりします.2019年には全国各地でNerves Trainingを開催しましたが,その折に皆さんにも準備いただいた際に多くのTIPSが溜まってきました.

ということで本記事は,これらのTIPSの集約も兼ねて,Nervesの開発環境の準備方法を紹介します.
なお本記事は,#NervesJP Advent Calendar 2019の記念すべき1日目!の記事でもあります.

Nervesの開発は日進月歩でアップデートが続いています.なるべく最新版に合うように本記事を随時更新していますが,公式のInstallation Docsページも参照してください.

主な編集履歴

  • 2020/07/10:
    • 本家のInstallation.mdの更新に合わせてErlang/OTP 23にアップデート
    • @matsujirushi さんのWSL2+Docker+VSCodeな記事をリンク!
    • picocom等のシリアル通信を使うシチュエーションが無くなってきた(ssh通信が安定してきた!)ので,インストール手順から削除.
  • 2020/05/06:
  • 2020/05/05:
    • Linux向けのErlangインストール時の警告表示 * odbc : ODBC library - link check failed の抑止のために sudo apt install unixodbc-dev を追加
  • 2020/04/28:
  • 2020/04/20:
    • Nerves 1.6 Released!に対応
    • Nerves 1.6.1に合わせてElixir 1.10.2 / Erlang/OTP 22.2.8にアップデート
  • 2020/02/23:
    • Ubuntu18の環境準備に default-jdk を追加
  • 2020/02/04:
    • macOSの試行バージョン(Mojave)を明記
    • macOS向けのErlangインストール時の警告表示をなるべく除去できるようにした
      • jinterface : No Java compiler foundのためにbrew cask install adoptopenjdk を追加
      • * odbc : ODBC library - header check failed のために brew install odbc を追加
      • fop is missingのためにbrew install fopを追加
    • Catalinaでの注意点と @torifukukaiou さんへの記事リンクを追加
  • 2019/12/01:
  • 2019/09/03:
  • 2019/08/27: Nerves 1.5.1のリリースに合わせてElixir 1.9.1 / OTP 22にアップデート
  • 2019/07/19: asdfの設定先を.bashrcに変更(ShozFさんに多謝!
  • 2019/07/18: Nerves 1.5.0 Released!に対応
    • Elixir 1.9.0 / OTP 22にサポートしています!
  • 2019/07/10: fukuoka.exmyasuさんのTIPS共有なブログ記事を掲載(深々と多謝!
  • 2019/06/16: asdfがうまく動かずソースビルドな時の方法を紹介(@u3pakaさんに多謝!

OS環境ごとの準備

まずは開発母艦となるPCを用意します.
要件としてはroot権限,ssh接続機能,USBポート1口,microSD/SDポート(別付でもOK)が必要です.

使用されるOS環境ごとに異なる準備内容を示します.
なおNervesの開発チーム的にはmacOSを基本としているようです.Linuxの場合はどのDistributionでもいけるそうですが,Ubuntuが推奨らしいです.
なおWindowsは(ry
→ この状況,なんとかしたいですねぇ,,, WSL2でどうにかなるでしょうか?
どうにかなりました!コチラどうぞ!!

また,クロスコンパイラを使う兼ね合いから,ホストPCはx64のものを用意してください.arm64は対応していません.
つまりラズパイでラズパイ開発しようぜっ!ってのは(ry
→ Nerves co-authorのJustin曰く,できるよっ!と言っていました.Raspberry Pi 3でexperimentalに整えているようです.機会を伺って詳細を調べてみます.

macOSの場合

筆者はmacOS Catalina (10.14.6)で試行しています.

まずはXcode command-line toolsをインストールします.
Catalinaの場合,Erlang 22.2系との兼ね合いで注意が必要なことがあります.こちらの記事にまとめてありますので,合わせてご一読ください. → 22.3系がサポートされるようになったので大丈夫です!

$ xcode-select --install

パッケージやライブラリのインストールにはHomeBrewを使います.下記で導入してください.

$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

Nervesのためのパッケージを入れていきます.

$ brew install squashfs coreutils xz pkg-config

Nervesファームウェア書き込みのツールであるfwupをインストールします.

$ brew install fwup

[NT] 後述しますが,Erlangビルドにasdfを使うことを推奨しています.
Erlangのソースビルド中でOpenJDK等のJava Compilerを使用します(これが無くてもjinterface : No Java compiler foundの警告が表示されるだけでビルドは可能です)
これを導入されていない方は,手っ取り早くbrewで下記にてインストールします.

$ brew cask install adoptopenjdk

さらにErlangビルドのための様々なパッケージを入れていきます.各種オプションや追加モジュールのためなので,Erlangの標準機能のインストールだけであれば無くても構いません.

$ brew install automake autoconf openssl \
libyaml readline libtool wxmac glfw3 glew unixodbc fop

Linuxの場合

Ubuntuの例となります.他Distributionは適宜で読み替えてください.

Nervesのためのパッケージを入れていきます.

$ sudo apt install build-essential automake autoconf \
git squashfs-tools ssh-askpass pkg-config

[NT] ErlangビルドのためのasdfやScenicのために,様々なパッケージを入れていきます.
(Ubuntu18環境ではcurlがデフォルトで入っていないそうです. @piacerex さんに多謝!
(Ubuntu16環境では,libglew2.0がないのでlibglew1.13で代用して問題ありません.@bleach31さんに多謝!)

$ sudo apt install git curl libssl-dev libncurses5-dev \
bc m4 make unzip cmake python autoconf \
libwxgtk3.0-dev libgl1-mesa-dev libglu1-mesa-dev \
libglfw3 libglfw3-dev libglew2.0 libglew-dev

Ubuntu18環境でのErlang on asdfビルド時に出力される * jinterface : No Java compiler found および * odbc : ODBC library - link check failed のそれぞれの警告メッセージを回避するには, default-jdk および unixodbc-dev もインストールする必要があります(警告なので無くてもErlangビルドは完了できます)

$ sudo apt install default-jdk unixodbc-dev

Ubuntu18環境では下記もインストールしておくと,asdfを用いたErlang導入時に,javaのインタフェース部分の作成とドキュメント生成に失敗しないようになるようです(@ykominamiさんに多謝!

$ sudo apt install fop xsltproc libxml2-utils

Nervesファームウェア書き込みのツールであるfwupをインストールします.
apt pkgとしては登録されていませんが,GitHubにて各distribution用のパッケージが配布されていますので,それを使ってインストールします.

Windowsの場合

ゴメンナサイWindowsはWSL込みで非推奨なのです,,,
SDカード書込みやデバイス接続など,いろいろ乗り越えるべき問題があります.
国内では@nabinnoさんがWSL対応にトライされていますので,成果を待ちたいところです^^;

ということでここはおとなしく,VirtualBoxでUbuntu 18.04をインストールしてくださいm(_ _)m

WindowsユーザでもWSL 2でNerves開発ができるようになりました!!(2020年5月時点)
WSL 2でUbuntu 18.04を用意いただき,Windowsネイティブと両方でfwupをインストールしてやります.

あるいは,Docker&VSCode連携でモダンに開発環境を整えることもできます!
@matsujirushi さんの素敵な記事を参照!

Erlang & Elixirのインストール

いよいよErlangとElixirをインストールします.
Nerves公式にはasdfでのツールバージョン管理を推奨しています.
asdfでの管理方法についてはKochi.exな@nishiuchikazumaこちらの記事も参考になります.

TIPS

ShozFさんのご指摘を反映して,.asdfの設定先を.bashrcに変更しました!Ubuntuでは.bash_profileが無視されます.

Anaconda3がインストールされているとerlangビルドがうまくいかないそうです.# clangのパスは/usr/bin/clangであること必要がありますが,Anacond3のclangが呼び出されてしまうためです.
Anaconda3をパスから外してからビルドを実行してください(@ykominamiさんに多謝!

$ git clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch v0.7.8

# The following steps are for bash. If you’re using something else, do the
# equivalent for your shell.
$ echo -e '\n. $HOME/.asdf/asdf.sh' >> ~/.bashrc
$ echo -e '\n. $HOME/.asdf/completions/asdf.bash' >> ~/.bashrc # optional
$ source ~/.bashrc

$ asdf plugin-add erlang
$ asdf plugin-add elixir

# Note #1:
# If on Debian or Ubuntu, you'll want to install wx before running the next
# line: sudo apt install libwxgtk3.0-dev

# Note #2:
# It's possible to use different Erlang and Elixir versions with Nerves. The
# latest official Nerves systems are compatible with the versions below. In
# general, differences in patch releases are harmless. Nerves detects
# configurations that might not work at compile time.
$ asdf install erlang 23.0.1
$ asdf install elixir 1.10.3-otp-23
$ asdf global erlang 23.0.1
$ asdf global elixir 1.10.3-otp-23

きちんとインストールされているかは,下記で確認できます.

$ iex 
Erlang/OTP 22 [erts-10.6.4] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] [hipe]

Interactive Elixir (1.10.2) - press Ctrl+C to exit (type h() ENTER for help)

iex(1)> :observer.start 
:ok

うまくいかないときは?

arm64環境だとasdfがうまく動かないことがあるようです(詳細未調査)
その場合はソースビルドになります.@u3pakaさんのこちらの記事が参考になります!(ただしこのままやるとOTP 22になってしまうので注意してください)
→ただしarm64だとそもそもNervesのホスト環境として対応していないのでご注意を!

07/10追記:
asdfではソースビルドをすることになりますが,特にWindowsのVirtualBox環境ではメモリ不足でコケることがあるそうです.そうなるとパッケージビルドの方法が良いのですが,普通にやるとOTP 22系がインストールされています.
パッケージからElixir 1.8.1 / OTP 21をインストールする方法についてはmyasuさんがまとめてくださった下記の記事(Nerves Training in fukuoka.exの参加談)をご参照ください.多謝!!

Hexライブラリ・アーカイブのインストール

Elixirのライブラリやアーカイブをインストールしていきます.
すでにAlchemistな方も,最新版にアップデートするために下記コマンドを実行しておいてください.

hex, rebar

HexはElixir/Erlangのパッケージ管理ツール,rebarはErlangのビルドツールです.

$ mix local.hex
$ mix local.rebar

とうとうNerves開発環境をインストールします!!

Nerves archive

$ mix archive.install hex nerves_bootstrap

SSH公開鍵の作成

$ ls ~/.ssh
$ ls ~/.ssh/id_rsa

としてNo such file or directoryと言われる場合は,下記を実行しておきましょう.

$ mkdir ~/.ssh
$ ssh-keygen -t rsa -f ~/.ssh/id_rsa 

構築完了!

正しく環境構築できていれば,下記のようになっているはずです.
(それぞれのアップデートに応じてバージョン番号は異なるかもしれません)

$ ls ~/.asdf/installs/elixir/1.10.3-otp-23/.mix/*
/Users/takase/.asdf/installs/elixir/1.10.3-otp-23/.mix/rebar*
/Users/takase/.asdf/installs/elixir/1.10.3-otp-23/.mix/rebar3*

/Users/takase/.asdf/installs/elixir/1.10.3-otp-23/.mix/archives:
hex-0.20.5/     nerves_bootstrap-1.8.1/

おわりに

本記事ではNervesの開発環境の準備方法を解説しました.
はてさてじゃあ使ってみよう!!は,また後日に執筆したいと思います^^;

takasehideki
Asst. Prof. at Kyoto Univ. a.k.a 組込マー
fukuokaex
エンジニア/企業向けにElixirプロダクト開発・SI案件開発を支援する福岡のコミュニティ
https://fukuokaex.fun/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした