mrubyの初手

2019-08-07#mruby

環境構築からmrubyを実行するCのコードをビルドするまで。

環境構築

$ mkdir hello-mruby
$ cd hello-mruby
$ vi Dockerfile
+FROM ruby:1.9
+RUN apt update && \
+  apt install -y bison --no-install-recommends && \
+  git clone https://github.com/mruby/mruby && \
+  cd mruby && \
+  ./minirake
+ENV PATH /mruby/bin:$PATH
+CMD ["bash"]
$ docker build . -t naoty/hello-mruby
$ docker run -it --rm naoty/hello-mruby
% mirb
mirb - Embeddable Interactive Ruby Shell
 
> MRUBY_VERSION
 => "2.0.1"
> exit
% exit

サンプルコードを追加する

$ vi Dockerfile
 FROM ruby:1.9
 RUN apt update && \
   apt install -y bison --no-install-recommends && \
   git clone https://github.com/mruby/mruby && \
   cd mruby && \
   ./minirake
 ENV PATH /mruby/bin:$PATH
+WORKDIR /hello-mruby
+COPY . /hello-mruby/
 CMD ["bash"]
$ vi hello.rb
+puts "Hello, mruby!"
$ docker build . -t naoty/hello-mruby
$ docker run -it --rm -v $(pwd):/hello-mruby naoty/hello-mruby
% mrbc hello.rb
% exit

Cからmrubyを実行する

$ vi hello.c
+#include <mruby.h>
+#include <mruby/dump.h>
+#include <stdio.h>
+
+int main() {
+  mrb_state *mrb = mrb_open();
+
+  FILE *fd = fopen("hello.mrb", "r");
+  mrb_load_irep_file(mrb, fd);
+
+  mrb_close(mrb);
+
+  return 0;
+}
$ docker run -it --rm -v $(pwd):/hello-mruby naoty/hello-mruby
% gcc hello.c -I/mruby/include -L/mruby/build/host/lib -lmruby -lm -o hello
% ./hello
Hello, mruby!

追記

とのことなので、ベースイメージをruby:2.6にしてみたけど問題なく上記の手順ができた。