2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

mruby/c をPCで動かす

Last updated at Posted at 2025-08-18

しまねソフト研究開発センター(略称 ITOC)にいます、東です。
マイクロコントローラ(マイコン)向けmruby実行環境である、mruby/c を開発しています。マイコン向けとはいえPCで動かすことは可能ですし、実際、開発にあたり私は主にMacを使っています。今回は、PC (Windows, Mac, FreeBSD) 上で mruby/c を動かす方法について説明します。

目標・方針

1. Windows
WSL + Ubuntu 環境を作り、gcc でビルドして動かす。
2. Mac
Xcodeを使い、clangでビルドして動かす。
3. FreeBSD
clangでビルドして動かす。

Windows編

WSL インストール&環境設定

まず、WSL + Ubuntu をインストールします。
こちら の記事などを参考に、WSLとUbuntuをインストールし、初期設定を済ませます。

wsl --install

Ubuntu のコンソールで、必要なパッケージを導入します。

sudo apt install make gcc ruby
  • make ビルドツール
  • gcc Cコンパイラ
  • ruby この後の mrubyコンパイラのビルドに必要。mruby/c のみのビルドならば不要。

mruby/c のビルド

作業は全て ~/work ディレクトリ下で行う事を前提とします。

ソースコードの準備

github のリポジトリより、ソースコードパッケージを取得します。ここでは、3.4リリース版を使う手順を説明しますので、https://github.com/mrubyc/mrubyc/releases から、release3.4 の Source code (tar.gz) をダウンロードします。

ダウンロードしたファイルを、Ubuntu の環境にコピーします。エクスプローラーの左ペインに、Linux の項目ができているので、ここから対象ホームディレクトリへコピーすることもできますし、Ubuntuの環境からコマンドラインでコピーをすることもできます。

以下は、Ubuntuコマンドラインからコピーする方法です。

cd
mkdir work
cd work
cp /mnt/c/Users/(ユーザ名)/Downloads/mrubyc-release3.4.tar.gz .

Ubuntuコマンドラインで、ソースコードを展開します。

tar xfz mrubyc-release3.4.tar.gz

ビルド

以下のコマンドラインによりビルドします。

cd mrubyc-release3.4
make
ビルド出力結果(折りたたみ)
$ make
cd mrblib   ; make all
make[1]: Entering directory '/home/hirohito/work/mrubyc-release3.4/mrblib'
make[1]: Nothing to be done for 'all'.
make[1]: Leaving directory '/home/hirohito/work/mrubyc-release3.4/mrblib'
cd src      ; make all
make[1]: Entering directory '/home/hirohito/work/mrubyc-release3.4/src'
cc -c -I../hal/posix -Wall -g    -o ../build/alloc.o alloc.c
cc -c -I../hal/posix -Wall -g    -o ../build/c_array.o c_array.c
cc -c -I../hal/posix -Wall -g    -o ../build/c_hash.o c_hash.c
cc -c -I../hal/posix -Wall -g    -o ../build/c_math.o c_math.c
cc -c -I../hal/posix -Wall -g    -o ../build/c_numeric.o c_numeric.c
cc -c -I../hal/posix -Wall -g    -o ../build/c_object.o c_object.c
cc -c -I../hal/posix -Wall -g    -o ../build/c_proc.o c_proc.c
cc -c -I../hal/posix -Wall -g    -o ../build/c_range.o c_range.c
cc -c -I../hal/posix -Wall -g    -o ../build/c_string.o c_string.c
cc -c -I../hal/posix -Wall -g    -o ../build/class.o class.c
cc -c -I../hal/posix -Wall -g    -o ../build/console.o console.c
cc -c -I../hal/posix -Wall -g    -o ../build/error.o error.c
cc -c -I../hal/posix -Wall -g    -o ../build/global.o global.c
cc -c -I../hal/posix -Wall -g    -o ../build/keyvalue.o keyvalue.c
cc -c -I../hal/posix -Wall -g    -o ../build/load.o load.c
cc -c -I../hal/posix -Wall -g    -o ../build/mrblib.o mrblib.c
cc -c -I../hal/posix -Wall -g    -o ../build/rrt0.o rrt0.c
cc -c -I../hal/posix -Wall -g    -o ../build/symbol.o symbol.c
cc -c -I../hal/posix -Wall -g    -o ../build/value.o value.c
cc -c -I../hal/posix -Wall -g    -o ../build/vm.o vm.c
cc -c -I../hal/posix -Wall -g    -o ../build/hal.o ../hal/posix/hal.c
ar rv ../build/libmrubyc.a ../build/alloc.o ../build/c_array.o ../build/c_hash.o ../build/c_math.o ../build/c_numeric.o ../build/c_object.o ../build/c_proc.o ../build/c_range.o ../build/c_string.o ../build/class.o ../build/console.o ../build/error.o ../build/global.o ../build/keyvalue.o ../build/load.o ../build/mrblib.o ../build/rrt0.o ../build/symbol.o ../build/value.o ../build/vm.o ../build/hal.o
ar: creating ../build/libmrubyc.a
a - ../build/alloc.o
a - ../build/c_array.o
a - ../build/c_hash.o
a - ../build/c_math.o
a - ../build/c_numeric.o
a - ../build/c_object.o
a - ../build/c_proc.o
a - ../build/c_range.o
a - ../build/c_string.o
a - ../build/class.o
a - ../build/console.o
a - ../build/error.o
a - ../build/global.o
a - ../build/keyvalue.o
a - ../build/load.o
a - ../build/mrblib.o
a - ../build/rrt0.o
a - ../build/symbol.o
a - ../build/value.o
a - ../build/vm.o
a - ../build/hal.o
make[1]: Leaving directory '/home/hirohito/work/mrubyc-release3.4/src'
cd sample_c ; make all
make[1]: Entering directory '/home/hirohito/work/mrubyc-release3.4/sample_c'
cc -I../hal/posix -I../src -Wall -g   -o sample_scheduler sample_scheduler.c ../build/libmrubyc.a
cc -I../hal/posix -I../src -Wall -g   -o sample_no_scheduler sample_no_scheduler.c ../build/libmrubyc.a
cc -I../hal/posix -I../src -Wall -g   -o sample_include sample_include.c ../build/libmrubyc.a
cc -I../hal/posix -I../src -Wall -g   -o sample_concurrent sample_concurrent.c ../build/libmrubyc.a
cc -I../hal/posix -I../src -Wall -g   -o sample_myclass sample_myclass.c ../build/libmrubyc.a
make[1]: Leaving directory '/home/hirohito/work/mrubyc-release3.4/sample_c'

sample_c ディレクトリに、C言語で mruby/c VM を使う例が入っており、ビルドが成功すると、実行ファイルも同ディレクトリへ配置されます。

$ ls sample_c/
Makefile             sample_include.c            sample_myclass.c       sample_scheduler.c
sample_concurrent    sample_include_bytecode.c   sample_no_scheduler
sample_concurrent.c  sample_include_bytecode.rb  sample_no_scheduler.c
sample_include       sample_myclass              sample_scheduler

mrbc コンパイラのビルド

ソースコードの準備

github のリポジトリより、ソースコードパッケージを取得します。
mruby/cのバージョンと、mrbcコンパイラのバージョンには関連性があります。詳しくは、https://github.com/mrubyc/mrubyc/wiki/mruby-compiler-version-vs-mruby-c-vm を確認してください。
ここでは、3.4.0リリース版を使う手順を説明しますので、https://github.com/mruby/mruby/tags から、3.4.0 の tar.gz をクリックしダウンロードします。

mruby/c の場合と同様に、ダウンロードしたファイルを、Ubuntu の環境にコピーします。
以下は、Ubuntuコマンドラインからコピーする方法です。

cd work
cp /mnt/c/Users/(ユーザ名)/Downloads/mruby-3.4.0.tar.gz .

Ubuntuコマンドラインで、ソースコードを展開します。

tar xfz mruby-3.4.0.tar.gz

ビルド

以下のコマンドラインによりビルドします。

cd mruby-3.4.0
rake MRUBY_CONFIG=mrbc
ビルド出力結果(折りたたみ)
$ rake MRUBY_CONFIG=mrbc
CC    src/allocf.c -> build/host/src/allocf.o
CC    src/array.c -> build/host/src/array.o
CC    src/backtrace.c -> build/host/src/backtrace.o
CC    src/cdump.c -> build/host/src/cdump.o
CC    src/class.c -> build/host/src/class.o
CC    src/codedump.c -> build/host/src/codedump.o
CC    src/debug.c -> build/host/src/debug.o
CC    src/dump.c -> build/host/src/dump.o
CC    src/enum.c -> build/host/src/enum.o
CC    src/error.c -> build/host/src/error.o
CC    src/etc.c -> build/host/src/etc.o
CC    src/fmt_fp.c -> build/host/src/fmt_fp.o
CC    src/gc.c -> build/host/src/gc.o
CC    src/hash.c -> build/host/src/hash.o
CC    src/init.c -> build/host/src/init.o
CC    src/kernel.c -> build/host/src/kernel.o
CC    src/load.c -> build/host/src/load.o
CC    src/mempool.c -> build/host/src/mempool.o
CC    src/numeric.c -> build/host/src/numeric.o
CC    src/numops.c -> build/host/src/numops.o
CC    src/object.c -> build/host/src/object.o
CC    src/print.c -> build/host/src/print.o
CC    src/proc.c -> build/host/src/proc.o
CC    src/range.c -> build/host/src/range.o
CC    src/readfloat.c -> build/host/src/readfloat.o
CC    src/readint.c -> build/host/src/readint.o
CC    src/readnum.c -> build/host/src/readnum.o
CC    src/state.c -> build/host/src/state.o
CC    src/string.c -> build/host/src/string.o
CC    src/symbol.c -> build/host/src/symbol.o
CC    src/variable.c -> build/host/src/variable.o
CC    src/version.c -> build/host/src/version.o
CC    src/vm.c -> build/host/src/vm.o
CC    mrbgems/mruby-compiler/core/codegen.c -> build/host/mrbgems/mruby-compiler/core/codegen.o
YACC  mrbgems/mruby-compiler/core/parse.y -> mrbgems/mruby-compiler/core/y.tab.c
CC    mrbgems/mruby-compiler/core/y.tab.c -> build/host/mrbgems/mruby-compiler/core/y.tab.o
AR    build/host/lib/libmruby_core.a
ar: creating /home/hirohito/work/mruby-3.4.0/build/host/lib/libmruby_core.a
CC    mrbgems/mruby-bin-mrbc/tools/mrbc/mrbc.c -> build/host/mrbgems/mruby-bin-mrbc/tools/mrbc/mrbc.o
CC    mrbgems/mruby-bin-mrbc/tools/mrbc/stub.c -> build/host/mrbgems/mruby-bin-mrbc/tools/mrbc/stub.o
LD    build/host/bin/mrbc
GEN   build/host/bin/mrbc -> bin/mrbc

Build summary:

================================================
      Config Name: host
 Output Directory: build/host
         Binaries: mrbc
    Included Gems:
             mruby-bin-mrbc - mruby compiler executable
             mruby-compiler - mruby compiler library
================================================

ビルドが成功すると、bin ディレクトリ(実際には、build/host/bin)下に、mrbc コマンドが生成されています。

$ ls -l bin
total 0
lrwxrwxrwx 1 hirohito hirohito 22 Aug 18 06:53 mrbc -> ../build/host/bin/mrbc

ここまでできたら、 実行テストへ進みます。

Mac編

Xcode インストール

まず、コンパイラ (Xcode command line tools) をインストールします。

xcode-select --install

インストールが終わると、Cコンパイラが使えるようになります。

% cc -v                 
Apple clang version 14.0.3 (clang-1403.0.22.14.1)
Target: x86_64-apple-darwin22.6.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin

mruby/c のビルド

作業は全て ~/work ディレクトリ下で行う事を前提とします。

ソースコードの準備

github のリポジトリより、ソースコードパッケージを取得します。ここでは、3.4リリース版を使う手順を説明しますので、https://github.com/mrubyc/mrubyc/releases から、release3.4 の Source code (tar.gz) をダウンロードし、展開します。

# あらかじめ、mrubyc-release3.4.tar.gz をブラウザでダウンロードしておく。
cd
mkdir work
cd work
tar xfz ~/Downloads/mrubyc-release3.4.tar.gz

ビルド

以下のコマンドラインによりビルドします。

cd mrubyc-release3.4
make
ビルド出力結果(折りたたみ)
% make
cd mrblib   ; /Library/Developer/CommandLineTools/usr/bin/make all
make[1]: Nothing to be done for `all'.
cd src      ; /Library/Developer/CommandLineTools/usr/bin/make all
cc -c -I../hal/posix -Wall -g    -o ../build/alloc.o alloc.c
cc -c -I../hal/posix -Wall -g    -o ../build/c_array.o c_array.c
cc -c -I../hal/posix -Wall -g    -o ../build/c_hash.o c_hash.c
cc -c -I../hal/posix -Wall -g    -o ../build/c_math.o c_math.c
cc -c -I../hal/posix -Wall -g    -o ../build/c_numeric.o c_numeric.c
cc -c -I../hal/posix -Wall -g    -o ../build/c_object.o c_object.c
cc -c -I../hal/posix -Wall -g    -o ../build/c_proc.o c_proc.c
cc -c -I../hal/posix -Wall -g    -o ../build/c_range.o c_range.c
cc -c -I../hal/posix -Wall -g    -o ../build/c_string.o c_string.c
cc -c -I../hal/posix -Wall -g    -o ../build/class.o class.c
cc -c -I../hal/posix -Wall -g    -o ../build/console.o console.c
cc -c -I../hal/posix -Wall -g    -o ../build/error.o error.c
cc -c -I../hal/posix -Wall -g    -o ../build/global.o global.c
cc -c -I../hal/posix -Wall -g    -o ../build/keyvalue.o keyvalue.c
cc -c -I../hal/posix -Wall -g    -o ../build/load.o load.c
cc -c -I../hal/posix -Wall -g    -o ../build/mrblib.o mrblib.c
cc -c -I../hal/posix -Wall -g    -o ../build/rrt0.o rrt0.c
cc -c -I../hal/posix -Wall -g    -o ../build/symbol.o symbol.c
cc -c -I../hal/posix -Wall -g    -o ../build/value.o value.c
cc -c -I../hal/posix -Wall -g    -o ../build/vm.o vm.c
cc -c -I../hal/posix -Wall -g    -o ../build/hal.o ../hal/posix/hal.c
ar rv ../build/libmrubyc.a ../build/alloc.o ../build/c_array.o ../build/c_hash.o ../build/c_math.o ../build/c_numeric.o ../build/c_object.o ../build/c_proc.o ../build/c_range.o ../build/c_string.o ../build/class.o ../build/console.o ../build/error.o ../build/global.o ../build/keyvalue.o ../build/load.o ../build/mrblib.o ../build/rrt0.o ../build/symbol.o ../build/value.o ../build/vm.o ../build/hal.o
ar: creating archive ../build/libmrubyc.a
a - ../build/alloc.o
a - ../build/c_array.o
a - ../build/c_hash.o
a - ../build/c_math.o
a - ../build/c_numeric.o
a - ../build/c_object.o
a - ../build/c_proc.o
a - ../build/c_range.o
a - ../build/c_string.o
a - ../build/class.o
a - ../build/console.o
a - ../build/error.o
a - ../build/global.o
a - ../build/keyvalue.o
a - ../build/load.o
a - ../build/mrblib.o
a - ../build/rrt0.o
a - ../build/symbol.o
a - ../build/value.o
a - ../build/vm.o
a - ../build/hal.o
/Library/Developer/CommandLineTools/usr/bin/ranlib: file: ../build/libmrubyc.a(c_math.o) has no symbols
cd sample_c ; /Library/Developer/CommandLineTools/usr/bin/make all
cc -I../hal/posix -I../src -Wall -g   -o sample_scheduler sample_scheduler.c ../build/libmrubyc.a
cc -I../hal/posix -I../src -Wall -g   -o sample_no_scheduler sample_no_scheduler.c ../build/libmrubyc.a
cc -I../hal/posix -I../src -Wall -g   -o sample_include sample_include.c ../build/libmrubyc.a
cc -I../hal/posix -I../src -Wall -g   -o sample_concurrent sample_concurrent.c ../build/libmrubyc.a
cc -I../hal/posix -I../src -Wall -g   -o sample_myclass sample_myclass.c ../build/libmrubyc.a

sample_c ディレクトリに、C言語で mruby/c VM を使う例が入っており、ビルドが成功すると、実行ファイルも同ディレクトリへ配置されます。

% ls sample_c/
Makefile                        sample_myclass
sample_concurrent               sample_myclass.c
sample_concurrent.c             sample_myclass.dSYM
sample_concurrent.dSYM          sample_no_scheduler
sample_include                  sample_no_scheduler.c
sample_include.c                sample_no_scheduler.dSYM
sample_include.dSYM             sample_scheduler
sample_include_bytecode.c       sample_scheduler.c
sample_include_bytecode.rb      sample_scheduler.dSYM

mrbc コンパイラのビルド

ソースコードの準備

github のリポジトリより、ソースコードパッケージを取得します。
mruby/cのバージョンと、mrbcコンパイラのバージョンには関連性があります。詳しくは、https://github.com/mrubyc/mrubyc/wiki/mruby-compiler-version-vs-mruby-c-vm を確認してください。
ここでは、3.4.0リリース版を使う手順を説明しますので、https://github.com/mruby/mruby/tags から、3.4.0 の tar.gz をクリックしダウンロードし、展開します。

# あらかじめ、mruby-3.4.0.tar.gz をブラウザでダウンロードしておく。
cd ~/work
tar xfz ~/Downloads/mruby-3.4.0.tar.gz

ビルド

以下のコマンドラインによりビルドします。

cd mruby-3.4.0
rake MRUBY_CONFIG=mrbc
ビルド出力結果(折りたたみ)
% rake MRUBY_CONFIG=mrbc
CC    src/object.c -> build/host/src/object.o
CC    src/kernel.c -> build/host/src/kernel.o
CC    src/print.c -> build/host/src/print.o
CC    src/class.c -> build/host/src/class.o
CC    src/array.c -> build/host/src/array.o
CC    src/cdump.c -> build/host/src/cdump.o
CC    src/etc.c -> build/host/src/etc.o
CC    src/state.c -> build/host/src/state.o
CC    src/init.c -> build/host/src/init.o
CC    src/vm.c -> build/host/src/vm.o
CC    src/mempool.c -> build/host/src/mempool.o
CC    src/allocf.c -> build/host/src/allocf.o
CC    src/string.c -> build/host/src/string.o
CC    src/hash.c -> build/host/src/hash.o
CC    src/codedump.c -> build/host/src/codedump.o
CC    src/debug.c -> build/host/src/debug.o
CC    src/range.c -> build/host/src/range.o
CC    src/fmt_fp.c -> build/host/src/fmt_fp.o
CC    src/dump.c -> build/host/src/dump.o
CC    src/error.c -> build/host/src/error.o
CC    src/backtrace.c -> build/host/src/backtrace.o
CC    src/numeric.c -> build/host/src/numeric.o
CC    src/enum.c -> build/host/src/enum.o
CC    src/symbol.c -> build/host/src/symbol.o
CC    src/proc.c -> build/host/src/proc.o
CC    src/version.c -> build/host/src/version.o
CC    src/readnum.c -> build/host/src/readnum.o
CC    src/numops.c -> build/host/src/numops.o
CC    src/load.c -> build/host/src/load.o
CC    src/readint.c -> build/host/src/readint.o
CC    src/readfloat.c -> build/host/src/readfloat.o
CC    src/variable.c -> build/host/src/variable.o
CC    src/gc.c -> build/host/src/gc.o
CC    mrbgems/mruby-compiler/core/codegen.c -> build/host/mrbgems/mruby-compiler/core/codegen.o
YACC  mrbgems/mruby-compiler/core/parse.y -> mrbgems/mruby-compiler/core/y.tab.c
CC    mrbgems/mruby-compiler/core/y.tab.c -> build/host/mrbgems/mruby-compiler/core/y.tab.o
AR    build/host/lib/libmruby_core.a 
ar: creating archive /Users/hirohito/work/mruby-3.4.0/build/host/lib/libmruby_core.a
CC    mrbgems/mruby-bin-mrbc/tools/mrbc/stub.c -> build/host/mrbgems/mruby-bin-mrbc/tools/mrbc/stub.o
CC    mrbgems/mruby-bin-mrbc/tools/mrbc/mrbc.c -> build/host/mrbgems/mruby-bin-mrbc/tools/mrbc/mrbc.o
LD    build/host/bin/mrbc 
GEN   build/host/bin/mrbc -> bin/mrbc

Build summary:

================================================
      Config Name: host
 Output Directory: build/host
         Binaries: mrbc
    Included Gems:
             mruby-bin-mrbc - mruby compiler executable
             mruby-compiler - mruby compiler library
================================================

ビルドが成功すると、bin ディレクトリ(実際には、build/host/bin)下に、mrbc コマンドが生成されています。

% ls -l bin
total 0
lrwxr-xr-x  1 hirohito  staff  22  8 18 11:52 mrbc -> ../build/host/bin/mrbc

ここまでできたら、 実行テストへ進みます。

FreeBSD編

必要なツールのインストール

ビルドに必要なツールを、pkg コマンドでインストールします。

pkg install gmake rubygem-rake

mruby/c のビルド

作業は全て ~/work ディレクトリ下で行う事を前提とします。

ソースコードの準備

github のリポジトリより、ソースコードパッケージを取得します。ここでは、3.4リリース版を使う手順を説明します。
https://github.com/mrubyc/mrubyc/releases から、release3.4 の Source code (tar.gz) をダウンロードし、展開します。

cd
mkdir work
cd work
fetch https://github.com/mrubyc/mrubyc/archive/refs/tags/release3.4.tar.gz
tar xfz release3.4.tar.gz

ビルド

以下のコマンドラインによりビルドします。

cd mrubyc-release3.4
gmake                    # gnu-make を使う
ビルド出力結果(折りたたみ)
$ gmake
cd mrblib   ; gmake all
gmake[1]: Entering directory '/home/hirohito/work/mrubyc-release3.4/mrblib'
gmake[1]: Nothing to be done for 'all'.
gmake[1]: Leaving directory '/home/hirohito/work/mrubyc-release3.4/mrblib'
cd src      ; gmake all
gmake[1]: Entering directory '/home/hirohito/work/mrubyc-release3.4/src'
cc -c -I../hal/posix -Wall -g    -o ../build/alloc.o alloc.c
cc -c -I../hal/posix -Wall -g    -o ../build/c_array.o c_array.c
cc -c -I../hal/posix -Wall -g    -o ../build/c_hash.o c_hash.c
cc -c -I../hal/posix -Wall -g    -o ../build/c_math.o c_math.c
cc -c -I../hal/posix -Wall -g    -o ../build/c_numeric.o c_numeric.c
cc -c -I../hal/posix -Wall -g    -o ../build/c_object.o c_object.c
cc -c -I../hal/posix -Wall -g    -o ../build/c_proc.o c_proc.c
cc -c -I../hal/posix -Wall -g    -o ../build/c_range.o c_range.c
cc -c -I../hal/posix -Wall -g    -o ../build/c_string.o c_string.c
cc -c -I../hal/posix -Wall -g    -o ../build/class.o class.c
cc -c -I../hal/posix -Wall -g    -o ../build/console.o console.c
cc -c -I../hal/posix -Wall -g    -o ../build/error.o error.c
cc -c -I../hal/posix -Wall -g    -o ../build/global.o global.c
cc -c -I../hal/posix -Wall -g    -o ../build/keyvalue.o keyvalue.c
cc -c -I../hal/posix -Wall -g    -o ../build/load.o load.c
cc -c -I../hal/posix -Wall -g    -o ../build/mrblib.o mrblib.c
cc -c -I../hal/posix -Wall -g    -o ../build/rrt0.o rrt0.c
cc -c -I../hal/posix -Wall -g    -o ../build/symbol.o symbol.c
cc -c -I../hal/posix -Wall -g    -o ../build/value.o value.c
cc -c -I../hal/posix -Wall -g    -o ../build/vm.o vm.c
cc -c -I../hal/posix -Wall -g    -o ../build/hal.o ../hal/posix/hal.c
ar -rv ../build/libmrubyc.a ../build/alloc.o ../build/c_array.o ../build/c_hash.o ../build/c_math.o ../build/c_numeric.o ../build/c_object.o ../build/c_proc.o ../build/c_range.o ../build/c_string.o ../build/class.o ../build/console.o ../build/error.o ../build/global.o ../build/keyvalue.o ../build/load.o ../build/mrblib.o ../build/rrt0.o ../build/symbol.o ../build/value.o ../build/vm.o ../build/hal.o
ar: warning: creating ../build/libmrubyc.a
a - ../build/alloc.o
a - ../build/c_array.o
a - ../build/c_hash.o
a - ../build/c_math.o
a - ../build/c_numeric.o
a - ../build/c_object.o
a - ../build/c_proc.o
a - ../build/c_range.o
a - ../build/c_string.o
a - ../build/class.o
a - ../build/console.o
a - ../build/error.o
a - ../build/global.o
a - ../build/keyvalue.o
a - ../build/load.o
a - ../build/mrblib.o
a - ../build/rrt0.o
a - ../build/symbol.o
a - ../build/value.o
a - ../build/vm.o
a - ../build/hal.o
gmake[1]: Leaving directory '/home/hirohito/work/mrubyc-release3.4/src'
cd sample_c ; gmake all
gmake[1]: Entering directory '/home/hirohito/work/mrubyc-release3.4/sample_c'
cc -I../hal/posix -I../src -Wall -g   -o sample_scheduler sample_scheduler.c ../build/libmrubyc.a
cc -I../hal/posix -I../src -Wall -g   -o sample_no_scheduler sample_no_scheduler.c ../build/libmrubyc.a
cc -I../hal/posix -I../src -Wall -g   -o sample_include sample_include.c ../build/libmrubyc.a
cc -I../hal/posix -I../src -Wall -g   -o sample_concurrent sample_concurrent.c ../build/libmrubyc.a
cc -I../hal/posix -I../src -Wall -g   -o sample_myclass sample_myclass.c ../build/libmrubyc.a
gmake[1]: Leaving directory '/home/hirohito/work/mrubyc-release3.4/sample_c'

sample_c ディレクトリに、C言語で mruby/c VM を使う例が入っており、ビルドが成功すると、実行ファイルも同ディレクトリへ配置されます。

$ ls sample_c/
Makefile                        sample_myclass
sample_concurrent               sample_myclass.c
sample_concurrent.c             sample_no_scheduler
sample_include                  sample_no_scheduler.c
sample_include.c                sample_scheduler
sample_include_bytecode.c       sample_scheduler.c
sample_include_bytecode.rb

mrbc コンパイラのビルド

ソースコードの準備

github のリポジトリより、ソースコードパッケージを取得します。
mruby/cのバージョンと、mrbcコンパイラのバージョンには関連性があります。詳しくは、https://github.com/mrubyc/mrubyc/wiki/mruby-compiler-version-vs-mruby-c-vm を確認してください。
ここでは、3.4.0リリース版を使う手順を説明します。

cd ~/work
fetch https://github.com/mruby/mruby/archive/refs/tags/3.4.0.tar.gz -o mruby-3.4.0.tar.gz
tar xfz mruby-3.4.0.tar.gz

ビルド

以下のコマンドラインによりビルドします。

cd mruby-3.4.0
rake MRUBY_CONFIG=mrbc CC=cc
ビルド出力結果(折りたたみ)
$ rake MRUBY_CONFIG=mrbc CC=cc
CC    src/allocf.c -> build/host/src/allocf.o
CC    src/array.c -> build/host/src/array.o
CC    src/backtrace.c -> build/host/src/backtrace.o
CC    src/cdump.c -> build/host/src/cdump.o
CC    src/class.c -> build/host/src/class.o
CC    src/codedump.c -> build/host/src/codedump.o
CC    src/debug.c -> build/host/src/debug.o
CC    src/dump.c -> build/host/src/dump.o
CC    src/enum.c -> build/host/src/enum.o
CC    src/error.c -> build/host/src/error.o
CC    src/etc.c -> build/host/src/etc.o
CC    src/fmt_fp.c -> build/host/src/fmt_fp.o
CC    src/gc.c -> build/host/src/gc.o
CC    src/hash.c -> build/host/src/hash.o
CC    src/init.c -> build/host/src/init.o
CC    src/kernel.c -> build/host/src/kernel.o
CC    src/load.c -> build/host/src/load.o
CC    src/mempool.c -> build/host/src/mempool.o
CC    src/numeric.c -> build/host/src/numeric.o
CC    src/numops.c -> build/host/src/numops.o
CC    src/object.c -> build/host/src/object.o
CC    src/print.c -> build/host/src/print.o
CC    src/proc.c -> build/host/src/proc.o
CC    src/range.c -> build/host/src/range.o
CC    src/readfloat.c -> build/host/src/readfloat.o
CC    src/readint.c -> build/host/src/readint.o
CC    src/readnum.c -> build/host/src/readnum.o
CC    src/state.c -> build/host/src/state.o
CC    src/string.c -> build/host/src/string.o
CC    src/symbol.c -> build/host/src/symbol.o
CC    src/variable.c -> build/host/src/variable.o
CC    src/version.c -> build/host/src/version.o
CC    src/vm.c -> build/host/src/vm.o
CC    mrbgems/mruby-compiler/core/codegen.c -> build/host/mrbgems/mruby-compiler/core/codegen.o
YACC  mrbgems/mruby-compiler/core/parse.y -> mrbgems/mruby-compiler/core/y.tab.c
CC    mrbgems/mruby-compiler/core/y.tab.c -> build/host/mrbgems/mruby-compiler/core/y.tab.o
AR    build/host/lib/libmruby_core.a
ar: warning: creating /home/hirohito/work/mruby-3.4.0/build/host/lib/libmruby_core.a
CC    mrbgems/mruby-bin-mrbc/tools/mrbc/mrbc.c -> build/host/mrbgems/mruby-bin-mrbc/tools/mrbc/mrbc.o
CC    mrbgems/mruby-bin-mrbc/tools/mrbc/stub.c -> build/host/mrbgems/mruby-bin-mrbc/tools/mrbc/stub.o
LD    build/host/bin/mrbc
GEN   build/host/bin/mrbc -> bin/mrbc

Build summary:

================================================
      Config Name: host
 Output Directory: build/host
         Binaries: mrbc
    Included Gems:
             mruby-bin-mrbc - mruby compiler executable
             mruby-compiler - mruby compiler library
================================================

ビルドが成功すると、bin ディレクトリ(実際には、build/host/bin)下に、mrbc コマンドが生成されています。

$ ls -l bin
total 0
lrwxr-xr-x  1 hirohito hirohito 22 Aug 18 15:26 mrbc -> ../build/host/bin/mrbc

実行テスト

mrubycシェルスクリプトの用意

前項2つの手順でビルドしたコマンドを使って、mrubycプログラムを実行します。

             (mrbc)              (sample_concurrent)
Rubyプログラム -------> バイトコード --------------------> mruby/c VMで実行

この手順(フロー)を、毎回手動で行うのは手間がかかるため、簡単なシェルスクリプトを用意します。

mrubyc
#!/bin/sh

MRBC=${MRBC:-~/work/mruby-3.4.0/bin/mrbc}
EXEC=${EXEC:=~/work/mrubyc-release3.4/sample_c/sample_concurrent}

mrbfiles=""

for f in $@; do
    ext=${f##*.}
    if [ "$ext" = "rb" ]; then
        $MRBC $f || exit $?
        mrbfiles="$mrbfiles "`dirname $f`/`basename -s .rb $f`".mrb"
    else
        mrbfiles="$mrbfiles $f"
    fi
done


if [ -z "$mrbfiles" ]; then
    echo "Usage: mrubyc *.rb ..."
    exit 1
fi

$EXEC $mrbfiles

mruby/c プログラムの実行

用意がととのったので、実行してみます。

tst1.rb
puts "Hello, mruby/c!"

実行結果

$ ./mrubyc tst1.rb
Loading: './tst1.mrb'
Hello, mruby/c!

うまく、実行できました。

おわりに

3種類の環境で、mruby/c を動かすことができました。
いずれも POSIX環境なので、それほど苦労せず動作させることが可能でした。
Windowsの項で説明した方法は、実質は Ubuntu であるので、Ubuntu のリアルホストや、Debian などでも同じ方法で動かすことができると思います。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?