しまねソフト研究開発センター(略称 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で実行
この手順(フロー)を、毎回手動で行うのは手間がかかるため、簡単なシェルスクリプトを用意します。
#!/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 プログラムの実行
用意がととのったので、実行してみます。
puts "Hello, mruby/c!"
実行結果
$ ./mrubyc tst1.rb
Loading: './tst1.mrb'
Hello, mruby/c!
うまく、実行できました。
おわりに
3種類の環境で、mruby/c を動かすことができました。
いずれも POSIX環境なので、それほど苦労せず動作させることが可能でした。
Windowsの項で説明した方法は、実質は Ubuntu であるので、Ubuntu のリアルホストや、Debian などでも同じ方法で動かすことができると思います。