読者です 読者をやめる 読者になる 読者になる

mrubyをdistccでビルドできるようにしてみた

mruby arch

Raspberry Piにmrubyでもと思ったんだけど、distccでビルドするには?ってことで"mruby distcc"でぐぐってみて最初の30件にそれらしいのがなかったので自分でやってみた。
(´-`).。oO(クロスコンパイルではなくdistccを選んだのは気分の問題

Raspberry Pi・PCともにディストリビューションはArch Linux
Archでのdistcc設定はwikiのdistccのページを参考に。
ロスコンパイル&distccの設定はarchlinuxarm.orgにあるdistributed-compilingdistcc-cross-compilingが参考ページ。

最初にbuild_config.rbを開きtoolchainをdistccにしてみる。

[masami@mars mruby]$ cat 
MRuby::Build.new do |conf|
  # load specific toolchain settings

  # Gets set by the VS command prompts.
  if ENV['VisualStudioVersion']
    toolchain :visualcpp
  else
    toolchain :distcc
  end

そうするとこんなエラーになる。

[masami@mars mruby]$ make
ruby ./minirake
(in /home/masami/mruby)
rake aborted!
Unknown distcc toolchain
Rakefile:14:in `load'
Makefile:9: recipe for target 'all' failed
make: *** [all] Error 1

これはtasks/toolchainsにdistccに対するrakeファイルがないからなのでこれを作ってあげる必要がある。

MRuby::Toolchain.new(:distcc) do |conf|
  [conf.cc, conf.objc, conf.asm].each do |cc|
    cc.command = ENV['CC'] || 'distcc'
  end

  [conf.cxx].each do |cxx|
    cxx.command = ENV['CXX'] || 'distcc'
  end

  conf.linker do |linker|
    linker.command = ENV['LD'] || 'gcc'
    linker.flags = [ENV['LDFLAGS'] || %w()]
    linker.libraries = %w(m)
    linker.library_paths = []
    linker.option_library = '-l%s'
    linker.option_library_path = '-L%s'
    linker.link_options = '%{flags} -o %{outfile} %{objs} %{flags_before_libraries} %{libs} %{flags_after_libraries}'
  end
end

基本的にはgcc.rakeをコピーしてcとc++のコマンドを変えただけ。distccを使っても最後のリンクはローカルで実行するのでlinkerの部分は特に変更しない。
あとは普通にmakeとすればOK。

distccサーバを一台設定して実行した時の時間がこれくらい。

real    0m43.648s
user    0m28.380s
sys     0m6.480s

Raspberry Pi(デイストロはArch Linux)で普通にmakeした場合のビルド時間がこれくらい

real    9m8.126s
user    8m51.050s
sys     0m12.690s

できたバイナリの確認を

[masami@mars mruby]$ cd bin
[masami@mars bin]$ ls | xargs file
mirb:  ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.27, BuildID[sha1]=bdf1276716b3839d763acd42fc5a734f35df6899, not stripped
mrbc:  ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.27, BuildID[sha1]=ff0ab47ff70e3b5e4d70574e6e511e466d37f47b, not stripped
mruby: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.27, BuildID[sha1]=02979746005621510fce68a8b40e893ea2bacb13, not stripped

ちゃんとARM向けのバイナリになってるね。

make testを実行してみる

[masami@mars mruby]$ make test
ruby ./minirake
(in /home/masami/mruby)

Build summary:
〜略〜
Total: 635
   OK: 635
   KO: 0
Crash: 0
 Time: 1.01146 seconds

( ´∀`)bグッ!

パーフェクトRuby (PERFECT SERIES 6)

パーフェクトRuby (PERFECT SERIES 6)