人間とウェブの未来

「ウェブの歴史は人類の歴史の繰り返し」という観点から色々勉強しています。

MacOSX上でLinuxとWindowsとOSXで動くmrubyバイナリを簡単にクロスコンパイルできるmrbgem作った

ペパボ社内では、mrubyを使う機運が高まってきています。

誰よりも早い学習速度であっというまにmrubyを理解してしまったあんちぽさんや、CRubyだけでなくmrubyもマスターしてまさに真のRubyistになられたしばたさんと共に色々とmrubyの今後について議論しており、その中でこのタイトルのような事が簡単にできるとよいなーという話になったので作ってみました。

ペパボではクライアントマシンとしてMacを使っている事が多いので、Mac上でRubyのコード(あるいはCのコードと組み合わせて)をmrubyを介して簡単にLinuxやWindows上で動くバイナリとしてクロスコンパイルできるといいよね~cliやtestにもいいよね~となりました。

github.com

使い方はGitHubのREADMEの通りで、以下のサイトから事前にlinuxやwin32のクロスコンパイラをMacにインストールしておきます。

start [Cross GCC on Mac OS X]

そして、build_config.rbMRuby::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で書くようにするとなお良いですね!