読者です 読者をやめる 読者になる 読者になる

不確定特異点

広く深く、ところどころ超深く

Vagrant を使ってクロスコンパイル環境の構築を自動化してみる

Vagrant ARM

STM32F4 Discovery 等のマイコンを使った開発をする場合、ARM のクロスコンパイル環境を整える必要がありますが、コンパイラエミュレータ等のバージョンを揃える必要があり、場合によってはソースコードをからビルド必要があったりと、これが結構面倒な作業になります。一度環境を整えても、別のマシンに移行する場合は一からやり直しだったり。そこで、Vagant を使ってこの無駄な作業を省くことにしました。

当初、VagrantVirtualBoxVMWare などの仮想マシンの生成、実行、削除を簡便にオートメーションするためのツールで、仮想マシン上のゲスト OS の環境設定は別途、Chef などのプロビジョニングツールを使ってやるものだと思ってました。Chef のドキュメントを眺めてはみましたが、今回の用途には幾分オーバースペックであり、わざわざ Chef を入れるに見合う使い方ではないなぁ、という感触でした。

改めて Vagrant のドキュメントを見ていたら、Vagrant 単体にもプロビジョニング機能がある事に気がつきました。ちゃんとドキュメント読めって話ですね。Chef や Ansible を始め、様々なツールに対応しているようです。普通にシェルスクリプトも書けるらしい、というわけで、今回のように複雑な設定やサービスの起動がなく、単に開発ツールを揃えるだけ、といった用途に対しては、これで十分じゃん?と思ってきました。

Vagrantfile

Vagrantfile は以下のようになりました。通常は config.vm.box の設定しかないと思いますが、その下の config.vm.privision が今回追加した部分です。ベストプラクティスがよくわからないので、とりあえずヒアドキュメントでべた書きで。

Vagrant.configure(2) do |config|
  config.vm.box = "ubuntu/trusty64"
  config.vm.provision "shell", privileged: false, inline: <<-SHELL
    yes Y | sudo -E apt-get install gcc-arm-linux-gnueabi
    yes Y | sudo -E apt-get install git emacs24-nox
    yes Y | sudo -E apt-get install pkg-config g++ libtool zlib1g-dev libglib2.0-dev autoconf flex bison
    if [ ! `which qemu-system-arm` ]; then
      curl -s -O http://wiki.qemu-project.org/download/qemu-2.4.0.tar.bz2 &&
      tar jxvf qemu-2.4.0.tar.bz2 &&
      cd qemu-2.4.0 &&
      ./configure --target-list=arm-softmmu,arm-linux-user &&
      make &&
      sudo make install &&
      cd .. &&
      rm -rf qemu-2.4.0 qemu-2.4.0.tar.bz2
    fi
  SHELL
end

ARM クロスコンパイル用の GCCQEMU をインストールしますが、好みで Emacs 24 も入れてみたり。すでに QEMU がインストールされていたら何もしない事で、なんちゃってですが、冪等性を表現しているつもりです。これを適当なディレクトリにおいて vagrant up すると、初回のみ上記のシェルスクリプトが走り、勝手に box から仮想マシンが生成され、シェルスクリプトで環境構築された状態で立ち上がります。次回の vagrant up 以降はシェルスクリプトは実行されませんが、vagrant provision により再度プロビジョニングできます。

こういう環境構築の仕込みって地味だけど、あるとないとでは全然違うな、と感じました。