Homebrewでmbedローカルビルド環境作成


mbedに入門してローカルビルドしてみたので、メモ。

## 開梱〜Lチカまで

[mbedを始めましょう!](http://developer.mbed.org/users/nxpfan/notebook/lets_get_started_jp/)のページを見れば解決するので省略。


## ローカルビルド環境を作る

基本的にmbedはオンラインコンパライラを使い、バイナリがサーバーから降ってくるという形で開発を進めます。なので、現場でトラブルが起こり、かつネット接続ができない場合などは切腹するしかないので、ローカルビルド環境をHomebrewでサクっと作ろうと思います。


### HomebrewでGCC-ARM ToolChainを入れる

今回はGCCでビルドすることにして、下記Formulaを入れます。

```
% brew tap nitsky/stm32
% brew install arm-none-eabi-gcc
```


### mbed SDKをクローンしてくる

とりあえずhomeでやります。[このリポジトリ](https://github.com/mbedmicro/mbed)をクローンします。

```
% cd ~
% git clone https://github.com/mbedmicro/mbed.git
```

### 各種プラットフォーム用ライブラリをビルドする

mbed SDKでは、自分の使用するmbed用ライブラリを事前にビルドする必要があります。
まずはクローンしてきたSDKにユーザ設定ファイルを追加。

```
% cd mbed
% touch workspace_tools/private_settings.py
```

このコマンドで、対応しているプラットフォーム＋αを確認できます。

```
% python workspace_tools/build.py -h
```

例えば、LPC1768のライブラリを作成する場合はこんな感じ。

```
% python workspace_tools/build.py -m LPC1768 -t GCC_ARM
```

これでバイナリを作成する環境が整ったので、次はテストプログラムをビルドしてみます。

## サンプルプログラムのビルド

まずは、SDKに同梱されているサンプルプログラムのリストを表示してみます。

```
% python workspace_tools/make.py -L
[  0] MBED_A1: Basic
[  1] MBED_A2: Semihost file system
[  2] MBED_A3: C++ STL
[  3] MBED_A4: I2C TMP102
[  4] MBED_A5: DigitalIn DigitalOut
[  5] MBED_A6: DigitalInOut
[  6] MBED_A7: InterruptIn
[  7] MBED_A8: Analog
[  8] MBED_A9: Serial Echo at 115200
[  9] MBED_A10: PortOut PortIn
[ 10] MBED_A11: PortInOut
.
.
```

このような形で120個くらいのサンプルプログラムが羅列されます。
次のようなオプションを指定して、0番目の`Basic`をビルド。

- `-m` ターゲット = LPC1768
- `-t` ビルド環境 = GCC_ARM
- `-p` ソースコード = 0 (番号で指定)
- `-d` binの生成ディレクトリ = `~/mbed/bin`

```
% mkdir ~/mbed/bin
% python workspace_tools/make.py -m LPC1768 -t GCC_ARM -p 0 -d ~/mbed/bin
```

これで、指定した`~/mbed/bin`に`basic.bin`が生成されるはず。
あとはいつもどおり、この`basic.bin`をmbedに書き込み、リセットをかませばOKです。


## 自分のプロジェクトのビルド

最後に、自分のプロジェクトをオンラインコンパイラからエクスポートしてきて、ビルドします。この場合、プロジェクト内にターゲットのライブラリが同梱されているので、GCCのToolchainさえ入っていれば、上記のライブラリのビルドはしなくてもOKなんだろうな、たぶん(未確認)。

- mbed Compiler を開く
- Program WorkSpace (左のプロジェクトツリー) の所望のプロジェクトを右クリック
- Export Program
- ターゲットとToolchainを選択してExport


ダウンロードされたプロジェクトを解凍し、任意の場所に置く。そして、

```
% cd your_project_path
% make
```

これでOK。`your_project_path`直下に`your_project.hex`が生成されます。


## 注意：Yosemiteではbinを書き込めないターゲットあり
[こちら](http://developer.mbed.org/forum/mbed/topic/5149/)のフォーラムにある通り、現時点では、Yosemiteでmbedにプログラムを書き込めません。これに対処すべく、[こちら](https://developer.mbed.org/users/okano/notebook/mbed-on-yosemite/)で対策スクリプトを書いてくださっています。ありがとうございます！

最近は、[別の解決方法](http://developer.mbed.org/users/takuo/notebook/another-workaround-for-yosemite/)も提案されているようです。daemonを走らせて、通常通りmbedにドラッグ＆ドロップ出来るようにする方法のようです(未確認)。

~~一度やってしまったのでメモ。mbedをつないでいないときにmbed-on-Yosemite.appを使ってしまうと、`/Volumes/MBED`なるファイルができてしまい、mbedをつないでもプログラムが書き込めなくなる。`/Volumes/MBED`を消せば元通り書けるようになります。~~ 

@tedd_okano さんが[修正版](http://developer.mbed.org/users/okano/notebook/mbed-on-yosemite/)を作成してくれております。ありがとうございます！

## ちなみに

Google先生に聞くと、gcc-arm toolchainは下記のリポジトリがたくさん出てきます。

```
% brew tap darconeous/embedded
% brew install arm-none-eabi-gcc
```

しかしながら、2014/12/11時点では、このformulaではビルドがうまくいかない…。

```
[ERROR] arm-none-eabi-gcc: error: nano.specs: No such file or directory
```

どうやらこれはUbuntu版のものらしく、かつ、そいつにバグがあるとか。
gcc-4.8.2以降でこうなってしまった、とのこと。
上記リポジトリで参照しているToolChainのバージョンを4.7.4〜4.9.0まで試してみましたが、ダメでした。ググりすぎて参考ページをメモしていないので、詳細は省きます。


## 参考

- [mbedのビルドをOSX上で行う](http://qiita.com/takahashim/items/89ac93e4b004de7e7413)
- [ARM mbed オフラインコンパイル](http://developer.mbed.org/users/okini3939/notebook/offline-toolchains_jp/)
- [ARM mbed ツール](http://developer.mbed.org/users/MACRUM/notebook/mbed-tools/)
- [GNU Tools for ARM Embedded Processors](https://launchpad.net/gcc-arm-embedded)
- [Problems with mbed on OSX Yosemite](http://developer.mbed.org/forum/mbed/topic/5149/)
- [Yosemite file copier for HDK-based mbed](https://developer.mbed.org/users/okano/notebook/mbed-on-yosemite/)
- [Another Workaround for the "Yosemite Problem"](http://developer.mbed.org/users/takuo/notebook/another-workaround-for-yosemite/)