ペパボ社内では、mrubyを使う機運が高まってきています。
誰よりも早い学習速度であっというまにmrubyを理解してしまったあんちぽさんや、CRubyだけでなくmrubyもマスターしてまさに真のRubyistになられたしばたさんと共に色々とmrubyの今後について議論しており、その中でこのタイトルのような事が簡単にできるとよいなーという話になったので作ってみました。
ペパボではクライアントマシンとしてMacを使っている事が多いので、Mac上でRubyのコード(あるいはCのコードと組み合わせて)をmrubyを介して簡単にLinuxやWindows上で動くバイナリとしてクロスコンパイルできるといいよね~cliやtestにもいいよね~となりました。
使い方はGitHubのREADMEの通りで、以下のサイトから事前にlinuxやwin32のクロスコンパイラをMacにインストールしておきます。
そして、build_config.rb
のMRuby::Build.new do
の 最終行 に上記のmrbgemを読み込む設定を追加するだけでよいです。最終行であることに注意して下さい。
MRuby::Build.new do |conf| # ... (snip) ... conf.gem :github => 'matsumoto-r/mruby-sleep' # the last line of conf.gem configuration load '/path/to/mruby-cross-compile-on-mac-osx/mrbgem.rake' end
その後に、普通にrake
すると通常のビルドでいつも通りのバイナリが生成されます。
さらに、MRUBY_CROSS_OS
という環境変数に、OS名を渡してからrake crosscompile
するとそれぞれのOSに合わせたバイナリにクロスコンパイルします。例えば、
rake MRUBY_CROSS_OS=linux
とすると、linux環境(x86_64)で動くバイナリがbuild/linux/bin
以下にクロスコンパイルされます。
また
rake MRUBY_CROSS_OS=win32
とすると、win32環境で動くバイナリがbuild/win32/bin
以下に生成されます。
一応、MacOSX上でコンパイルするのでクロスコンパイルしなくても通常ビルドされるバイナリはMacOSX上で動作するバイナリですが、
rake MRUBY_CROSS_OS=osx
と明示的に環境変数を渡す事で、build/osx/bin
以下にMacOSXのバイナリがコンパイルされます。
ということで、わりと面倒なクロスコンパイルが環境変数を指定するだけでよくなり、かなり簡単にクロスコンパイルできるようになりました。本来は、OSだけでなくx86以外のarm等のアーキテクチャにも対応させたり、他の色々なOSにも対応させても良いのですが、現状我々が使う用途では上記のパターンだけで十分なのでまだ実装はしていません。
ですが、アーキテクチャの指定やその他のOSにも対応させたい場合もあると思いますので、よろしければPull-request頂けると幸いです!喜んでマージしますのでぜひぜひよろしくお願いします!mrubyのクロスコンパイルの知見をこのmrbgemにためていきましょう!
例えば、
rake MRUBY_CROSS_OS=os_name MRUBY_CROSS_ARCH=arm
という感じが良さそうですね。
といわけで、このmrbgemによってRubyで書いたコードをクロスコンパイルしたバイナリ(例えばcliとか)を各種OSに簡単に配布できるようになったので是非是非お試し下さい。
Rubyのコードをバイナリ化して、環境やライブラリに依存しないソフトウェアをどんどん配っちゃいましょう!その際の設定ファイルはもちろんRuby DSLで書くようにするとなお良いですね!