HOME>リンク
 

Compile


mrubyはコンパイルやライブラリやバイナリのクロスコンパイルにrakeを使います

ソースコードからのコンパイルには以下のツールが必要です

・Cコンパイラ(例 gcc)
・Linker (例 gcc)
・アーカイブツール (例 ar)
・パーサー ジェネレーター(例 Bison)
・Ruby 1.8以上

オプション
・GIT(mrubyソースのアップデート及びmrbgemsの取り込みを容易にします)
・C++コンパイラ(*.cpp、*.cxx、*.ccを含むGEMsを利用するために)
・アセンブラー(*.asmを含むGemsを利用するために)

使用法

mrubyソースのルートディレクトリ内にbuild_conf.rbというファイルがあります。このファイルはmrubyのビルドコンフィグレーションを含んでいます。

MRuby::Build.new do |conf|
toolchain :gcc
end

mrubyのコンパイルに必要なツールはここにセットされます。追加のbuild_config.rbは$MRUBY_CONFIG環境変数で定義できます。

コンパイルするにはmrubyソースルートの./minirakeを実行するだけです。テストツールの実行には./minirake testを実行してください。 Clean allには./minirake cleanを実行します。コマンドラインを確認するには./minirake -vを実行します。
お使いの環境に併せてBuild_config.rbのオプションの変更が可能です

Build Configuration

青 Toolchains

お使いのPCに併せてビルド環境の設定変更できるtoolchainのテンプレートが用意されています。

青 GCC

GNC Cコンパイラを使うToolchainのコンフィグ

toolchain :gcc

青 Clang

LLVM C コンパイラー用Toolchainコンフィグ例、GCC Toolchainとほぼ同じです

toolchain :clang

青 Visual Studio 2010,2012 と 2013

Windows Visual Studio用のToolchainコンフィグレーションです。Visual Studio Command promptをお使いになる場合、ビルドプロセスが自動で設定しますので手動で設定する必要はありません。

toolchain :visualcpp

青 Android

Android用Toolchainコンフィグ

toolchain :androideabi

カスタムスタンドアローンAndroid SDKとToolchainへのパス ANDROID_STANDALONE_TOOLCHAIN.が必要です。

青 Binaries

コンパイル時に以下のツールより必要なものを選択可能です。

・mruby (mruby interpreter)
・mirb (mruby interactive shell)

選択する際に以下のように記述します。

conf.gem "#{root}/mrbgems/mruby-bin-mruby"
conf.gem "#{root}/mrbgems/mruby-bin-mirb"

青 File Separator

環境により様々なファイルセパレータが必要です。conf.file_separatorにキャラクタをセットできます。

conf.file_separator = '/'

青 C Compiler

Cコンパイラバイナリ、フラグ、インクルードパスの設定の仕方

conf.cc do |cc|
 cc.command = ...
 cc.flags = ...
 cc.include_paths = ...
 cc.defines = ...
 cc.option_include_path = ...
 cc.option_define = ...
 cc.compile_options = ...
end

Cコンパイラはインストールライブラリを認識するヘッダーサーチャーをもっています。

ヘッダーファイルのインクルードパスを使うには search_header_path:を使います

# Searches ```iconv.h```.
# If found it will return include path of the header file.
# Otherwise it will return nil .
fail 'iconv.h not found' unless conf.cc.search_header_path 'iconv.h'

ヘッダーファイルの完全名が必要な場合、search_header_を使います

# Searches ```iconv.h```.
# If found it will return full path of the header file.
# Otherwise it will return nil .
iconv_h = conf.cc.search_header 'iconv.h'
print "iconv.h found: #{iconv_h}\n"

ヘッダーサーチャーは通常、コンパイラーのinclude_pathsを利用します。GCC Toolchainを使う場合(clang toolchainを含む)インクルードパスを使います。(例:/usr/local/include, /usr/include)

シングルトンメソッドを定義する場合、Cコンパイラーに特別なヘッダーパス header_search_pathsが必要です

 def conf.cc.header_search_paths

  ['/opt/local/include'] + include_paths

end

青 Linker

リンカーバイナリ、フラグ、ライブラリパスの設定

conf.linker do |linker|
 linker.command = ...
 linker.flags = ...
 linker.flags_before_libraries = ...
 linker.libraries = ...
 linker.flags_after_libraries = ...
 linker.library_paths = ....
 linker.option_library = ...
 linker.option_library_path = ...
 linker.link_options = ...
end

青 Archiver

アーカイバのバイナリとフラグの設定

conf.archiver do |archiver|
 archiver.command = ...
 archiver.archive_options = ...
end

青 Parserジェネレーター

パーサージェネレーターのバイナリとフラグの設定

conf.yacc do |yacc|
 yacc.command = ...
 yacc.compile_options = ...
end

青 GPref

Gprefバイナリとフラグの設定

conf.gperf do |gperf|
 gperf.command = ...
 gperf.compile_options = ...
end

青 File extensions

conf.exts do |exts|
 exts.object = ...
 exts.executable = ...
exts.

青 Mrbgems

Gemsをビルドプロセスに取り込むには

# Integrate GEM with additional configuration
conf.gem 'path/to/gem' do |g|
 g.cc.flags << ...
end

# Integrate GEM without additional configuration
conf.gem 'path/to/another/gem'

Mrbtest

Mrbtestをビルドプロセスに取り込む

mrbtestのみ組み込みたい場合、conf.build_mrbtest_lib_onlyのみお使いください

conf.build_mrbtest_lib_only

青 Bintest

CRubyを使ったmrubtest toolsのテスト。bintestの場所はmrbgemsディレクトリのbintest/。サンプルはmruby-bin-*/bintest/*.rbをご覧ください。

有効化

conf.enable_bintest

青 C++ ABI

mrubyはC++例外処理を内部的に実行できます。C++ABIモードと呼ばれています。C++例外処理はC++スタックを正しくリリースします。C++コードをミックスする際は必ずC++ABIモードは自動的に利用可能になります。 明示的にC++ABIモードを有効にしたい場合、下記のように記述します。

conf.enable_cxx_abi

青 C++例外処理 無効化

 C++無効化の記述

conf.disable_cxx_exception

注意:これはenable_cxx_abiかGemの前にコールされる必要があります

青 デバッギング モード

デバッグのモードの有効化

conf.enable_debug
デバッグモードが有効になった場合

・マクロ MRB_DEBUGが定義されます これは mrb_assert() マクロが有効になっています

・irepのデバッグ情報がmrbcにより生成されます

これは-gフラグがmrbcランナーにより追加されるためです

これを使い、よりよいバックトレースの実行が可能です

青 Cross Compilation

mrubyは一つのプラットフォームから他のプラットフォームへのクロスコンパイルが可能です。これにはbuild_config.rb内にMRuby:CrossBUildのインスタンスが含まれている必要があります。このインスタンスはクロス編集とターゲットプラットフォームのフラグを定義しています。下記を参考にしてください

MRuby::CrossBuild.new('32bit') do |conf|
 toolchain :gcc

 conf.cc.flags << "-m32"
 conf.linker.flags << "-m32"
end

MRuby::Buildで利用できる設定オプションはすべてMRuby::CrossBuildで利用可能です

青 Cross Compilation時のMrbtest

クロスコンパイル時にmrbtestを実行できます

conf.test_runner do |t|
 t.command = ... # set emulator. this value must be non nil or false
 t.flags = ... # set flags of emulator

 def t.run(bin) # override `run` if you need to change the behavior of it
 ... # `bin` is the full path of mrbtest
 end
end

青 Build Process

ビルド時にルートディレクトリにディレクトリが作成されます。ディレクトリ構成を下記に示します

+- build
 |
 +- host
  |
  +- bin <- Binaries (mirb, mrbc and mruby)
  |
  +- lib <- Libraries (libmruby.a and libmruby_core.a)
  |
  +- mrblib
  |
  +- src
  |
  +- test <- mrbtest tool
  |
  +- tools
    |
    +- mirb
    |
    +- mrbc
    |
    +- mruby

コンパイルの流れは下記のようになります

・src配下にすべてのファイル(オブジェクトファイルはbuild/host/srcに保管されます)

src/parse.yよりパーサーグラマーが生成されます(生成結果はbuild/host/src/y.tab.cに保存されます)

・ build/host/src/y.tab.cbuild/host/src/y.tab.oにコンパイルされます

・すべてのオブジェクトファイルよりbuild/host/lib/libmruby_core.aがコンパイルされます

tools/mrbc/mrbc.cがコンパイルされ、build/host/lib/libmruby_core.aとリンクされてbuild/host/bin/mrbcが生成されます

・build/host/bin/mrbcのmrblib配下のすべてのrbファイルをコンパイルすることでbuild/host/mrblib/mrblibが生成されます

build/host/mrblib/mrblib.cbuild/host/mrblib/mrblib.oにコンパイルされます

・すべてのオブジェクトファイルよりbuild/host/lib/libmruby.aが作成されます

(CとRuby)

mrbgems/mruby-bin-mruby/tools/mruby/mruby.c のコンパイルとbuild/host/lib/libmruby.aへのリンクによりbuild/host/mrubyが生成されます

mrbgems/mruby-bin-mirb/tools/mirb/mirb.cのコンパイルとbuild/host/lib/libmruby.aへのリンクよりbuild/host/bin/mirbが生成されます

  ----- to be continued ------