chipKit Max32でのmrubyビルド再考

引き続きArduino互換機chipKit Max32でmrubyを動かすシリーズです。
今まではchipKit Max32のIDEであるMPIDEのライブラリフォルダにmrubyのソースを丸ごとコピーするという方法を取って来ましたが、MPIDEのライブラリフォルダは*.c/*.hの配置に制限があったりして、イマイチスマートではなかったです。
Arduino互換機 chipKIT Max32でmrubyを動かす - kyabの日記

最近もっとましなやり方を見つけたので書いてみます。mrubyのビルドもrubyを使う方法になって、クロスコンパイルなどもスマートになったのでその辺やりたい人の参考にもなるかも。

あ、Mac前提で書いてます。

mrubyの入手

githubから落とします。

git clone https://github.com/mruby/mruby.git

MPIDEの入手

以下からMac OSX用をダウンロード
https://github.com/chipKIT32/chipKIT32-MAX/downloads

以下、mrubyは/work/mrubyに、MPIDEは/Applications/Mpide.appに置いたものとして説明。

build_config.rbの編集

/work/mruby/build_config.rbの最後に以下を追記。chipKit Max32用のクロスコンパイルをするための設定です。書き方とどのようにビルドされるかはここに載ってますね。コンパイルオプションはMPIDE上でシフトを押しながらビルドすると詳細が出てくるので、それを参考にしました。
2013/6/21追記 mruby本体にexampleとして入りました。以下はmruby本体の examples/targets/chipKitMax32.rbをコピペでOK.

MRuby::CrossBuild.new("chipKitMax32") do |conf|
 	toolchain :gcc

 	MPIDE_PATH = "/Applications/mpide.app"
 	MRUBY_PATH = "/work/mruby"

 	conf.cc do |cc|
 		cc.command="#{MPIDE_PATH}/Contents/Resources/Java/hardware/pic32/compiler/pic32-tools/bin/pic32-gcc"
 		cc.include_paths = ["#{MPIDE_PATH}/Contents/Resources/Java/hardware/pic32/cores/pic32",
 							"#{MPIDE_PATH}/Contents/Resources/Java/hardware/pic32/variants/Max32",
 						    "#{MRUBY_PATH}/include"]
 		cc.flags << "-O2 -mno-smart-io -w -ffunction-sections -fdata-sections -g -mdebugger -Wcast-align " +
 				"-fno-short-double -mprocessor=32MX795F512L -DF_CPU=80000000L -DARDUINO=23 -D_BOARD_MEGA_ " +
 				"-DMPIDEVER=0x01000202 -DMPIDE=23"
 		cc.compile_options = "%{flags} -o %{outfile} -c %{infile}"
 	end

 	conf.archiver do |archiver|
 		archiver.command = "#{MPIDE_PATH}/Contents/Resources/Java/hardware/pic32/compiler/pic32-tools/bin/pic32-ar"
 		archiver.archive_options = 'rcs %{outfile} %{objs}'
 	end

 	conf.bins = []

 end

mrubyをコンパイル

cd /work/mruby
make clean
make

これで、/work/mruby/build以下にビルドされます。host/bin以下にmirb,mrbc,mrubyが出来ていて、chipKitMax32/lib以下にlibmruby.aが出来ているはず。

MPIDEの設定

mrubyのヘッダとライブラリをMPIDEから参照するようにします。
/Applications/Mpide.app/Contents/Resources/Java/hardware/pic32/platforms.txtを開いて、以下の行を編集

...
pic32.recipe.c.combine.pattern={0}{1}::{2}::{3}{4}::-o::{5}{6}.elf::{7}::{8}::-L/work/mruby/build/chipKitMax32/lib::-lmruby::-L{9}::-lm::-T::{10}/{11}
...
pic32.compiler.cpp.flags=-O2::-c::-mno-smart-io::-w::-fno-exceptions::-ffunction-sections::-fdata-sections::-g::-mdebugger::-Wcast-align::-fno-short-double::-I/work/mruby/include

保存して、MPIDEを再起動すればOKです。

コンパイルできるか確認

MPIDEで適当なスケッチを書いて、ビルドしてみます。

#define CHANGE_HEAP_SIZE(size) __asm__ volatile ("\t.globl _min_heap_size\n\t.equ _min_heap_size, " #size "\n")

#include "mruby.h"

CHANGE_HEAP_SIZE(100*1024);  //ヒープサイズを100kbにする。

void setup(){
  Serial.println(9600);
  mrb_state *mrb = mrb_open();
  Serial.println("mruby initialized.");
  mrb_close(mrb);
}

void loop(){
}

"Done compilling."と表示されればビルド成功です! あとはアップロードして実行するだけ。

これでmrubyを更新したときは、単にmrubyをmakeしなおせば良いですね。