mrubyにおけるmrbgemsの設定方法
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すると、ビルドに成功する。
mirbで確認する。
yuhei@yuhei-VirtualBox:~/Documents/mruby$ mirb mirb - Embeddable Interactive Ruby Shell > sock = TCPSocket.open "google.co.jp", 80 => #<TCPSocket:0x95bb450> > sock.close => nil >