始めに
弊社にてmruby向けのビルド環境について質問が出たらしいのでメモ。WindowsかつARM向けの話で、基本的に他の人のマネです。
Windowsビルド環境
mrubyはホスト側で動作するmrbcがクロスコンパイルする場合でも必要。そのためWindowsでもホスト側のビルド環境をインストールしておきます。VisualStudioExpressでもcygwinでも結構です。私は社内ツール作成でC#を多用するのでVSを入れてます。
ARMクロスコンパイル環境
ARM向けのクロスコンパイル環境構築はねむいさんのぶろぐの通りにすれば問題ありません。クロスコンパイラ(LAUNCHPAD gcc)、デバッガ(openocd)、GDBインタフェース(insight)をインストールしてLチカ程度の確認までしておきます。
ruby/bisonのインストール
mrubyを作るにはこれだけではまだ足りず、ruby/bisonのインストールが必要です。
mrubyライブラリ構築
これで漸くARM向けのmrubyライブラリが構築できます。STM32F4 Discovery向けとしてbuild_config.rbに以下の内容を追記します。
MRuby::CrossBuild.new('STM32F4') do |conf|
toolchain :gcc
conf.cc do |cc|
cc.command='C:/Devz/ARM/LAUNCHPAD/bin/arm-none-eabi-gcc'
cc.flags = []
cc.flags << '-mcpu=cortex-m4 -march=armv7e-m -mtune=cortex-m4'
cc.flags << '-mthumb -mlittle-endian -mno-unaligned-access'
cc.flags << '-mapcs-frame -mno-sched-prolog -mfpu=fpv4-sp-d16 -mfloat-abi=soft '
cc.flags << '-std=gnu99 '
cc.flags << '-fno-strict-aliasing -fsigned-char'
cc.flags << '-ffunction-sections -fdata-sections '
cc.flags << '-fno-schedule-insns2 '
cc.flags << '--param max-inline-insns-single=1000 '
cc.flags << '-nostartfiles -fno-common '
cc.flags << '-fno-hosted'
cc.flags << '-gdwarf-2 -O0 -flto-partition=none -fipa-sra'
cc.flags << %w(-DMRB_USE_FLOAT)
cc.defines << %w(MRB_HEAP_PAGE_SIZE=8)
cc.defines << %(MRB_IREP_ARRAY_INIT_SIZE=128u)
cc.defines << %w(MRB_USE_IV_SEGLIST)
cc.defines << %w(KHASH_DEFAULT_SIZE=8)
cc.defines << %w(MRB_STR_BUF_MIN_SIZE=20)
#cc.defines << %w(DISABLE_STDIO) #if you dont need
cc.defines << %w(MRB_GC_STRESS) #no document
cc.defines << %w(POOL_PAGE_SIZE=256) #effective only for use with mruby-eval
end
conf.archiver do |ar|
ar.command = 'C:/Devz/ARM/LAUNCHPAD/bin/arm-none-eabi-ar'
end
conf.bins = []
conf.build_mrbtest_lib_only
conf.gem :core => "mruby-toplevel-ext"
conf.gem :core => "mruby-fiber"
conf.gem '../mruby-direct'
end
クロスコンパイラの設定は構築したビルド環境に準じます。チューニングパラメータは
¥1,650で買えるARM基板STM32F4DISCOVERYでmrubyを動かすをコピペしてます。ここは他力本願。後はVSなりCygwinなりのWindowsビルド環境のコンソールでmakeすれば完成です。
ターゲットプログラムのビルド
ライブラリが完成したら、それを組み込みます。Makefileに追記します。
# mruby flags
MRUBY_PATH = c:/Devz/prj/mruby/mruby/
MRUBY_CFLAGS = -I$(MRUBY_PATH)include
MRUBY_LFLAGS = $(MRUBY_PATH)build/STM32F4/lib/libmruby.a
後はMRUBY_CFLAGS/MRUBY_LFLAGSをコンパイラ/リンカのオプションに追加するだけです。mrubyの組込み方法は説明を省きます。
その他バッドノウハウ等
これで一通り問題ないはずですが、gcc4.8だとリンカでmemmoveがないと蹴られます。gccのバージョンを一つ落して4.7でビルドすると解決します。4.8の解決策は追求してません。
mrubyはヒープを多く消費します。ですのでリンカスクリプト等で十分なメモリを確保する必要があります。ARMマイコンでしたらねむいさんのぶろぐでメモリ確保のノウハウが入手できます。ここも他力本願。
終りに
Windows向けの内容でしたが、使用するツールはMacでもLinux/BSDでも同じですので、他のOSでも同じく構築はできます。ただし、openocdがgccでないとコンパイルできない等、OS毎にバッドノウハウがありますので注意が必要です。
御精讀、ありがたうございました。