mrubyをビルドしてみる
昨晩は京都でGithub創業者の方の講演会に行ってきました。
講演内容についてまとめたいのですが、うまくまとまらないので気が向いたら書こうと思います。
ただ、今日の講演会はかなり刺激を受けました!
先月はrubyビジネスセミナーやFirefoxOSおさわり会にも参加したのですがネタはあるのですが…
苦にならないようにして続けてゆきたいと思うので、今回は勉強会レポートと違う内容について書きます。
前置きが長くなりましたが、記事タイトルの通りmrubyのビルドをしてみました。
なお、ビルドはUbuntu 12.04 LTS 64bit版で行いました。
mrubyはGithubで開発されていますので、そちらのリポジトリからソースコードを取得してmakeします。
gitが入っていない場合はgitの導入から行う必要があります。
$ sudo aptitude install git-core $ git clone https://github.com/mruby/mruby.git $ cd mruby $ make ruby ./minirake make: ruby: コマンドが見つかりませんでした make: *** [all] エラー 127
おっと、rubyが入っていないようです(調べてみると最近のビルドからrakeを使うようになったので必要らしい)。
rubyも最新版を使うためにビルドしてみようかと思いましたが、今回は省略してaptでrubyを導入することにしました。
$ sudo aptitude install ruby1.9.3 $ ruby -v ruby 1.9.3p0 (2011-10-30 revision 33570) [x86_64-linux]
表示された日付からも古いバージョンであることがわかります。
後々rubyも自力ビルドをしたいと思います。
rubyを入れて再びmakeを実行。
$ make ruby ./minirake (in /home/yosuke/mruby) CC tools/mruby/mruby.c -> build/host/tools/mruby/mruby.o CC src/init.c -> build/host/src/init.o CC src/crc.c -> build/host/src/crc.o CC src/math.c -> build/host/src/math.o CC src/object.c -> build/host/src/object.o CC src/compar.c -> build/host/src/compar.o CC src/array.c -> build/host/src/array.o CC src/numeric.c -> build/host/src/numeric.o CC src/dump.c -> build/host/src/dump.o CC src/regerror.c -> build/host/src/regerror.o CC src/gc.c -> build/host/src/gc.o CC src/st.c -> build/host/src/st.o CC src/error.c -> build/host/src/error.o CC src/regparse.c -> build/host/src/regparse.o CC src/regexec.c -> build/host/src/regexec.o CC src/proc.c -> build/host/src/proc.o CC src/string.c -> build/host/src/string.o CC src/re.c -> build/host/src/re.o CC src/state.c -> build/host/src/state.o CC src/hash.c -> build/host/src/hash.o CC src/print.c -> build/host/src/print.o CC src/regcomp.c -> build/host/src/regcomp.o CC src/vm.c -> build/host/src/vm.o CC src/kernel.c -> build/host/src/kernel.o CC src/sprintf.c -> build/host/src/sprintf.o CC src/class.c -> build/host/src/class.o CC src/time.c -> build/host/src/time.o CC src/pool.c -> build/host/src/pool.o CC src/etc.c -> build/host/src/etc.o CC src/range.c -> build/host/src/range.o CC src/codegen.c -> build/host/src/codegen.o CC src/regenc.c -> build/host/src/regenc.o CC src/variable.c -> build/host/src/variable.o CC src/symbol.c -> build/host/src/symbol.o CC src/load.c -> build/host/src/load.o CC src/enum.c -> build/host/src/enum.o CC src/struct.c -> build/host/src/struct.o YACC src/parse.y -> build/host/src/y.tab.c sh: 1: bison: not found rake aborted! Command Failed: ["bison" -o "build/host/src/y.tab.c" "src/parse.y"] make: *** [all] エラー 1
今度はbisonが無いと怒られてしまいました。
これも追加します。
$ sudo aptitude install bison $ ruby ./minirake (in /home/yosuke/mruby) CC tools/mruby/mruby.c -> build/host/tools/mruby/mruby.o CC src/dump.c -> build/host/src/dump.o CC src/class.c -> build/host/src/class.o CC src/etc.c -> build/host/src/etc.o CC src/regparse.c -> build/host/src/regparse.o CC src/regenc.c -> build/host/src/regenc.o CC src/gc.c -> build/host/src/gc.o CC src/crc.c -> build/host/src/crc.o CC src/init.c -> build/host/src/init.o CC src/string.c -> build/host/src/string.o CC src/proc.c -> build/host/src/proc.o CC src/math.c -> build/host/src/math.o CC src/range.c -> build/host/src/range.o CC src/load.c -> build/host/src/load.o CC src/vm.c -> build/host/src/vm.o CC src/variable.c -> build/host/src/variable.o CC src/struct.c -> build/host/src/struct.o CC src/symbol.c -> build/host/src/symbol.o CC src/compar.c -> build/host/src/compar.o CC src/re.c -> build/host/src/re.o CC src/regcomp.c -> build/host/src/regcomp.o CC src/codegen.c -> build/host/src/codegen.o CC src/state.c -> build/host/src/state.o CC src/array.c -> build/host/src/array.o CC src/object.c -> build/host/src/object.o CC src/enum.c -> build/host/src/enum.o CC src/error.c -> build/host/src/error.o CC src/regexec.c -> build/host/src/regexec.o CC src/kernel.c -> build/host/src/kernel.o CC src/pool.c -> build/host/src/pool.o CC src/print.c -> build/host/src/print.o CC src/regerror.c -> build/host/src/regerror.o CC src/sprintf.c -> build/host/src/sprintf.o CC src/hash.c -> build/host/src/hash.o CC src/numeric.c -> build/host/src/numeric.o CC src/time.c -> build/host/src/time.o CC src/st.c -> build/host/src/st.o YACC src/parse.y -> build/host/src/y.tab.c CC build/host/src/y.tab.c -> build/host/src/y.tab.o CC tools/mrbc/mrbc.c -> build/host/tools/mrbc/mrbc.o AR build/host/lib/libmruby_core.a ar: creating build/host/lib/libmruby_core.a LD build/host/bin/mrbc GEN *.rb -> build/host/mrblib/mrblib.c MRBC mrblib/print.rb MRBC mrblib/hash.rb MRBC mrblib/range.rb MRBC mrblib/string.rb MRBC mrblib/array.rb MRBC mrblib/struct.rb MRBC mrblib/enum.rb MRBC mrblib/compar.rb MRBC mrblib/kernel.rb MRBC mrblib/class.rb MRBC mrblib/numeric.rb MRBC mrblib/error.rb CC build/host/mrblib/mrblib.c -> build/host/mrblib/mrblib.o AR build/host/lib/libmruby.a ar: creating build/host/lib/libmruby.a LD build/host/bin/mruby CC tools/mirb/mirb.c -> build/host/tools/mirb/mirb.o LD build/host/bin/mirb Build summary: ================================================ Config Name: host Output Directory: build/host Binaries: mruby, mrbc, mirb ================================================
Build summaryによると出力先がbuild/hostらしいので中を見てみます。
$ ls build/host bin lib mrblib src tools $ ls -l build/host/bin/ 合計 5524 -rwxrwxr-x 1 yosuke yosuke 1888644 2月 1 22:50 mirb -rwxrwxr-x 1 yosuke yosuke 1871826 2月 1 22:50 mrbc -rwxrwxr-x 1 yosuke yosuke 1891408 2月 1 22:50 mruby
mirbは対話型環境、mrbcはコンパイラ、mrubyはVMらしいです。
これでビルドは終了です。
ビルドができたので、プログラムの実行も試してみました。
GithubのmrubyページにHello Warldと実行方法が書いてあるので、こちらのページの通りに進めました。
https://github.com/mruby/mruby/wiki/Hello-World
下記のコードはGithubからの転載です。
・hello.c
#include <stdlib.h> #include <stdio.h> /* Include the mruby header */ #include <mruby.h> #include <mruby/compile.h> int main(void) { mrb_state *mrb = mrb_open(); char code[] = "p 'hello world!'"; printf("Executing Ruby code from C!\n"); mrb_load_string(mrb, code); return 0; }
コードの意味も、gccのオプションも何も考えずにコンパイルしてみます(おいおい調べます…)。
$ gcc -Iinclude hello.c lib/libmruby.a -lm -o hello.out gcc: エラー: mruby/lib/libmruby.a: そのようなファイルやディレクトリはありません
早速、ライブラリlibmruby.aが無いといわれてしまいました!
findコマンドで調べても見つからないので、うーんと唸ってTwitterにつぶやくとすぐに助け船がやってきました。
@masuidriveさん、ありがとうございます!
mrubyをビルドしたので、今度はプログラムをコンパイルしようとしたが、リンクする必要のあるlibmruby.aなんてどこにも無いぞ…
@fox_twitting build/host/lib/libmruby.a を確認して貰えますか?
$ ls -l build/host/lib/ 合計 7480 -rw-rw-r-- 1 yosuke yosuke 3840040 2月 1 22:50 libmruby.a -rw-rw-r-- 1 yosuke yosuke 192 2月 1 22:50 libmruby.flags.mak -rw-rw-r-- 1 yosuke yosuke 3809320 2月 1 22:50 libmruby_core.a
libmruby.aがbuild/host/libの中にありました。
(findがちゃんと使えてなかったのか… 見返すとビルドメッセージにも出力されています。)
パスを変更して再度コンパイルします。
$ gcc -Imruby/include -Imruby/include/mruby hello.c mruby/build/host/lib/libmruby.a -lm -ohello.o $ ls hello.o hello.o
エラーも無く、oファイルが生成されました!
生成されたhello.oを実行してみます。
$ ./hello.o Executing Ruby code from C! "hello world!"
正しく実行されたので、これでmrubyを開発する環境ができました!
因みに、ビルドしたmrubyディレクトリの直下にlib/libmruby.aが存在しない件についても以下のコメントをいただきました。
@masuidrive mruby/build/host/binのコンパイラやシェルはmruby/binに入るのに、mruby/build/host/mruby/libのlibmruby.aはmruby/libが無いんですね。
2013-02-02 13:50:06 via twicca to @masuidrive
@fox_twitting コピーしたほうがいいですね
確かに、binディレクトリと階層構造を揃えておくとわかりやすいと思いますので、libディレクトリを新たに作ってその中にlibmruby.aを置くことにします。
$ mkdir lib $ cp build/host/lib/* lib/ $ ls lib libmruby.a libmruby.flags.mak libmruby_core.a
スクリプト言語をひとつくらい扱えるようになりたいと思っていたところ、組み込みに利用できるmrubyを知ってrubyに興味が湧きました。
今後はruby、mrubyの勉強してみようと思っています!
(良いrubyの参考書があれば教えてください。)