Kishima's Hateda log

はてなダイアリー記事の保管庫

WebrubyをMacにインストールしてみる


webrubyとは、ブラウザの上でrubyを動かしてしまおうというものです。
http://qiezi.me/talks/rubykaigi2013/index.html#/
https://github.com/xxuejie/webruby
RubyKaigi2013でのお話を聞いて、試してたくなったので、開発環境の準備をしてみた。

↓を参考に。
http://qiezi.me/2013/01/09/webruby-1-2-3-tutorial/

Emscriptenが必要→LLVMが必要→Homebrewあった方がいいな→macports消さないと

という感じで色々準備が必要だった。

ruby -e "$(curl -fsSL https://raw.github.com/mxcl/homebrew/go)"

Emscriptenのインストール
https://gist.github.com/nathanhammond/1974955

LLVMバージョンが3.2である必要があるらしいが、デフォルトだと3.3がインストールされてしまったので、下記の手順で修正。
なるほど、git checkout で切り替えるのかー。

$ brew versions llvm
3.3      git checkout c4cc4cc /usr/local/Library/Formula/llvm.rb
3.2      git checkout f8f4ca1 /usr/local/Library/Formula/llvm.rb
3.1      git checkout 7d15192 /usr/local/Library/Formula/llvm.rb
$ cd /usr/local/Library/Formula
$ git checkout f8f4ca1 /usr/local/Library/Formula/llvm.rb
$ brew info llvm
llvm: stable 3.2 (bottled), HEAD
http://llvm.org/
Not installed
From: https://github.com/mxcl/homebrew/commits/master/Library/Formula/llvm.rb
==> Options
--all-targets
	Build all target backends
--disable-assertions
	Speeds up LLVM, but provides less debug information
--disable-shared
	Don't build LLVM as a shared library
--rtti
	Build with C++ RTTI
--universal
	Build a universal binary
--with-asan
	Include support for -faddress-sanitizer (from compiler-rt)
--with-clang
	Build Clang C/ObjC/C++ frontend
--without-python
	Build without python support
==> Caveats
For non-homebrew python (2.x), you need to amend your PYTHONPATH like so:
  export PYTHONPATH=/usr/local/lib/python2.7/site-packages:$PYTHONPATH
Extra tools are installed in /usr/local/Cellar/llvm/3.2/share/llvm and /usr/local/Cellar/llvm/3.2/share/clang.

If you already have LLVM installed, then "brew upgrade llvm" might not work.
Instead, try:
    brew rm llvm && brew install llvm
$ brew install llvm --with-clang

これで準備はできたので、webrubyのビルドへ。

$ git clone git://github.com/xxuejie/webruby.git
$ git submodule init && git submodule update

build_config.rb中の下記の行のコメントを外す。

conf.gem :git => 'git://github.com/xxuejie/mruby-js.git', :branch => 'master' # This is the line to uncomment!

rake mrbtest を実行して、問題なければbuildディレクトリ以下に、webruby.jsが出来上がっている。
mruby、emscriptenはmodulesディレクトリ以下に収まっている。
appディレクトリにある*.rbのソースコードは自動的にコンパイルされて組み込まれるそうだ。
後はこれをHTML上で読み込んで、案内にあるサンプルの通り呼び出せば、mrubyが動いていることが確認できた。

<!DOCTYPE html>
<html>
  <head>
    <title>Webruby tutorial</title>
    <script src="http://cdnjs.cloudflare.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
    <script src="webruby.js"></script>
  </head>
  <body>
    <h1>This is a skeleton for Webruby tutorial!</h1>
    <div id="container"></div>
    <script>
      $(document).ready(function() {
        var mrb = WEBRUBY();

        /* Runs embedded source code in mruby.js file. */
        mrb.run();

        mrb.close();
      });
    </script>
  </body>
</html>

動的にテキストを読み込んで実行することも可能。
そのときは"mrb.run_source(source)"を実行する。
mruby→JSの呼び出しと、コールバック登録ができることは確認出来た。
ただ、JS→mrubyでコールバックを呼ぶ時にオブジェクトを引数に入れると、繰り返し呼んでいるうちにスタックが溢れてしまうという現象が起きた。setjmpやらlongjmpがからむemscriptenの問題らしいが、詳しくは分からない。

いやしかし、すごいものだ。