mrubyのビルドシステムにAndroid用のビルドを対応させました

mrubyをAndroid用にビルドする方法として、以前は下記のような方法がありました。

  1. 自分でARM用のtoolchain (CodeSourceryとか) を持ってきてARM用にstaticビルド
  2. Androidリポジトリをごっそりもってきて、その中のtoolchainでビルド
  3. Android NDKをもってきて、その中のtoolchainでビルド

最近のmrubyでは、Rubyのスクリプト(Minirakeと呼んでいるのかな?)を利用して、
ビルド時のtoolchainをカスタマイズできるようになっています。
この仕組を利用して、Android NDKだけでmrubyをAndroid用にビルドできるようにしました。

既にmruby本体の方に取り込まれている(commit ad11d3144efc34e6fdc6deb24fb073f1ccd99fdb)ので、
最新のAndroid NDKさえ手元にあればmrubyをgit cloneしたらすぐにAndroid用のビルドができます。

下記にビルドの仕方の詳細を記述します。
方法は大きく2つあり、一つはSTANDALONE_TOOLCHAINを利用する方法、
もうひとつはNDKのホームディレクトリを指定する方法です。

ANDROID_STANDALONE_TOOLCHAIN」を使う方法

手順は以下のとおりです。

  1. Android NDKをDownloadして展開
  2. Android NDKの「build/tools/make-standalone-toolchain.sh」を使用してツールチェインをセットアップします。
  3. mrubyをgit clone
  4. ANDROID_STANDALONE_TOOLCHAINという環境変数に、"2"でセットアップしたツールチェインのパスを設定
  5. makeを実行

コマンドでいうと下記のような感じです。

$ cd /path/to/android-ndk-rxx/
$ cd build/tools/
$ ./make-standalone-toolchain.sh --platform=android-14 --toolchain=arm-linux-androideabi-4.6 --install-dir=/tmp/android-14-arm-gcc4.6 --ndk-dir=/path/to/android-ndk-rxx/
$ cd /path/to/mruby_dev
$ git clone git://github.com/mruby/mruby.git
$ cd mruby
$ ANDROID_STANDALONE_TOOLCHAIN=/tmp/android-14-arm-gcc4.6 make

「make-standalone-toolchain.sh」に渡すパラメータはビルド対象のプラットフォームやアーキテクチャに合わせて適宜変更してください。

ANDROID_NDK_HOME」を使う方法

手順は以下のとおりです。

  1. Android NDKをDownloadして展開
  2. mrubyをgit clone
  3. ANDROID_NDK_HOMEという環境変数に、"1"で展開したNDKのパスを設定
  4. makeを実行

コマンドでいうと下記のような感じです。

$ cd /path/to/mruby_dev
$ git clone git://github.com/mruby/mruby.git
$ cd mruby
$ ANDROID_NDK_HOME=/path/to/android-ndk-rxx/ make

この時、ビルド対象になるAndroidプラットフォームのバージョンやアーキテクチャは、
別途環境変数で指定できるようになっています。

指定可能な環境変数は下記のようになっています。

ANDROID_TARGET_ARCH
ビルド対象のアーキテクチャで、'arm', 'x86', 'mips'のどれかを指定します。デフォルトは'arm'です。
ANDROID_TARGET_ARCH_ABI
ビルド対象のABIで、ANDROID_TARGET_ARCHが'arm'の時だけ使用します。指定できるのは'armeabi-v7a'だけで、指定しないか異なる値の場合はarmv5teとしてビルドします。
ANDROID_TOOLCHAIN
使用するツールチェインの種類で、'gcc', 'clang', 'clang31'のどれかを指定します。現在は'gcc'のみをサポートしており、'clang'や'clang31'は使用出来ません。
ANDROID_TARGET_PLATFORM
ビルド対象のAndroidプラットフォームバージョンで、'android-14', 'android-9', 'android-8', 'android-5', 'android-4', 'android-3'を指定出来ます。


今はまだサポートしていないフラグとかがあるので、今後きちんとサポートしたいのと、
そのうちclangもサポートできたら良いなーと思っています。
いつになるかわかりませんが。