mrubyのビルドシステムにAndroid用のビルドを対応させました
mrubyをAndroid用にビルドする方法として、以前は下記のような方法がありました。
- 自分でARM用のtoolchain (CodeSourceryとか) を持ってきてARM用にstaticビルド
- Androidのリポジトリをごっそりもってきて、その中のtoolchainでビルド
- 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」を使う方法
手順は以下のとおりです。
- Android NDKをDownloadして展開
- Android NDKの「build/tools/make-standalone-toolchain.sh」を使用してツールチェインをセットアップします。
- mrubyをgit clone
- ANDROID_STANDALONE_TOOLCHAINという環境変数に、"2"でセットアップしたツールチェインのパスを設定
- 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」を使う方法
手順は以下のとおりです。
コマンドでいうと下記のような感じです。
$ 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_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もサポートできたら良いなーと思っています。
いつになるかわかりませんが。