MacRuby on Rails #20110320-1

.rboの生成を抑制する方法

MacRubyの動作確認ではvm.cppを頻繁に修正する。vm.cppを修正するたびに.rbo
再生成するのは時間がかかる。そこで、.rboの生成を抑制する方法を調べる。

以下が.rboを生成している部分。minirubyよりも.rboの最終更新日時を新しけ
れば.rboが生成されない。

rakelib/builder.rake

namespace :stdlib do
  desc "AOT compile the stdlib"
  task :build => [:miniruby, 'macruby:dylib'] do
    archf = ARCHS.map { |x| "--arch #{x}" }.join(' ')
    commands = (COMPILE_STDLIB ? AOT_STDLIB : %w{ rbconfig.rb }).map do |pattern|
      Dir.glob(pattern).map do |path|
        out = File.join(File.dirname(path), File.basename(path, '.rb') + '.rbo')
        if !File.exist?(out) or File.mtime(path) > File.mtime(out) or File.mtime('./miniruby') > File.mtime(out)
          "./miniruby -I. -I./lib bin/rubyc --internal #{archf} -C \"#{path}\" -o \"#{out}\""
        end
      end
    end.flatten.compact
    Builder.parallel_execute(commands)
  end
end

また、.rboの対象は以下。

rakelib/builder.rake

AOT_STDLIB = [
  'rbconfig.rb',
  'lib/date.rb',
  'lib/date/**/*.rb',
  'lib/erb.rb',
  'lib/fileutils.rb',
  'lib/irb.rb',
  'lib/irb/**/*.rb',
  'lib/net/**/*.rb',
  'lib/optparse.rb',
  #'lib/stringio.rb', #spec fails
  'lib/rexml.rb',
  'lib/rexml/**/*.rb',
  'lib/rubygems.rb',
  'lib/rubygems/**/*.rb',
  'lib/thread.rb',
  'lib/time.rb',
  'lib/timeout.rb',
  'lib/uri.rb',
  'lib/uri/**/*.rb',
  'lib/xmlrpc/**/*.rb',
  'lib/yaml.rb',
  'lib/yaml/rubytypes.rb',
  'ext/**/lib/**/*.rb'
]

rakelib/builder.rakeを以下のように修正。

diff --git a/rakelib/builder.rake b/rakelib/builder.rake
index a06994a..18a0e26 100644
--- a/rakelib/builder.rake
+++ b/rakelib/builder.rake
@@ -174,6 +174,22 @@ namespace :stdlib do
   end
 end
 
+namespace :stdlib do
+  desc "only update mtime for AOT compiled the stdlib"
+  task :touch => [:miniruby, 'macruby:dylib'] do
+    archf = ARCHS.map { |x| "--arch #{x}" }.join(' ')
+    commands = (COMPILE_STDLIB ? AOT_STDLIB : %w{ rbconfig.rb }).map do |pattern|
+      Dir.glob(pattern).map do |path|
+        out = File.join(File.dirname(path), File.basename(path, '.rb') + '.rbo')
+        if File.exist?(out)
+          "touch \"#{out}\""
+        end
+      end
+    end.flatten.compact
+    Builder.parallel_execute(commands)
+  end
+end
+
 desc "Same as extensions"
 task :ext => 'extensions'
||< 

これまでは以下のようにしてMacRubyをコンパイルしていた。
>||
cymric$ rake optz_level=0

今後は以下のようにする。

cymric$ rake optz_level=0 macruby stdlib:touch extensions

.rboを生成しなくなったのでコンパイルがすこぶる早い。