OS X El Capitan + Xcode 7でAOSPをコンパイルする

# どうしてまた
デスクトップPCが仮想化で資源分断化->メモリ不足->2GBのUbuntu VMでは、Android(AOSP)のコンパイルが失敗…(swapを用意しても有効時間内にゴールしなかった)。
そこで、手元のMacBook Proの8GBならゴールするのでは。持ち歩けるし、SSDで速そうだし、El Capitanにしたら、なんとなく快調だし。
でも、本家情報は、Yosemite + Xcode 4.5.2で止まっている。そこで…

# 用意したもの
- Mac: MacBook Pro (Retina, Mid 2012) Core i7 8GB
- OS: OS X El Capitan 10.11.2
- アンチウイルスソフト: Sophos Home最新版
- Xcode: Version 7.2 (7C68), Command_Line_Tools_OS_X_10.11_for_Xcode_7.2.dmg
- MacPorts: MacPorts-2.3.4-10.11-ElCapitan.pkg
- AOSP: android-6.0.1_r3

# 種明かし
- MacPortsで入れるパッケージを手抜きしてみた
- アンチウイルスソフトはOffにしておく
- Makefileにバージョン追記
- .imgはできたが、実は実機での動作未確認…動かなかったらすいません

# 手順詳細
まずは、[本家](https://source.android.com/source/initializing.html)を参照。

## ファイルシステム

### ファイルシステムの生成
残念ながら、ベースのOS Xのファイルシステムが「大文字／小文字を区別しない」なので、本家の通り、

```shell-session
# hdiutil create -type SPARSE -fs 'Case-sensitive Journaled HFS+' -size 40g ~/android.dmg
```
で、大文字／小文字を区別するdmgを生成。
生成された~/android.dmg.sparseimageは肥大化するので、あらかじめTime Machine対象外に設定。

### ファイルシステムのマウント
本家のシェルコマンドは面倒なので、~/android.dmg.sparseimageをダブルクリックしたら、mountされた。
…が、ボリューム名がuntitledだったので、GUIでandroidに変更。
すると、/Volumes/android/からアクセス可能になった。

## ツールの導入
- JDK: 現状最新のjdk-7u80-macosx-x64.dmgをダブルクリックでインストール
- Xcode: App Storeからインストール
- Command Line Tools: Developerからダウンロードしてインストール
- Xcode: 一度起動して、ライセンスに同意しておく
- MacPorts: 現状最新のMacPorts-2.3.4-10.11-ElCapitan.pkgをダブルクリックでインストール
- cache: とりあえず使わなかった
- しまった、本家を読み返していて、`ulimit -S -n 1024`し忘れたことに気づく…本来の能力よりコンパイルに時間かかったかも

## MacPortsの設定
本家にあるパスの設定は、MacPortsのインストーラーが~/.profileによしなに設定してくれた。
問題はどのパッケージを入れるかだが、本家の下を見ると、gmakeの3.82を3.81にダウングレード必要とある。ところが、Xcodeにもgmakeが入っており、`make --version`で見ると、``GNU Make 3.81``と出て、ラッキー。gitもXcodeで入った模様。なので、パッケージは、gmakeとgitを除いた、

```shell-session
$ POSIXLY_CORRECT=1 sudo port install libsdl gnupg
```
としてみた。

## ソースの入手
repo syncしたら、40GBに収まらなかった? orz
別PCでrepo syncして、.repoを除いて持ってきた。OS Xの/Volumes/android/以外で、repo syncしても良いかもしれない。
持ってきたものを、/Volumes/android/に展開。

## Makefileの改造
本家情報は、Xcode 4.5.2で止まっている。ソースも、少なくとも今回用意したXcodeには対応していない。そこで、build/core/combo/mac_version.mkを改造。
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/の下が、MacOSX10.11.sdkだったため、
`mac_dk_versions_supported`に、`10.11`を足してみる。適当すぎチャレンジ。

```mf:build/core/combo/mac_version.mk
mac_sdk_versions_supported :=  10.6 10.7 10.8 10.9 10.11
```

## コンパイル
Ubuntuと同様に、`source build/envsetup.sh`して、`lunch`なりして、`make -j4`とか。Hyper Threading推しなら`-j8`か。
当初、Sophosを切っておかなかったら、最終段でコンパイルエラー。本家情報通り、切ってやったら、なんかゴールしたっぽい。(下記時間は、コンパイルエラー後の再makeからの時間なので気にしないで下さい)

```shell-session
#### make completed successfully (13:18 (mm:ss)) ####

$ ls out/target/product/deb/*.img
out/target/product/deb/boot.img
out/target/product/deb/cache.img
out/target/product/deb/ramdisk-recovery.img
out/target/product/deb/ramdisk.img
out/target/product/deb/recovery.img
out/target/product/deb/system.img
out/target/product/deb/userdata.img
```

# 考察
## 疑問
- クロスコンパイラは、prebuild/のものが使われる? (未調査)
- 依存するhost側のツールは、Xcode Command Line Toolsのもので結構まかなえている? (未調査)
- MacPortsはlibsdlとgnupg入れるのに相当いろんなもの引っ張ってくるのはなんで? ソースからコンパイルするから? (未調査)
- libsdlって何に使うの? (未調査)
- っていうか、実機で動くの? (未調査) すいません!

## .dmg越しの速度
Blackmagic Disk Speed Testだと、

- ネイティブ(OS X 拡張(ジャーナリング、暗号化)): WRITE=417.1MB/s, READD=448.5MB/s
- .dmg(OSX 拡張(大文字／小文字を区別、ジャーナリング)): WRITE=221.4MB/s, READ=332.7MB/s

これがどの程度影響するのかな。あんまり影響ない気もするけど、思ったよりは時間かかった。ウィルスチェック切り忘れたり、ulimitし忘れたり、-j4でやったり、-j8でやったり、途中でエラー起こったりで、コンパイル時間はちゃんと計れていません。

## コンパイル後の.dmgの容量
32GB。

# 参考文献

- 後になって知ったのですが、[こちら](http://blog.sfapps.jp/2015/10/27/build_marshmallow_by_el_capitan/)のほうがはるかに先で詳しく正確な記事でした。大変失礼しました。
- [こちら](http://stackoverflow.com/questions/32911766/android-open-source-aosp-build-failure-on-mac-os-x-ld-symbols-not-found-fo)の問題は出なかったんですよね…。Xcodeのバージョンが違うから?

# 欲しいもの
Thunderbolt外付けSSD(PCIe接続)