Nerves コアチームが公式サポートする Nerves システムをビルドする時は、通常は取扱説明書の通りの手順でを利用することが多いと思います。自分のNervesプロジェクトの依存性リストにターゲットデバイスに対応するパッケージを追加するだけで自動的に必要なツールやプログラム、設定等をダウンロードしてくれます。
しかしながら、それは既にリリースされている Nerves システムにおける話であって、未リリースのシステムを試したい場合は自分でソースコードからビルドする必要があります。例えば、リリース前の最新の機能を試したい場合、Nerves コアチームの開発・テストの支援をしたい場合、カスタムシステムを構築したい場合などが考えられます。
本記事の内容は Nerves Systems Builder の README に毛が生えたようなものです。原典も合わせてご参照ください。
Nervesシステムをビルドする方法
-
Mix
- 推奨
- 複数のOSに対応
- Nerves Systems Builder
ここでは Nerves Systems Builder に挑戦します。
Linuxマシンを準備
必要なライブラリをインストール
Debian 系の Linux ディストリビューションの場合、以下のコマンドで必要なライブラリをインストールします。
sudo apt update
sudo apt install git build-essential bc cmake cvs wget curl mercurial python3 python3-aiohttp python3-flake8 python3-ijson python3-nose2 python3-pexpect python3-pip python3-requests rsync subversion unzip gawk jq squashfs-tools libssl-dev automake autoconf libncurses5-dev
Erlang と Elixir をインストール
一例として asdf を用いて最新版をインストールする方法は以下の通りです。
git clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch v0.13.0
asdf update
plugins=(erlang elixir)
for plugin in "${plugins[@]}"; do
asdf plugin add "$plugin"
asdf install "$plugin" latest
asdf global "$plugin" latest
done
asdf をインストールした後のやり方がお使いのシェルによって異なるため、詳しくは asdf 公式ドキュメントをご参照ください。bash の場合は以下の通りです。
echo '. $HOME/.asdf/asdf.sh' >> ~/.bashrc
echo '. $HOME/.asdf/completions/asdf.bash' >> ~/.bashrc
source ~/.bashrc
hex と rebar をインストール
mix local.hex
mix local.rebar
これで、nerves_bootstrap を Mix 環境に追加する準備が整いました。
nerves_bootstrap をインストール
nerves_bootstrap アーカイブをインストールすることにより、Nerves 開発用の Mix 環境を構築し、各対象ボードに対応するクロスコンパイラが利用可能になります。また、nerves_bootstrap アーカイブには、新しい Nerves プロジェクトの作成に使用できるプロジェクトジェネレーターも含まれています。
mix archive.install hex nerves_bootstrap
ここでインストールするのは nerves_bootstrap アーカイブです。nerves パッケージではないので注意してください。
Nerves Systems Builder をダウンロード
Nerves Systems Builder は現時点ではバージョン管理されていません。あくまで Nerves コアチームが使っている便利ツールという位置付けのようです。
git clone git@github.com:nerves-project/nerves_systems.git
Nerves Systems Builder の設定
設定は config/config.exs
ファイルにて行います。
設定サンプルが config/starter-config.exs
にありますので、それを config/config.exs
にコピーし、適宜調整するのが手っ取り早いです。
cd path/to/nerves_systems
cp config/starter-config.exs config/config.exs
open config/config.exs
ビルドしたいNervesシステム以外をコメントアウトするとビルドにかかる時間を短縮できます。
ビルドしたいNervesシステムのソースコードをダウンロード
mix ns.clone
タスクで設定ファイルに列挙したNervesシステムを src
ディレクトリにダウンロードします。
mix ns.clone
mix ns.clone
はだた git clone
するだけなので、ご自分で git clone
されても結果は同じです。
src/
nerves_system_br
nerves_system_rpi0
nerves_system_bbb
...
やり直す時は迷わず src
ディレクトリを消去してしまって大丈夫です。
Nerves Systems Builder で Nerves システムをビルド
Nervesシステムをビルドには2つの段階があります。mix ns.build
は両方のステップを実行します。
- 出力ディレクトリ内の
nerves_defconfig
を.config
ファイルに変換 - 出力ディレクトリ内で
make
を実行
出力ディレクトリは o/<システムの短縮名>
(例、o/rpi0
)です。
インクリメンタルビルドはできる場合とできない場合が考えられます。うまくいかない場合は、出力ディレクトリを削除してビルドを最初からやり直してください。
mix ns.build
-
mix ns.build
が失敗した場合は、失敗した出力ディレクトリに移動し、make
を再実行してください。 -
make source
を実行するとまず全てをダウンロードし、のちにmake
することが可能です。 - ダウンロードされたものは
~/.nerves/dl/
に保存されます。 -
make menuconfig
を実行した後にはmake savedefconfig
を実行してください。src/nerves_system_piyopiyo
に更新内容が反映されますので、必要に応じてコミットしてください。
ビルドした Nerves システムを使ってファームウエアを作る
別のターミナルを開く
別のターミナルを開き、そこでご自身のNervesファームウエアプロジェクトを開きます。
環境変数をセットする
mix.exs
で参照されている通常のパッケージ化されたNervesシステムではなくカスタム Nerves システムを使用するようにと nerves に指示するための特別な環境変数がいくつかあります。
-
対象ボード に対応する
nerves.env.sh
スクリプトを見つけます。 - ご自身のNervesファームウエアプロジェクトのターミナルで実行します。
nerves.env.sh
スクリプトは各対象ボードに対応する出力ディレクトリ内にあります。
対象ボードは Raspberry Pi Zero の場合、スクリプトのパスは ~/path/to/nerves_systems/o/rpi0/nerves-env.sh
となります。
. ~/path/to/nerves_systems/o/rpi0/nerves-env.sh
また、通常どおり MIX_TARGET
を設定することを忘れないでください。Raspberry Pi Zero の場合は以下の通りとなります。
export MIX_TARGET=rpi0
あとはいつも通り