読者です 読者をやめる 読者になる 読者になる

.logbook

学んだことを書き綴る、言わば航海日誌です。

mrubyにおけるmrbgemsの設定方法

mruby

mrubyは軽量に動作することを前提としたVMであるため、Rubyのように機能が豊富ではない。また、requireで動的にモジュールを読み込むこともできない。従って機能を追加するためには、追加機能のソースを入手し一緒にビルドしておく必要がある。

機能を追加するためにはmrbgemsを利用する。要はRubyGemsのようなもので、パッケージ単位で機能追加・削除ができる。追加手順は以下の通り。

build_config.rbの読み方

mrubyのビルド設定は「mruby/build_config.rb」に記述する。

build_config.rbはクローンした時点で以下の様な構成となっている。

build_config.rb(抜粋)

# ホスト用ビルドの設定(デバッグモード無効)
MRuby::Build.new do |conf|
  (対象とするツールチェーン・mrbgems・コンパイルオプションを記述)
end

# ホスト用ビルドの設定(デバッグモード有効)
MRuby::Build.new('host-debug') do |conf|
  (対象とするツールチェーン・mrbgems・コンパイルオプションを記述)
end

「MRuby::Build.new~end」が1つのビルド構成となっている。構成は複数記述することが可能である。例えば、mrubyを実機上に載せる際はクロスビルド用の設定をこの後に記述する。

gemboxの活用

「MRuby::Build.new~end」の内部を見ると、以下のような記述があるだろう。(ここではデバッグモード有効の場合を読むものとする。)

build_config.rb(抜粋)

  # include the default GEMs
  conf.gembox 'default'

  (省略)

  # Generate mruby debugger command (require mruby-eval)
  conf.gem :core => "mruby-bin-debugger"

「conf.gembox 'default'」は「デフォルトのmrbgemsをビルド対象にする」ことを示す。デフォルトのmrbgemsは「mruby/mrbgems/default.gembox」を参照すると確認できる。

default.gembox

MRuby::GemBox.new do |conf|
  # Use standard Kernel#sprintf method
  conf.gem :core => "mruby-sprintf"

  # Use standard print/puts/p
  conf.gem :core => "mruby-print"

  # Use standard Math module
  conf.gem :core => "mruby-math"

  # Use standard Time class
  conf.gem :core => "mruby-time"
  
  (省略)
end

要はデフォルトでビルド対象としているmrbgemsを指定しているのである。mruby-mathやmruby-timeなど、mrubyでよく用いるmrbgemsが指定されていることがわかる。

このように、.gemboxファイルを作成しておくとビルド対象とするmrbgemsをセットで指定・削除できる。環境毎に使用するmrbgemsを切り替える際に便利である。

mrbgemsを追加する

以上の説明から「build_config.rb」または「default.gembox」に使用するmrbgemsの記述を追加すれば良い。

  # mruby-socketを追加
  conf.gem :core => "mruby-socket"

しかし、これではmruby/mrbgems配下にmruby-socketのファイル一式をコピーしておかねばならず、面倒である。よってこのように指定すると良い。

  # mruby-socketを追加
  conf.gem :git => 'https://github.com/iij/mruby-socket.git'

このように指定するとGithubからmruby-socketが自動的にクローンされ、ビルドされる。

尚、default.gemboxはあくまでデフォルトなので変更しないことを推奨する。

ビルドする

mruby直下でmakeコマンドを実行すると、mruby, mrbgemsがビルドされる。

$ make clean
ruby ./minirake clean
(in /home/yuhei/Documents/mruby)
GIT CHECKOUT master 
Already on 'master'
Your branch is up-to-date with 'origin/master'.
GIT CHECKOUT master 
Already on 'master'
Your branch is up-to-date with 'origin/master'.

mruby-socketがGithubからクローンされた。しかし、ビルドはエラーとなる。

rake aborted!
The GEM 'mruby-socket' depends on the GEM 'mruby-io' but it could not be found
Rakefile:26:in `load'
make: *** [clean] エラー 1

mruby-socketを使用するためにはmruby-ioが必要であると指摘されているので、追加する。mruby-packも必要なため併せて追加する。

  # mruby-socketを追加
  conf.gem :git => 'https://github.com/iij/mruby-pack.git'
  conf.gem :git => 'https://github.com/iij/mruby-io.git'
  conf.gem :git => 'https://github.com/iij/mruby-socket.git'

改めてmakeすると、ビルドに成功する。

f:id:ylgbk:20150201172452p:plain

mirbで確認する。

yuhei@yuhei-VirtualBox:~/Documents/mruby$ mirb
mirb - Embeddable Interactive Ruby Shell

> sock = TCPSocket.open "google.co.jp", 80
 => #<TCPSocket:0x95bb450>
> sock.close
 => nil
>