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.cがbuild/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.cがbuild/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 ------
|