コンピュータを楽しもう!!

今、自分が面白くていろいろやってみたことを書き綴りたいと思います。連絡先はtarosa.yでgmail.comです。

GR-SAKURAでmrubyを動かす (2)

GR-SAKURAのローカルビルド環境で、mrubyをビルドしたいと思います。目的はGR-SAKURA用の libmruby.a を作成することです。

mruby最新版をダウンロードします

mrubyの最新版をgithubからダウンロードしてきます。右側にある「Download ZIP」からダウンロードできます。
ダウンロードしたらcygwinのホームのどこかに解凍します。私は~/gr-sakura/mruby/mruby-master/以下に解凍しました。

minao@tarosa8 ~/gr-sakura/mruby/mruby-master
$ ls -l
合計 72
-rwxr-xr-x  1 minao None   452 104 15:27 AUTHORS
drwxr-xr-x+ 1 minao None     0 106 16:06 benchmark
drwxr-xr-x+ 1 minao None     0 106 16:06 bin
-rwxr-xr-x  1 minao None  2538 104 15:27 build_config.rb
-rwxr-xr-x  1 minao None   409 104 15:27 ChangeLog
-rwxr-xr-x  1 minao None  2219 104 15:27 CONTRIBUTING.md
drwxr-xr-x+ 1 minao None     0 106 16:06 doc
drwxr-xr-x+ 1 minao None     0 106 16:06 examples
drwxr-xr-x+ 1 minao None     0 106 16:06 include
-rwxr-xr-x  1 minao None   717 104 15:27 INSTALL
-rwxr-xr-x  1 minao None   176 104 15:27 LEGAL
-rwxr-xr-x  1 minao None   279 104 15:27 Makefile
-rwxr-xr-x  1 minao None 13088 104 15:27 minirake
-rwxr-xr-x  1 minao None  1073 104 15:27 MITL
drwxr-xr-x+ 1 minao None     0 106 16:06 mrbgems
drwxr-xr-x+ 1 minao None     0 106 16:06 mrblib
-rwxr-xr-x  1 minao None   343 104 15:27 NEWS
-rwxr-xr-x  1 minao None  3728 104 15:27 Rakefile
-rwxr-xr-x  1 minao None  4575 104 15:27 README.md
drwxr-xr-x+ 1 minao None     0 106 16:06 src
drwxr-xr-x+ 1 minao None     0 106 16:06 tasks
drwxr-xr-x+ 1 minao None     0 106 16:06 test
-rwxr-xr-x  1 minao None   326 104 15:27 TODO
drwxr-xr-x+ 1 minao None     0 106 16:06 tools
-rwxr-xr-x  1 minao None   135 104 15:27 travis_config.rb

省メモリを考えた設定をする

GR-SAKURAはRAMが128KBと少ないので、少ないRAMでも動くようにinclude/mrbconfig.hを修正します。
Floatを使うようにします。

/* add -DMRB_USE_FLOAT to use float instead of double for floating point numbers */
#define MRB_USE_FLOAT

引数は6個までにします

/* argv max size in mrb_funcall */
#define MRB_FUNCALL_ARGC_MAX 6

ヒープページを32にします。

/* number of object per heap page */
#define MRB_HEAP_PAGE_SIZE 32

インスタンスの管理をハッシュ形式からセグメントリスト管理にします。

/* use segmented list for IV table */
#define MRB_USE_IV_SEGLIST

kハッシュテーブルのデフォルトサイズを2にします。

/* default size of khash table bucket */
#define KHASH_DEFAULT_SIZE 2

メモリプールのページサイズを256にします。

/* page size of memory pool */
#define POOL_PAGE_SIZE 256

以上の内容を書き換えます。

ロスコンパイル用コードの追加

build_config.rbに、GR-SAKURA用のクロスコンパイルコードを追記します。この追加コードでは、mrbgemのmruby-mathをインポートしています。また、toolchainにgrsakuraを作成する必要が有ります。

# Cross build for GR-SAKURA
MRuby::CrossBuild.new('grsakura') do |conf|
   toolchain :grsakura

#   conf.cc.flags << "-m32"
#   conf.linker.flags << "-m32"
#
#   conf.build_mrbtest_lib_only
#
#   conf.gem "#{root}/mrbgems/mruby-sprintf"
   conf.gem "#{root}/mrbgems/mruby-math"
#
#   conf.test_runner.command = 'env'
#
end

GR-SAKURA用のrakeファイルを作成する

tasks/toolchains/に、grsakura.rakeファイルを作成します。

MRuby::Toolchain.new(:grsakura) do |conf|
  toolchain :gcc

  TOOL_PATH = "/usr/local/tkdn-20110720/rx-elf/bin"

  conf.cc do |cc|
    cc.command="#{TOOL_PATH}/rx-elf-gcc"
    cc.flags << "-Wall -g -O2"
    cc.compile_options = "%{flags} -o %{outfile} -c %{infile}"

    conf.linker do |linker|
      linker.command="#{TOOL_PATH}/rx-elf-ld"
    end
    conf.archiver do |archiver|
      archiver.command = "#{TOOL_PATH}/rx-elf-ar"
      archiver.archive_options = 'rcs %{outfile} %{objs}'
    end
  end

  conf.bins = []
end

この内容は、 jjzakさんの「GR-SAKURAでmrubyを使う」を参考に作成しています。

makeする

これでmakeすればbuild/grsakura/フォルダができ、GR-SAKURA用のlibmruby.aが作成されます。

$ make
ruby ./minirake
(in /home/minao/gr-sakura/mruby/mruby-master)
CC    tools/mrbc/mrbc.c -> build/host/tools/mrbc/mrbc.o
CC    src/array.c -> build/host/src/array.o
CC    src/backtrace.c -> build/host/src/backtrace.o
CC    src/class.c -> build/host/src/class.o
CC    src/codegen.c -> build/host/src/codegen.o
CC    src/compar.c -> build/host/src/compar.o
...
Build summary:

================================================
      Config Name: host
 Output Directory: build/host
         Binaries: mrbc
    Included Gems:
             mruby-sprintf - 0.0.0
             mruby-print - 0.0.0
             mruby-math - 0.0.0
             mruby-time - 0.0.0
             mruby-struct - 0.0.0
             mruby-enum-ext - 0.0.0
             mruby-string-ext - 0.0.0
             mruby-numeric-ext - 0.0.0
             mruby-array-ext - 0.0.0
             mruby-hash-ext - 0.0.0
             mruby-range-ext - 0.0.0
             mruby-proc-ext - 0.0.0
             mruby-symbol-ext - 0.0.0
             mruby-random - 0.0.0
             mruby-object-ext - 0.0.0
             mruby-objectspace - 0.0.0
             mruby-fiber - 0.0.0
             mruby-toplevel-ext - 0.0.0
             mruby-bin-mirb - 0.0.0
               - Binaries: mirb
             mruby-bin-mruby - 0.0.0
               - Binaries: mruby
================================================

================================================
      Config Name: grsakura
 Output Directory: build/grsakura
    Included Gems:
             mruby-math - 0.0.0
================================================

以上です。