chipKit Max32でのmrubyビルド再考
引き続きArduino互換機chipKit Max32でmrubyを動かすシリーズです。
今まではchipKit Max32のIDEであるMPIDEのライブラリフォルダにmrubyのソースを丸ごとコピーするという方法を取って来ましたが、MPIDEのライブラリフォルダは*.c/*.hの配置に制限があったりして、イマイチスマートではなかったです。
Arduino互換機 chipKIT Max32でmrubyを動かす - kyabの日記
最近もっとましなやり方を見つけたので書いてみます。mrubyのビルドもrubyを使う方法になって、クロスコンパイルなどもスマートになったのでその辺やりたい人の参考にもなるかも。
あ、Mac前提で書いてます。
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しなおせば良いですね。