[macruby-changes] [3355] MacRuby/trunk/rakelib

source_changes at macosforge.org source_changes at macosforge.org
Tue Jan 26 16:33:17 PST 2010


Revision: 3355
          http://trac.macosforge.org/projects/ruby/changeset/3355
Author:   eloy.de.enige at gmail.com
Date:     2010-01-26 16:33:17 -0800 (Tue, 26 Jan 2010)
Log Message:
-----------
Move rbconfig and Info.plist creation to a separate file.

Modified Paths:
--------------
    MacRuby/trunk/rakelib/builder.rake

Added Paths:
-----------
    MacRuby/trunk/rakelib/builder/
    MacRuby/trunk/rakelib/builder/builder.rb
    MacRuby/trunk/rakelib/builder/templates.rb

Removed Paths:
-------------
    MacRuby/trunk/rakelib/builder.rb

Copied: MacRuby/trunk/rakelib/builder/builder.rb (from rev 3354, MacRuby/trunk/rakelib/builder.rb)
===================================================================
--- MacRuby/trunk/rakelib/builder/builder.rb	                        (rev 0)
+++ MacRuby/trunk/rakelib/builder/builder.rb	2010-01-27 00:33:17 UTC (rev 3355)
@@ -0,0 +1,358 @@
+# User customizable variables.
+# These variables can be set from the command line. Example:
+#    $ rake framework_instdir=~/Library/Frameworks sym_instdir=~/bin
+
+$builder_options = {}
+
+def do_option(name, default)
+  $builder_options[name] = default
+  
+  val = ENV[name]
+  if val
+    if block_given?
+      yield val
+    else
+      val
+    end
+  else
+    default
+  end
+end
+
+RUBY_INSTALL_NAME = do_option('ruby_install_name', 'macruby')
+RUBY_SO_NAME = do_option('ruby_so_name', RUBY_INSTALL_NAME)
+ARCHS = 
+  if s = ENV['RC_ARCHS']
+    $stderr.puts "getting archs from RC_ARCHS!"
+    s.strip.split(/\s+/)
+  else
+    do_option('archs', `arch`.include?('ppc') ? 'ppc' : %w{i386 x86_64}) { |x| x.split(',') }
+  end
+LLVM_PATH = do_option('llvm_path', '/usr/local')
+FRAMEWORK_NAME = do_option('framework_name', 'MacRuby')
+FRAMEWORK_INSTDIR = do_option('framework_instdir', '/Library/Frameworks')
+SYM_INSTDIR = do_option('sym_instdir', '/usr/local')
+NO_WARN_BUILD = !do_option('allow_build_warnings', false)
+ENABLE_STATIC_LIBRARY = do_option('enable_static_library', 'no') { 'yes' }
+ENABLE_DEBUG_LOGGING = do_option('enable_debug_logging', true) { |x| x == 'true' }
+UNEXPORTED_SYMBOLS_LIST = do_option('unexported_symbols_list', nil)
+SIMULTANEOUS_JOBS = do_option('jobs', 1) { |x| x.to_i }
+
+# Everything below this comment should *not* be modified.
+
+if ENV['build_as_embeddable']
+  $stderr.puts "The 'build_as_embeddable' build configuration has been removed because it is no longer necessary. To package a full version of MacRuby inside your application, please use `macrake deploy` for HotCocoa apps and the `Embed MacRuby` target for Xcode apps."
+  exit 1
+end
+
+verbose(true)
+
+if `sw_vers -productVersion`.strip < '10.5.6'
+  $stderr.puts "Sorry, your environment is not supported. MacRuby requires Mac OS X 10.5.6 or higher." 
+  exit 1
+end
+
+if `arch`.include?('ppc')
+  $stderr.puts "You appear to be using a PowerPC machine. MacRuby's primary architectures are Intel 32-bit and 64-bit (i386 and x86_64). Consequently, PowerPC support may be lacking some features."
+end
+
+LLVM_CONFIG = File.join(LLVM_PATH, 'bin/llvm-config')
+unless File.exist?(LLVM_CONFIG)
+  $stderr.puts "The llvm-config executable was not located as #{LLVM_CONFIG}. Please make sure LLVM is correctly installed on your machine and pass the llvm_config option to rake if necessary."
+  exit 1
+end
+
+version_h = File.read('version.h')
+NEW_RUBY_VERSION = version_h.scan(/#\s*define\s+RUBY_VERSION\s+\"([^"]+)\"/)[0][0]
+unless defined?(MACRUBY_VERSION)
+  MACRUBY_VERSION = version_h.scan(/#\s*define\s+MACRUBY_VERSION\s+\"(.*)\"/)[0][0]
+end
+
+uname_release_number = (ENV['UNAME_RELEASE'] or `uname -r`.scan(/^(\d+)\.\d+\.(\d+)/)[0].join('.'))
+NEW_RUBY_PLATFORM = 'universal-darwin' + uname_release_number
+
+FRAMEWORK_PATH = File.join(FRAMEWORK_INSTDIR, FRAMEWORK_NAME + '.framework')
+FRAMEWORK_VERSION = File.join(FRAMEWORK_PATH, 'Versions', MACRUBY_VERSION)
+FRAMEWORK_USR = File.join(FRAMEWORK_VERSION, 'usr')
+FRAMEWORK_USR_LIB = File.join(FRAMEWORK_USR, 'lib')
+FRAMEWORK_USR_LIB_RUBY = File.join(FRAMEWORK_USR_LIB, 'ruby')
+
+RUBY_LIB = File.join(FRAMEWORK_USR_LIB_RUBY, NEW_RUBY_VERSION)
+RUBY_ARCHLIB = File.join(RUBY_LIB, NEW_RUBY_PLATFORM)
+RUBY_SITE_LIB = File.join(FRAMEWORK_USR_LIB_RUBY, 'site_ruby')
+RUBY_SITE_LIB2 = File.join(RUBY_SITE_LIB, NEW_RUBY_VERSION)
+RUBY_SITE_ARCHLIB = File.join(RUBY_SITE_LIB2, NEW_RUBY_PLATFORM)
+RUBY_VENDOR_LIB = File.join(FRAMEWORK_USR_LIB_RUBY, 'vendor_ruby')
+RUBY_VENDOR_LIB2 = File.join(RUBY_VENDOR_LIB, NEW_RUBY_VERSION)
+RUBY_VENDOR_ARCHLIB = File.join(RUBY_VENDOR_LIB2, NEW_RUBY_PLATFORM)
+
+INSTALL_NAME = File.join(FRAMEWORK_USR_LIB, 'lib' + RUBY_SO_NAME + '.dylib')
+ARCHFLAGS = ARCHS.map { |a| '-arch ' + a }.join(' ')
+LLVM_MODULES = "core jit nativecodegen bitwriter"
+
+CC = '/usr/bin/gcc'
+CXX = '/usr/bin/g++'
+CFLAGS = "-I. -I./include -I./onig -I/usr/include/libxml2 #{ARCHFLAGS} -fno-common -pipe -O3 -g -Wall -fexceptions"
+CFLAGS << " -Wno-parentheses -Wno-deprecated-declarations -Werror" if NO_WARN_BUILD
+OBJC_CFLAGS = CFLAGS + " -fobjc-gc-only"
+CXXFLAGS = `#{LLVM_CONFIG} --cxxflags #{LLVM_MODULES}`.sub(/-DNDEBUG/, '').strip
+CXXFLAGS << " -I. -I./include -g -Wall #{ARCHFLAGS}"
+CXXFLAGS << " -Wno-parentheses -Wno-deprecated-declarations -Werror" if NO_WARN_BUILD
+CXXFLAGS << " -DLLVM_TOT" if ENV['LLVM_TOT']
+LDFLAGS = `#{LLVM_CONFIG} --ldflags --libs #{LLVM_MODULES}`.strip.gsub(/\n/, '')
+LDFLAGS << " -lpthread -ldl -lxml2 -lobjc -lauto -framework Foundation"
+DLDFLAGS = "-dynamiclib -undefined suppress -flat_namespace -install_name #{INSTALL_NAME} -current_version #{MACRUBY_VERSION} -compatibility_version #{MACRUBY_VERSION}"
+DLDFLAGS << " -unexported_symbols_list #{UNEXPORTED_SYMBOLS_LIST}" if UNEXPORTED_SYMBOLS_LIST
+CFLAGS << " -std=c99" # we add this one later to not conflict with C++ flags
+OBJC_CFLAGS << " -std=c99"
+
+OBJS = %w{ 
+  array bignum class compar complex enum enumerator error eval file load proc 
+  gc hash inits io math numeric object pack parse prec dir process
+  random range rational re onig/regcomp onig/regext onig/regposix onig/regenc
+  onig/reggnu onig/regsyntax onig/regerror onig/regparse onig/regtrav
+  onig/regexec onig/regposerr onig/regversion onig/enc/ascii onig/enc/unicode
+  onig/enc/utf8 onig/enc/euc_jp onig/enc/sjis onig/enc/iso8859_1
+  onig/enc/utf16_be onig/enc/utf16_le onig/enc/utf32_be onig/enc/utf32_le
+  ruby signal sprintf st string struct time transcode util variable version
+  thread id objc bs encoding main dln dmyext marshal gcd
+  vm_eval prelude miniprelude gc-stub bridgesupport compiler dispatcher vm
+  debugger MacRuby MacRubyDebuggerConnector NSDictionary
+}
+
+OBJS_CFLAGS = {
+  # Make sure everything gets inlined properly + compile as Objective-C++.
+  'dispatcher' => '--param inline-unit-growth=10000 --param large-function-growth=10000 -x objective-c++'
+}
+
+class Builder
+  # Runs the given array of +commands+ in parallel. The amount of spawned
+  # simultaneous jobs is determined by the `jobs' env variable. The default
+  # value is 1.
+  #
+  # When the members of the +commands+ array are in turn arrays of strings,
+  # then those commands will be executed in consecutive order.
+  def self.parallel_execute(commands)
+    commands = commands.dup
+
+    Array.new(SIMULTANEOUS_JOBS) do |i|
+      Thread.new do
+        while c = commands.shift
+          Array(c).each { |command| sh(command) }
+        end
+      end
+    end.each { |t| t.join }
+  end
+
+  attr_reader :objs, :cflags, :cxxflags
+  attr_accessor :objc_cflags, :ldflags, :dldflags
+
+  def initialize(objs)
+    @objs = objs.dup
+    @cflags = CFLAGS
+    @cxxflags = CXXFLAGS
+    @objc_cflags = OBJC_CFLAGS
+    @ldflags = LDFLAGS
+    @dldflags = DLDFLAGS
+    @objs_cflags = OBJS_CFLAGS
+    @obj_sources = {}
+    @header_paths = {}
+  end
+
+  def build(objs=nil)
+    objs ||= @objs
+    objs.each do |obj| 
+      if should_build?(obj) 
+        s = obj_source(obj)
+        cc, flags = 
+          case File.extname(s)
+            when '.c' then [CC, @cflags]
+            when '.cpp' then [CXX, @cxxflags]
+            when '.m' then [CC, @objc_cflags]
+            when '.mm' then [CXX, @cxxflags + ' ' + @objc_cflags]
+          end
+        if f = @objs_cflags[obj]
+          flags += " #{f}"
+        end
+        sh("#{cc} #{flags} -c #{s} -o #{obj}.o")
+      end
+    end
+  end
+ 
+  def link_executable(name, objs=nil, ldflags=nil)
+    link(objs, ldflags, "-o #{name}", name)
+  end
+
+  def link_dylib(name, objs=nil, ldflags=nil)
+    link(objs, ldflags, "#{@dldflags} -o #{name}", name)
+  end
+
+  def link_archive(name, objs=nil)
+    objs ||= @objs
+    if should_link?(name, objs)
+      rm_f(name)
+      sh("/usr/bin/ar rcu #{name} #{objs.map { |x| x + '.o' }.join(' ') }")
+      sh("/usr/bin/ranlib #{name}")
+    end
+  end
+
+  def clean
+    @objs.map { |o| o + '.o' }.select { |o| File.exist?(o) }.each { |o| rm_f(o) }
+  end
+ 
+  private
+
+  def link(objs, ldflags, args, name)
+    objs ||= @objs
+    ldflags ||= @ldflags
+    if should_link?(name, objs)
+      sh("#{CXX} #{@cflags} #{objs.map { |x| x + '.o' }.join(' ') } #{ldflags} #{args}")
+    end
+  end
+
+  def should_build?(obj)
+    if File.exist?(obj + '.o')
+      src_time = File.mtime(obj_source(obj))
+      obj_time = File.mtime(obj + '.o')
+      src_time > obj_time \
+        or dependencies[obj].any? { |f| File.mtime(f) > obj_time }
+    else
+      true
+    end
+  end
+
+  def should_link?(bin, objs)
+    if File.exist?(bin)
+      mtime = File.mtime(bin)
+      objs.any? { |o| File.mtime(o + '.o') > mtime }
+    else
+      true
+    end
+  end
+
+  def err(*args)
+    $stderr.puts args
+    exit 1
+  end
+
+  def obj_source(obj)
+    s = @obj_sources[obj]
+    unless s
+      s = ['.c', '.cpp', '.m', '.mm'].map { |e| obj + e }.find { |p| File.exist?(p) }
+      err "cannot locate source file for object `#{obj}'" if s.nil?
+      @obj_sources[obj] = s
+    end
+    s
+  end
+
+  HEADER_DIRS = %w{. include include/ruby}
+  def header_path(hdr)
+    p = @header_paths[hdr]
+    unless p
+      p = HEADER_DIRS.map { |d| File.join(d, hdr) }.find { |p| File.exist?(p) }
+      @header_paths[hdr] = p
+    end
+    p
+  end
+  
+  def locate_headers(cont, src)
+    txt = File.read(src)
+    txt.scan(/#include\s+\"([^"]+)\"/).flatten.each do |header|
+      p = header_path(header)
+      if p and !cont.include?(p)
+        cont << p
+        locate_headers(cont, p)
+      end
+    end
+  end
+  
+  def dependencies
+    unless @obj_dependencies
+      @obj_dependencies = {}
+      @objs.each do |obj| 
+        ary = []
+        locate_headers(ary, obj_source(obj))
+        @obj_dependencies[obj] = ary.uniq
+      end
+    end
+    @obj_dependencies
+  end
+  
+  class Ext
+    EXTENSIONS = ['ripper', 'digest', 'etc', 'readline', 'libyaml', 'fcntl', 'socket', 'zlib', 'bigdecimal', 'openssl', 'json'].sort
+    
+    def self.extension_dirs
+      EXTENSIONS.map do |name|
+        Dir.glob(File.join('ext', name, '**/extconf.rb'))
+      end.flatten.map { |f| File.dirname(f) }
+    end
+    
+    def self.build
+      commands = extension_dirs.map { |dir| new(dir).build_commands }
+      Builder.parallel_execute(commands)
+    end
+    
+    def self.install
+      extension_dirs.each do |dir|
+        sh new(dir).install_command
+      end
+    end
+    
+    def self.clean
+      extension_dirs.each do |dir|
+        new(dir).clean_commands.each { |cmd| sh(cmd) }
+      end
+    end
+    
+    attr_reader :dir
+    
+    def initialize(dir)
+      @dir = dir
+    end
+    
+    def srcdir
+      @srcdir ||= File.join(dir.split(File::SEPARATOR).map { |x| '..' })
+    end
+    
+    def makefile
+      @makefile ||= File.join(@dir, 'Makefile')
+    end
+    
+    def extconf
+      File.join(@dir, 'extconf.rb')
+    end
+    
+    def create_makefile_command
+      if !File.exist?(makefile) or File.mtime(extconf) > File.mtime(makefile)
+        "cd #{dir} && #{srcdir}/miniruby -I#{srcdir} -I#{srcdir}/lib -r rbconfig -e \"RbConfig::CONFIG['libdir'] = '#{srcdir}'; require './extconf.rb'\""
+      end
+    end
+    
+    def build_commands
+      [create_makefile_command, make_command(:all)].compact
+    end
+    
+    def clean_commands
+      return [] unless File.exist?(makefile)
+      [create_makefile_command, make_command(:clean), "rm -f #{makefile}"].compact
+    end
+    
+    def install_command
+      make_command(:install)
+    end
+    
+    private
+    
+    # Possible targets are:
+    # * all
+    # * install
+    # * clean
+    def make_command(target)
+      cmd = "cd #{dir} && /usr/bin/make top_srcdir=#{srcdir} ruby=\"#{srcdir}/miniruby -I#{srcdir} -I#{srcdir}/lib\" extout=#{srcdir}/.ext hdrdir=#{srcdir}/include arch_hdrdir=#{srcdir}/include"
+      cmd << (target == :all ? " libdir=#{srcdir}" : " #{target}")
+      cmd
+    end
+  end
+end
+
+$builder = Builder.new(OBJS)

Added: MacRuby/trunk/rakelib/builder/templates.rb
===================================================================
--- MacRuby/trunk/rakelib/builder/templates.rb	                        (rev 0)
+++ MacRuby/trunk/rakelib/builder/templates.rb	2010-01-27 00:33:17 UTC (rev 3355)
@@ -0,0 +1,237 @@
+class Builder
+  def self.create_framework_info_plist
+    plist = <<EOS
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+        <key>CFBundleDevelopmentRegion</key>
+        <string>English</string>
+        <key>CFBundleExecutable</key>
+        <string>Ruby</string>
+        <key>CFBundleName</key>
+        <string>Ruby</string>
+        <key>CFBundleGetInfoString</key>
+        <string>MacRuby Runtime and Library</string>
+        <key>CFBundleIconFile</key>
+        <string></string>
+        <key>CFBundleIdentifier</key>
+        <string>com.apple.macruby</string>
+        <key>CFBundleInfoDictionaryVersion</key>
+        <string>#{MACRUBY_VERSION}</string>
+        <key>CFBundlePackageType</key>
+        <string>FMWK</string>
+        <key>CFBundleShortVersionString</key>
+        <string>#{MACRUBY_VERSION}</string>
+        <key>CFBundleSignature</key>
+        <string>????</string>
+        <key>CFBundleVersion</key>
+        <string>MacRuby-#{MACRUBY_VERSION}</string>
+        <key>NSPrincipalClass</key>
+        <string></string>
+</dict>
+</plist>
+EOS
+    File.open('framework/Info.plist', 'w') { |io| io.print plist }
+  end
+
+  def self.create_rbconfig
+    rbconfig = <<EOS
+# This file was created when MacRuby was built.  Any changes made to this file 
+# will be lost the next time MacRuby is built.
+
+module RbConfig
+  RUBY_VERSION == "#{NEW_RUBY_VERSION}" or
+    raise "ruby lib version (#{NEW_RUBY_VERSION}) doesn't match executable version (\#{RUBY_VERSION})"
+
+  TOPDIR = File.dirname(__FILE__).chomp!("/lib/ruby/#{NEW_RUBY_VERSION}/#{NEW_RUBY_PLATFORM}")
+  DESTDIR = '' unless defined? DESTDIR
+  CONFIG = {}
+  CONFIG["DESTDIR"] = DESTDIR
+  CONFIG["INSTALL"] = '/usr/bin/install -c'
+  CONFIG["prefix"] = (TOPDIR || DESTDIR + "#{FRAMEWORK_USR}")
+  CONFIG["EXEEXT"] = ""
+  CONFIG["ruby_install_name"] = "#{RUBY_INSTALL_NAME}"
+  CONFIG["RUBY_INSTALL_NAME"] = "#{RUBY_INSTALL_NAME}"
+  CONFIG["RUBY_SO_NAME"] = "#{RUBY_SO_NAME}"
+  CONFIG["SHELL"] = "/bin/sh"
+  CONFIG["PATH_SEPARATOR"] = ":"
+  CONFIG["PACKAGE_NAME"] = ""
+  CONFIG["PACKAGE_TARNAME"] = ""
+  CONFIG["PACKAGE_VERSION"] = ""
+  CONFIG["PACKAGE_STRING"] = ""
+  CONFIG["PACKAGE_BUGREPORT"] = ""
+  CONFIG["exec_prefix"] = "$(prefix)"
+  CONFIG["bindir"] = "$(exec_prefix)/bin"
+  CONFIG["sbindir"] = "$(exec_prefix)/sbin"
+  CONFIG["libexecdir"] = "$(exec_prefix)/libexec"
+  CONFIG["datarootdir"] = "$(prefix)/share"
+  CONFIG["datadir"] = "$(datarootdir)"
+  CONFIG["sysconfdir"] = "$(prefix)/etc"
+  CONFIG["sharedstatedir"] = "$(prefix)/com"
+  CONFIG["localstatedir"] = "$(prefix)/var"
+  CONFIG["includedir"] = "$(prefix)/include"
+  CONFIG["oldincludedir"] = "/usr/include"
+  CONFIG["docdir"] = "$(datarootdir)/doc/$(PACKAGE)"
+  CONFIG["infodir"] = "$(datarootdir)/info"
+  CONFIG["htmldir"] = "$(docdir)"
+  CONFIG["dvidir"] = "$(docdir)"
+  CONFIG["pdfdir"] = "$(docdir)"
+  CONFIG["psdir"] = "$(docdir)"
+  CONFIG["libdir"] = "$(exec_prefix)/lib"
+  CONFIG["localedir"] = "$(datarootdir)/locale"
+  CONFIG["mandir"] = "$(datarootdir)/man"
+  CONFIG["DEFS"] = ""
+  CONFIG["ECHO_C"] = "\\\\\\\\c"
+  CONFIG["ECHO_N"] = ""
+  CONFIG["ECHO_T"] = ""
+  CONFIG["LIBS"] = ""
+  CONFIG["build_alias"] = ""
+  CONFIG["host_alias"] = ""
+  CONFIG["target_alias"] = ""
+  CONFIG["BASERUBY"] = "ruby"
+  CONFIG["MAJOR"], CONFIG["MINOR"], CONFIG["TEENY"] = [#{NEW_RUBY_VERSION.scan(/\d+/).map { |x| "\"" + x + "\"" }.join(', ')}]
+  CONFIG["build"] = "i686-apple-darwin9.0.0"
+  CONFIG["build_cpu"] = "i686"
+  CONFIG["build_vendor"] = "apple"
+  CONFIG["build_os"] = "darwin9.0.0"
+  CONFIG["host"] = "i686-apple-darwin9.0.0"
+  CONFIG["host_cpu"] = "i686"
+  CONFIG["host_vendor"] = "apple"
+  CONFIG["host_os"] = "darwin9.0.0"
+  CONFIG["target"] = "i686-apple-darwin9.0.0"
+  CONFIG["target_cpu"] = "i686"
+  CONFIG["target_vendor"] = "apple"
+  CONFIG["target_os"] = "darwin9.0"
+  CONFIG["CC"] = "/usr/bin/gcc"
+  CONFIG["CFLAGS"] = "-fexceptions -fno-common -pipe $(cflags)"
+  CONFIG["LDFLAGS"] = ""
+  CONFIG["CPPFLAGS"] = "$(cppflags)"
+  CONFIG["OBJEXT"] = "o"
+  CONFIG["CXX"] = "/usr/bin/g++"
+  CONFIG["CXXFLAGS"] = ""
+  CONFIG["CPP"] = "/usr/bin/gcc -E"
+  CONFIG["GREP"] = "/usr/bin/grep"
+  CONFIG["EGREP"] = "/usr/bin/grep -E"
+  CONFIG["GNU_LD"] = "no"
+  CONFIG["CPPOUTFILE"] = "-o conftest.i"
+  CONFIG["OUTFLAG"] = "-o "
+  CONFIG["COUTFLAG"] = "-o "
+  CONFIG["RANLIB"] = "ranlib"
+  CONFIG["AR"] = "ar"
+  CONFIG["AS"] = "as"
+  CONFIG["ASFLAGS"] = ""
+  CONFIG["NM"] = ""
+  CONFIG["WINDRES"] = ""
+  CONFIG["DLLWRAP"] = ""
+  CONFIG["OBJDUMP"] = ""
+  CONFIG["LN_S"] = "ln -s"
+  CONFIG["SET_MAKE"] = ""
+  CONFIG["INSTALL_PROGRAM"] = "$(INSTALL)"
+  CONFIG["INSTALL_SCRIPT"] = "$(INSTALL)"
+  CONFIG["INSTALL_DATA"] = "$(INSTALL) -m 644"
+  CONFIG["RM"] = "rm -f"
+  CONFIG["CP"] = "cp"
+  CONFIG["MAKEDIRS"] = "mkdir -p"
+  CONFIG["ALLOCA"] = ""
+  CONFIG["DLDFLAGS"] = ""
+  CONFIG["ARCH_FLAG"] = "#{ARCHFLAGS}"
+  CONFIG["STATIC"] = ""
+  CONFIG["CCDLFLAGS"] = "-fno-common"
+  CONFIG["LDSHARED"] = "$(CC) -dynamic -bundle -undefined suppress -flat_namespace #{ARCHFLAGS}"
+  CONFIG["LDSHAREDXX"] = "$(CXX) -dynamic -bundle -undefined suppress -flat_namespace"
+  CONFIG["DLEXT"] = "bundle"
+  CONFIG["DLEXT2"] = ""
+  CONFIG["LIBEXT"] = "a"
+  CONFIG["LINK_SO"] = ""
+  CONFIG["LIBPATHFLAG"] = " -L%s"
+  CONFIG["RPATHFLAG"] = ""
+  CONFIG["LIBPATHENV"] = "DYLD_LIBRARY_PATH"
+  CONFIG["TRY_LINK"] = ""
+  CONFIG["STRIP"] = "strip -A -n"
+  CONFIG["EXTSTATIC"] = ""
+  CONFIG["setup"] = "Setup"
+  CONFIG["PREP"] = "miniruby$(EXEEXT)"
+  CONFIG["EXTOUT"] = ".ext"
+  CONFIG["ARCHFILE"] = ""
+  CONFIG["RDOCTARGET"] = "install-doc"
+  CONFIG["cppflags"] = ""
+  CONFIG["cflags"] = "$(optflags) $(debugflags) $(warnflags)"
+  CONFIG["optflags"] = "-O3"
+  CONFIG["debugflags"] = "-g"
+  CONFIG["warnflags"] = "-Wall -Wno-parentheses"
+  CONFIG["LIBRUBY_LDSHARED"] = "/usr/bin/gcc -dynamiclib -undefined suppress -flat_namespace"
+  CONFIG["LIBRUBY_DLDFLAGS"] = "-install_name $(libdir)/lib$(RUBY_SO_NAME).dylib -current_version $(MAJOR).$(MINOR).$(TEENY) -compatibility_version $(MAJOR).$(MINOR)"
+  CONFIG["rubyw_install_name"] = ""
+  CONFIG["RUBYW_INSTALL_NAME"] = ""
+  CONFIG["LIBRUBY_A"] = "lib$(RUBY_SO_NAME)-static.a"
+  CONFIG["LIBRUBY_SO"] = "lib$(RUBY_SO_NAME).$(MAJOR).$(MINOR).$(TEENY).dylib"
+  CONFIG["LIBRUBY_ALIASES"] = "lib$(RUBY_SO_NAME).$(MAJOR).$(MINOR).dylib lib$(RUBY_SO_NAME).dylib"
+  CONFIG["LIBRUBY"] = "$(LIBRUBY_SO)"
+  CONFIG["LIBRUBYARG"] = "$(LIBRUBYARG_SHARED)"
+  CONFIG["LIBRUBYARG_STATIC_REALLY"] = "-l$(RUBY_SO_NAME)-static #{LDFLAGS}"
+  CONFIG["LIBRUBYARG_SHARED"] = CONFIG["LIBRUBYARG_STATIC"] = "-l$(RUBY_SO_NAME)"
+  CONFIG["SOLIBS"] = ""
+  CONFIG["DLDLIBS"] = ""
+  CONFIG["ENABLE_SHARED"] = "yes"
+  CONFIG["ENABLE_STATIC"] = "#{ENABLE_STATIC_LIBRARY}"
+  CONFIG["MAINLIBS"] = ""
+  CONFIG["COMMON_LIBS"] = ""
+  CONFIG["COMMON_MACROS"] = ""
+  CONFIG["COMMON_HEADERS"] = ""
+  CONFIG["EXPORT_PREFIX"] = ""
+  CONFIG["THREAD_MODEL"] = "pthread"
+  CONFIG["MAKEFILES"] = "Makefile"
+  CONFIG["arch"] = "#{NEW_RUBY_PLATFORM}"
+  CONFIG["sitearch"] = "#{NEW_RUBY_PLATFORM}"
+  CONFIG["sitedir"] = "$(libdir)/ruby/site_ruby"
+  CONFIG["vendordir"] = "$(prefix)/lib/ruby/vendor_ruby"
+  CONFIG["configure_args"] = ""
+  CONFIG["rubyhdrdir"] = "$(includedir)/ruby-$(MAJOR).$(MINOR).$(TEENY)"
+  CONFIG["sitehdrdir"] = "$(rubyhdrdir)/site_ruby"
+  CONFIG["vendorhdrdir"] = "$(rubyhdrdir)/vendor_ruby"
+  CONFIG["NROFF"] = "/usr/bin/nroff"
+  CONFIG["MANTYPE"] = "doc"
+  CONFIG["ruby_version"] = "$(MAJOR).$(MINOR).$(TEENY)"
+  CONFIG["rubylibdir"] = "$(libdir)/ruby/$(ruby_version)"
+  CONFIG["archdir"] = "$(rubylibdir)/$(arch)"
+  CONFIG["sitelibdir"] = "$(sitedir)/$(ruby_version)"
+  CONFIG["sitearchdir"] = "$(sitelibdir)/$(sitearch)"
+  CONFIG["vendorlibdir"] = "$(vendordir)/$(ruby_version)"
+  CONFIG["vendorarchdir"] = "$(vendorlibdir)/$(sitearch)"
+  CONFIG["LLVM_PATH"] = "#{LLVM_PATH}"
+  CONFIG["topdir"] = File.dirname(__FILE__)
+  MAKEFILE_CONFIG = {}
+  CONFIG.each{|k,v| MAKEFILE_CONFIG[k] = v.dup}
+  def RbConfig::expand(val, config = CONFIG)
+    val.gsub!(/\\$\\$|\\$\\(([^()]+)\\)|\\$\\{([^{}]+)\\}/) do
+      var = $&
+      if !(v = $1 || $2)
+        '$'
+      elsif key = config[v = v[/\\A[^:]+(?=(?::(.*?)=(.*))?\\z)/]]
+        pat, sub = $1, $2
+        config[v] = false
+        RbConfig::expand(key, config)
+        config[v] = key
+        key = key.gsub(/\#{Regexp.quote(pat)}(?=\\s|\\z)/n) {sub} if pat
+        key
+      else
+        var
+      end
+    end
+    val
+  end
+  CONFIG.each_value do |val|
+    RbConfig::expand(val)
+  end
+end
+Config = RbConfig # compatibility for ruby-1.8.4 and older.
+CROSS_COMPILING = nil
+RUBY_FRAMEWORK = true
+RUBY_FRAMEWORK_VERSION = RbConfig::CONFIG['ruby_version']
+EOS
+    if !File.exist?('rbconfig.rb') or File.read('rbconfig.rb') != rbconfig
+      File.open('rbconfig.rb', 'w') { |io| io.print rbconfig }
+    end
+  end
+end
\ No newline at end of file

Modified: MacRuby/trunk/rakelib/builder.rake
===================================================================
--- MacRuby/trunk/rakelib/builder.rake	2010-01-27 00:29:42 UTC (rev 3354)
+++ MacRuby/trunk/rakelib/builder.rake	2010-01-27 00:33:17 UTC (rev 3355)
@@ -1,4 +1,4 @@
-require File.expand_path('../builder', __FILE__)
+require File.expand_path('../builder/builder', __FILE__)
 require 'rake'
 
 # We monkey-patch the method that Rake uses to display the tasks so we can add
@@ -86,204 +86,9 @@
 
 desc "Create config file"
 task :rbconfig => :miniruby do
-  rbconfig = <<EOS
-# This file was created when MacRuby was built.  Any changes made to this file 
-# will be lost the next time MacRuby is built.
-
-module RbConfig
-  RUBY_VERSION == "#{NEW_RUBY_VERSION}" or
-    raise "ruby lib version (#{NEW_RUBY_VERSION}) doesn't match executable version (\#{RUBY_VERSION})"
-
-  TOPDIR = File.dirname(__FILE__).chomp!("/lib/ruby/#{NEW_RUBY_VERSION}/#{NEW_RUBY_PLATFORM}")
-  DESTDIR = '' unless defined? DESTDIR
-  CONFIG = {}
-  CONFIG["DESTDIR"] = DESTDIR
-  CONFIG["INSTALL"] = '/usr/bin/install -c'
-  CONFIG["prefix"] = (TOPDIR || DESTDIR + "#{FRAMEWORK_USR}")
-  CONFIG["EXEEXT"] = ""
-  CONFIG["ruby_install_name"] = "#{RUBY_INSTALL_NAME}"
-  CONFIG["RUBY_INSTALL_NAME"] = "#{RUBY_INSTALL_NAME}"
-  CONFIG["RUBY_SO_NAME"] = "#{RUBY_SO_NAME}"
-  CONFIG["SHELL"] = "/bin/sh"
-  CONFIG["PATH_SEPARATOR"] = ":"
-  CONFIG["PACKAGE_NAME"] = ""
-  CONFIG["PACKAGE_TARNAME"] = ""
-  CONFIG["PACKAGE_VERSION"] = ""
-  CONFIG["PACKAGE_STRING"] = ""
-  CONFIG["PACKAGE_BUGREPORT"] = ""
-  CONFIG["exec_prefix"] = "$(prefix)"
-  CONFIG["bindir"] = "$(exec_prefix)/bin"
-  CONFIG["sbindir"] = "$(exec_prefix)/sbin"
-  CONFIG["libexecdir"] = "$(exec_prefix)/libexec"
-  CONFIG["datarootdir"] = "$(prefix)/share"
-  CONFIG["datadir"] = "$(datarootdir)"
-  CONFIG["sysconfdir"] = "$(prefix)/etc"
-  CONFIG["sharedstatedir"] = "$(prefix)/com"
-  CONFIG["localstatedir"] = "$(prefix)/var"
-  CONFIG["includedir"] = "$(prefix)/include"
-  CONFIG["oldincludedir"] = "/usr/include"
-  CONFIG["docdir"] = "$(datarootdir)/doc/$(PACKAGE)"
-  CONFIG["infodir"] = "$(datarootdir)/info"
-  CONFIG["htmldir"] = "$(docdir)"
-  CONFIG["dvidir"] = "$(docdir)"
-  CONFIG["pdfdir"] = "$(docdir)"
-  CONFIG["psdir"] = "$(docdir)"
-  CONFIG["libdir"] = "$(exec_prefix)/lib"
-  CONFIG["localedir"] = "$(datarootdir)/locale"
-  CONFIG["mandir"] = "$(datarootdir)/man"
-  CONFIG["DEFS"] = ""
-  CONFIG["ECHO_C"] = "\\\\\\\\c"
-  CONFIG["ECHO_N"] = ""
-  CONFIG["ECHO_T"] = ""
-  CONFIG["LIBS"] = ""
-  CONFIG["build_alias"] = ""
-  CONFIG["host_alias"] = ""
-  CONFIG["target_alias"] = ""
-  CONFIG["BASERUBY"] = "ruby"
-  CONFIG["MAJOR"], CONFIG["MINOR"], CONFIG["TEENY"] = [#{NEW_RUBY_VERSION.scan(/\d+/).map { |x| "\"" + x + "\"" }.join(', ')}]
-  CONFIG["build"] = "i686-apple-darwin9.0.0"
-  CONFIG["build_cpu"] = "i686"
-  CONFIG["build_vendor"] = "apple"
-  CONFIG["build_os"] = "darwin9.0.0"
-  CONFIG["host"] = "i686-apple-darwin9.0.0"
-  CONFIG["host_cpu"] = "i686"
-  CONFIG["host_vendor"] = "apple"
-  CONFIG["host_os"] = "darwin9.0.0"
-  CONFIG["target"] = "i686-apple-darwin9.0.0"
-  CONFIG["target_cpu"] = "i686"
-  CONFIG["target_vendor"] = "apple"
-  CONFIG["target_os"] = "darwin9.0"
-  CONFIG["CC"] = "/usr/bin/gcc"
-  CONFIG["CFLAGS"] = "-fexceptions -fno-common -pipe $(cflags)"
-  CONFIG["LDFLAGS"] = ""
-  CONFIG["CPPFLAGS"] = "$(cppflags)"
-  CONFIG["OBJEXT"] = "o"
-  CONFIG["CXX"] = "/usr/bin/g++"
-  CONFIG["CXXFLAGS"] = ""
-  CONFIG["CPP"] = "/usr/bin/gcc -E"
-  CONFIG["GREP"] = "/usr/bin/grep"
-  CONFIG["EGREP"] = "/usr/bin/grep -E"
-  CONFIG["GNU_LD"] = "no"
-  CONFIG["CPPOUTFILE"] = "-o conftest.i"
-  CONFIG["OUTFLAG"] = "-o "
-  CONFIG["COUTFLAG"] = "-o "
-  CONFIG["RANLIB"] = "ranlib"
-  CONFIG["AR"] = "ar"
-  CONFIG["AS"] = "as"
-  CONFIG["ASFLAGS"] = ""
-  CONFIG["NM"] = ""
-  CONFIG["WINDRES"] = ""
-  CONFIG["DLLWRAP"] = ""
-  CONFIG["OBJDUMP"] = ""
-  CONFIG["LN_S"] = "ln -s"
-  CONFIG["SET_MAKE"] = ""
-  CONFIG["INSTALL_PROGRAM"] = "$(INSTALL)"
-  CONFIG["INSTALL_SCRIPT"] = "$(INSTALL)"
-  CONFIG["INSTALL_DATA"] = "$(INSTALL) -m 644"
-  CONFIG["RM"] = "rm -f"
-  CONFIG["CP"] = "cp"
-  CONFIG["MAKEDIRS"] = "mkdir -p"
-  CONFIG["ALLOCA"] = ""
-  CONFIG["DLDFLAGS"] = ""
-  CONFIG["ARCH_FLAG"] = "#{ARCHFLAGS}"
-  CONFIG["STATIC"] = ""
-  CONFIG["CCDLFLAGS"] = "-fno-common"
-  CONFIG["LDSHARED"] = "$(CC) -dynamic -bundle -undefined suppress -flat_namespace #{ARCHFLAGS}"
-  CONFIG["LDSHAREDXX"] = "$(CXX) -dynamic -bundle -undefined suppress -flat_namespace"
-  CONFIG["DLEXT"] = "bundle"
-  CONFIG["DLEXT2"] = ""
-  CONFIG["LIBEXT"] = "a"
-  CONFIG["LINK_SO"] = ""
-  CONFIG["LIBPATHFLAG"] = " -L%s"
-  CONFIG["RPATHFLAG"] = ""
-  CONFIG["LIBPATHENV"] = "DYLD_LIBRARY_PATH"
-  CONFIG["TRY_LINK"] = ""
-  CONFIG["STRIP"] = "strip -A -n"
-  CONFIG["EXTSTATIC"] = ""
-  CONFIG["setup"] = "Setup"
-  CONFIG["PREP"] = "miniruby$(EXEEXT)"
-  CONFIG["EXTOUT"] = ".ext"
-  CONFIG["ARCHFILE"] = ""
-  CONFIG["RDOCTARGET"] = "install-doc"
-  CONFIG["cppflags"] = ""
-  CONFIG["cflags"] = "$(optflags) $(debugflags) $(warnflags)"
-  CONFIG["optflags"] = "-O3"
-  CONFIG["debugflags"] = "-g"
-  CONFIG["warnflags"] = "-Wall -Wno-parentheses"
-  CONFIG["LIBRUBY_LDSHARED"] = "/usr/bin/gcc -dynamiclib -undefined suppress -flat_namespace"
-  CONFIG["LIBRUBY_DLDFLAGS"] = "-install_name $(libdir)/lib$(RUBY_SO_NAME).dylib -current_version $(MAJOR).$(MINOR).$(TEENY) -compatibility_version $(MAJOR).$(MINOR)"
-  CONFIG["rubyw_install_name"] = ""
-  CONFIG["RUBYW_INSTALL_NAME"] = ""
-  CONFIG["LIBRUBY_A"] = "lib$(RUBY_SO_NAME)-static.a"
-  CONFIG["LIBRUBY_SO"] = "lib$(RUBY_SO_NAME).$(MAJOR).$(MINOR).$(TEENY).dylib"
-  CONFIG["LIBRUBY_ALIASES"] = "lib$(RUBY_SO_NAME).$(MAJOR).$(MINOR).dylib lib$(RUBY_SO_NAME).dylib"
-  CONFIG["LIBRUBY"] = "$(LIBRUBY_SO)"
-  CONFIG["LIBRUBYARG"] = "$(LIBRUBYARG_SHARED)"
-  CONFIG["LIBRUBYARG_STATIC_REALLY"] = "-l$(RUBY_SO_NAME)-static #{LDFLAGS}"
-  CONFIG["LIBRUBYARG_SHARED"] = CONFIG["LIBRUBYARG_STATIC"] = "-l$(RUBY_SO_NAME)"
-  CONFIG["SOLIBS"] = ""
-  CONFIG["DLDLIBS"] = ""
-  CONFIG["ENABLE_SHARED"] = "yes"
-  CONFIG["ENABLE_STATIC"] = "#{ENABLE_STATIC_LIBRARY}"
-  CONFIG["MAINLIBS"] = ""
-  CONFIG["COMMON_LIBS"] = ""
-  CONFIG["COMMON_MACROS"] = ""
-  CONFIG["COMMON_HEADERS"] = ""
-  CONFIG["EXPORT_PREFIX"] = ""
-  CONFIG["THREAD_MODEL"] = "pthread"
-  CONFIG["MAKEFILES"] = "Makefile"
-  CONFIG["arch"] = "#{NEW_RUBY_PLATFORM}"
-  CONFIG["sitearch"] = "#{NEW_RUBY_PLATFORM}"
-  CONFIG["sitedir"] = "$(libdir)/ruby/site_ruby"
-  CONFIG["vendordir"] = "$(prefix)/lib/ruby/vendor_ruby"
-  CONFIG["configure_args"] = ""
-  CONFIG["rubyhdrdir"] = "$(includedir)/ruby-$(MAJOR).$(MINOR).$(TEENY)"
-  CONFIG["sitehdrdir"] = "$(rubyhdrdir)/site_ruby"
-  CONFIG["vendorhdrdir"] = "$(rubyhdrdir)/vendor_ruby"
-  CONFIG["NROFF"] = "/usr/bin/nroff"
-  CONFIG["MANTYPE"] = "doc"
-  CONFIG["ruby_version"] = "$(MAJOR).$(MINOR).$(TEENY)"
-  CONFIG["rubylibdir"] = "$(libdir)/ruby/$(ruby_version)"
-  CONFIG["archdir"] = "$(rubylibdir)/$(arch)"
-  CONFIG["sitelibdir"] = "$(sitedir)/$(ruby_version)"
-  CONFIG["sitearchdir"] = "$(sitelibdir)/$(sitearch)"
-  CONFIG["vendorlibdir"] = "$(vendordir)/$(ruby_version)"
-  CONFIG["vendorarchdir"] = "$(vendorlibdir)/$(sitearch)"
-  CONFIG["LLVM_PATH"] = "#{LLVM_PATH}"
-  CONFIG["topdir"] = File.dirname(__FILE__)
-  MAKEFILE_CONFIG = {}
-  CONFIG.each{|k,v| MAKEFILE_CONFIG[k] = v.dup}
-  def RbConfig::expand(val, config = CONFIG)
-    val.gsub!(/\\$\\$|\\$\\(([^()]+)\\)|\\$\\{([^{}]+)\\}/) do
-      var = $&
-      if !(v = $1 || $2)
-        '$'
-      elsif key = config[v = v[/\\A[^:]+(?=(?::(.*?)=(.*))?\\z)/]]
-        pat, sub = $1, $2
-        config[v] = false
-        RbConfig::expand(key, config)
-        config[v] = key
-        key = key.gsub(/\#{Regexp.quote(pat)}(?=\\s|\\z)/n) {sub} if pat
-        key
-      else
-        var
-      end
-    end
-    val
-  end
-  CONFIG.each_value do |val|
-    RbConfig::expand(val)
-  end
+  require File.expand_path('../builder/templates', __FILE__)
+  Builder.create_rbconfig
 end
-Config = RbConfig # compatibility for ruby-1.8.4 and older.
-CROSS_COMPILING = nil
-RUBY_FRAMEWORK = true
-RUBY_FRAMEWORK_VERSION = RbConfig::CONFIG['ruby_version']
-EOS
-  if !File.exist?('rbconfig.rb') or File.read('rbconfig.rb') != rbconfig
-    File.open('rbconfig.rb', 'w') { |io| io.print rbconfig }
-  end
-end
 
 namespace :macruby do
   desc "Build dynamic libraries for MacRuby"
@@ -396,39 +201,8 @@
 namespace :framework do
   desc "Create the plist file for the framework"
   task :info_plist do
-    plist = <<EOS
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
-        <key>CFBundleDevelopmentRegion</key>
-        <string>English</string>
-        <key>CFBundleExecutable</key>
-        <string>Ruby</string>
-        <key>CFBundleName</key>
-        <string>Ruby</string>
-        <key>CFBundleGetInfoString</key>
-        <string>MacRuby Runtime and Library</string>
-        <key>CFBundleIconFile</key>
-        <string></string>
-        <key>CFBundleIdentifier</key>
-        <string>com.apple.macruby</string>
-        <key>CFBundleInfoDictionaryVersion</key>
-        <string>#{MACRUBY_VERSION}</string>
-        <key>CFBundlePackageType</key>
-        <string>FMWK</string>
-        <key>CFBundleShortVersionString</key>
-        <string>#{MACRUBY_VERSION}</string>
-        <key>CFBundleSignature</key>
-        <string>????</string>
-        <key>CFBundleVersion</key>
-        <string>MacRuby-#{MACRUBY_VERSION}</string>
-        <key>NSPrincipalClass</key>
-        <string></string>
-</dict>
-</plist>
-EOS
-    File.open('framework/Info.plist', 'w') { |io| io.print plist }
+    require File.expand_path('../builder/templates', __FILE__)
+    Builder.create_framework_info_plist
   end
 
   desc "Install the extensions"

Deleted: MacRuby/trunk/rakelib/builder.rb
===================================================================
--- MacRuby/trunk/rakelib/builder.rb	2010-01-27 00:29:42 UTC (rev 3354)
+++ MacRuby/trunk/rakelib/builder.rb	2010-01-27 00:33:17 UTC (rev 3355)
@@ -1,358 +0,0 @@
-# User customizable variables.
-# These variables can be set from the command line. Example:
-#    $ rake framework_instdir=~/Library/Frameworks sym_instdir=~/bin
-
-$builder_options = {}
-
-def do_option(name, default)
-  $builder_options[name] = default
-  
-  val = ENV[name]
-  if val
-    if block_given?
-      yield val
-    else
-      val
-    end
-  else
-    default
-  end
-end
-
-RUBY_INSTALL_NAME = do_option('ruby_install_name', 'macruby')
-RUBY_SO_NAME = do_option('ruby_so_name', RUBY_INSTALL_NAME)
-ARCHS = 
-  if s = ENV['RC_ARCHS']
-    $stderr.puts "getting archs from RC_ARCHS!"
-    s.strip.split(/\s+/)
-  else
-    do_option('archs', `arch`.include?('ppc') ? 'ppc' : %w{i386 x86_64}) { |x| x.split(',') }
-  end
-LLVM_PATH = do_option('llvm_path', '/usr/local')
-FRAMEWORK_NAME = do_option('framework_name', 'MacRuby')
-FRAMEWORK_INSTDIR = do_option('framework_instdir', '/Library/Frameworks')
-SYM_INSTDIR = do_option('sym_instdir', '/usr/local')
-NO_WARN_BUILD = !do_option('allow_build_warnings', false)
-ENABLE_STATIC_LIBRARY = do_option('enable_static_library', 'no') { 'yes' }
-ENABLE_DEBUG_LOGGING = do_option('enable_debug_logging', true) { |x| x == 'true' }
-UNEXPORTED_SYMBOLS_LIST = do_option('unexported_symbols_list', nil)
-SIMULTANEOUS_JOBS = do_option('jobs', 1) { |x| x.to_i }
-
-# Everything below this comment should *not* be modified.
-
-if ENV['build_as_embeddable']
-  $stderr.puts "The 'build_as_embeddable' build configuration has been removed because it is no longer necessary. To package a full version of MacRuby inside your application, please use `macrake deploy` for HotCocoa apps and the `Embed MacRuby` target for Xcode apps."
-  exit 1
-end
-
-verbose(true)
-
-if `sw_vers -productVersion`.strip < '10.5.6'
-  $stderr.puts "Sorry, your environment is not supported. MacRuby requires Mac OS X 10.5.6 or higher." 
-  exit 1
-end
-
-if `arch`.include?('ppc')
-  $stderr.puts "You appear to be using a PowerPC machine. MacRuby's primary architectures are Intel 32-bit and 64-bit (i386 and x86_64). Consequently, PowerPC support may be lacking some features."
-end
-
-LLVM_CONFIG = File.join(LLVM_PATH, 'bin/llvm-config')
-unless File.exist?(LLVM_CONFIG)
-  $stderr.puts "The llvm-config executable was not located as #{LLVM_CONFIG}. Please make sure LLVM is correctly installed on your machine and pass the llvm_config option to rake if necessary."
-  exit 1
-end
-
-version_h = File.read('version.h')
-NEW_RUBY_VERSION = version_h.scan(/#\s*define\s+RUBY_VERSION\s+\"([^"]+)\"/)[0][0]
-unless defined?(MACRUBY_VERSION)
-  MACRUBY_VERSION = version_h.scan(/#\s*define\s+MACRUBY_VERSION\s+\"(.*)\"/)[0][0]
-end
-
-uname_release_number = (ENV['UNAME_RELEASE'] or `uname -r`.scan(/^(\d+)\.\d+\.(\d+)/)[0].join('.'))
-NEW_RUBY_PLATFORM = 'universal-darwin' + uname_release_number
-
-FRAMEWORK_PATH = File.join(FRAMEWORK_INSTDIR, FRAMEWORK_NAME + '.framework')
-FRAMEWORK_VERSION = File.join(FRAMEWORK_PATH, 'Versions', MACRUBY_VERSION)
-FRAMEWORK_USR = File.join(FRAMEWORK_VERSION, 'usr')
-FRAMEWORK_USR_LIB = File.join(FRAMEWORK_USR, 'lib')
-FRAMEWORK_USR_LIB_RUBY = File.join(FRAMEWORK_USR_LIB, 'ruby')
-
-RUBY_LIB = File.join(FRAMEWORK_USR_LIB_RUBY, NEW_RUBY_VERSION)
-RUBY_ARCHLIB = File.join(RUBY_LIB, NEW_RUBY_PLATFORM)
-RUBY_SITE_LIB = File.join(FRAMEWORK_USR_LIB_RUBY, 'site_ruby')
-RUBY_SITE_LIB2 = File.join(RUBY_SITE_LIB, NEW_RUBY_VERSION)
-RUBY_SITE_ARCHLIB = File.join(RUBY_SITE_LIB2, NEW_RUBY_PLATFORM)
-RUBY_VENDOR_LIB = File.join(FRAMEWORK_USR_LIB_RUBY, 'vendor_ruby')
-RUBY_VENDOR_LIB2 = File.join(RUBY_VENDOR_LIB, NEW_RUBY_VERSION)
-RUBY_VENDOR_ARCHLIB = File.join(RUBY_VENDOR_LIB2, NEW_RUBY_PLATFORM)
-
-INSTALL_NAME = File.join(FRAMEWORK_USR_LIB, 'lib' + RUBY_SO_NAME + '.dylib')
-ARCHFLAGS = ARCHS.map { |a| '-arch ' + a }.join(' ')
-LLVM_MODULES = "core jit nativecodegen bitwriter"
-
-CC = '/usr/bin/gcc'
-CXX = '/usr/bin/g++'
-CFLAGS = "-I. -I./include -I./onig -I/usr/include/libxml2 #{ARCHFLAGS} -fno-common -pipe -O3 -g -Wall -fexceptions"
-CFLAGS << " -Wno-parentheses -Wno-deprecated-declarations -Werror" if NO_WARN_BUILD
-OBJC_CFLAGS = CFLAGS + " -fobjc-gc-only"
-CXXFLAGS = `#{LLVM_CONFIG} --cxxflags #{LLVM_MODULES}`.sub(/-DNDEBUG/, '').strip
-CXXFLAGS << " -I. -I./include -g -Wall #{ARCHFLAGS}"
-CXXFLAGS << " -Wno-parentheses -Wno-deprecated-declarations -Werror" if NO_WARN_BUILD
-CXXFLAGS << " -DLLVM_TOT" if ENV['LLVM_TOT']
-LDFLAGS = `#{LLVM_CONFIG} --ldflags --libs #{LLVM_MODULES}`.strip.gsub(/\n/, '')
-LDFLAGS << " -lpthread -ldl -lxml2 -lobjc -lauto -framework Foundation"
-DLDFLAGS = "-dynamiclib -undefined suppress -flat_namespace -install_name #{INSTALL_NAME} -current_version #{MACRUBY_VERSION} -compatibility_version #{MACRUBY_VERSION}"
-DLDFLAGS << " -unexported_symbols_list #{UNEXPORTED_SYMBOLS_LIST}" if UNEXPORTED_SYMBOLS_LIST
-CFLAGS << " -std=c99" # we add this one later to not conflict with C++ flags
-OBJC_CFLAGS << " -std=c99"
-
-OBJS = %w{ 
-  array bignum class compar complex enum enumerator error eval file load proc 
-  gc hash inits io math numeric object pack parse prec dir process
-  random range rational re onig/regcomp onig/regext onig/regposix onig/regenc
-  onig/reggnu onig/regsyntax onig/regerror onig/regparse onig/regtrav
-  onig/regexec onig/regposerr onig/regversion onig/enc/ascii onig/enc/unicode
-  onig/enc/utf8 onig/enc/euc_jp onig/enc/sjis onig/enc/iso8859_1
-  onig/enc/utf16_be onig/enc/utf16_le onig/enc/utf32_be onig/enc/utf32_le
-  ruby signal sprintf st string struct time transcode util variable version
-  thread id objc bs encoding main dln dmyext marshal gcd
-  vm_eval prelude miniprelude gc-stub bridgesupport compiler dispatcher vm
-  debugger MacRuby MacRubyDebuggerConnector NSDictionary
-}
-
-OBJS_CFLAGS = {
-  # Make sure everything gets inlined properly + compile as Objective-C++.
-  'dispatcher' => '--param inline-unit-growth=10000 --param large-function-growth=10000 -x objective-c++'
-}
-
-class Builder
-  # Runs the given array of +commands+ in parallel. The amount of spawned
-  # simultaneous jobs is determined by the `jobs' env variable. The default
-  # value is 1.
-  #
-  # When the members of the +commands+ array are in turn arrays of strings,
-  # then those commands will be executed in consecutive order.
-  def self.parallel_execute(commands)
-    commands = commands.dup
-
-    Array.new(SIMULTANEOUS_JOBS) do |i|
-      Thread.new do
-        while c = commands.shift
-          Array(c).each { |command| sh(command) }
-        end
-      end
-    end.each { |t| t.join }
-  end
-
-  attr_reader :objs, :cflags, :cxxflags
-  attr_accessor :objc_cflags, :ldflags, :dldflags
-
-  def initialize(objs)
-    @objs = objs.dup
-    @cflags = CFLAGS
-    @cxxflags = CXXFLAGS
-    @objc_cflags = OBJC_CFLAGS
-    @ldflags = LDFLAGS
-    @dldflags = DLDFLAGS
-    @objs_cflags = OBJS_CFLAGS
-    @obj_sources = {}
-    @header_paths = {}
-  end
-
-  def build(objs=nil)
-    objs ||= @objs
-    objs.each do |obj| 
-      if should_build?(obj) 
-        s = obj_source(obj)
-        cc, flags = 
-          case File.extname(s)
-            when '.c' then [CC, @cflags]
-            when '.cpp' then [CXX, @cxxflags]
-            when '.m' then [CC, @objc_cflags]
-            when '.mm' then [CXX, @cxxflags + ' ' + @objc_cflags]
-          end
-        if f = @objs_cflags[obj]
-          flags += " #{f}"
-        end
-        sh("#{cc} #{flags} -c #{s} -o #{obj}.o")
-      end
-    end
-  end
- 
-  def link_executable(name, objs=nil, ldflags=nil)
-    link(objs, ldflags, "-o #{name}", name)
-  end
-
-  def link_dylib(name, objs=nil, ldflags=nil)
-    link(objs, ldflags, "#{@dldflags} -o #{name}", name)
-  end
-
-  def link_archive(name, objs=nil)
-    objs ||= @objs
-    if should_link?(name, objs)
-      rm_f(name)
-      sh("/usr/bin/ar rcu #{name} #{objs.map { |x| x + '.o' }.join(' ') }")
-      sh("/usr/bin/ranlib #{name}")
-    end
-  end
-
-  def clean
-    @objs.map { |o| o + '.o' }.select { |o| File.exist?(o) }.each { |o| rm_f(o) }
-  end
- 
-  private
-
-  def link(objs, ldflags, args, name)
-    objs ||= @objs
-    ldflags ||= @ldflags
-    if should_link?(name, objs)
-      sh("#{CXX} #{@cflags} #{objs.map { |x| x + '.o' }.join(' ') } #{ldflags} #{args}")
-    end
-  end
-
-  def should_build?(obj)
-    if File.exist?(obj + '.o')
-      src_time = File.mtime(obj_source(obj))
-      obj_time = File.mtime(obj + '.o')
-      src_time > obj_time \
-        or dependencies[obj].any? { |f| File.mtime(f) > obj_time }
-    else
-      true
-    end
-  end
-
-  def should_link?(bin, objs)
-    if File.exist?(bin)
-      mtime = File.mtime(bin)
-      objs.any? { |o| File.mtime(o + '.o') > mtime }
-    else
-      true
-    end
-  end
-
-  def err(*args)
-    $stderr.puts args
-    exit 1
-  end
-
-  def obj_source(obj)
-    s = @obj_sources[obj]
-    unless s
-      s = ['.c', '.cpp', '.m', '.mm'].map { |e| obj + e }.find { |p| File.exist?(p) }
-      err "cannot locate source file for object `#{obj}'" if s.nil?
-      @obj_sources[obj] = s
-    end
-    s
-  end
-
-  HEADER_DIRS = %w{. include include/ruby}
-  def header_path(hdr)
-    p = @header_paths[hdr]
-    unless p
-      p = HEADER_DIRS.map { |d| File.join(d, hdr) }.find { |p| File.exist?(p) }
-      @header_paths[hdr] = p
-    end
-    p
-  end
-  
-  def locate_headers(cont, src)
-    txt = File.read(src)
-    txt.scan(/#include\s+\"([^"]+)\"/).flatten.each do |header|
-      p = header_path(header)
-      if p and !cont.include?(p)
-        cont << p
-        locate_headers(cont, p)
-      end
-    end
-  end
-  
-  def dependencies
-    unless @obj_dependencies
-      @obj_dependencies = {}
-      @objs.each do |obj| 
-        ary = []
-        locate_headers(ary, obj_source(obj))
-        @obj_dependencies[obj] = ary.uniq
-      end
-    end
-    @obj_dependencies
-  end
-  
-  class Ext
-    EXTENSIONS = ['ripper', 'digest', 'etc', 'readline', 'libyaml', 'fcntl', 'socket', 'zlib', 'bigdecimal', 'openssl', 'json'].sort
-    
-    def self.extension_dirs
-      EXTENSIONS.map do |name|
-        Dir.glob(File.join('ext', name, '**/extconf.rb'))
-      end.flatten.map { |f| File.dirname(f) }
-    end
-    
-    def self.build
-      commands = extension_dirs.map { |dir| new(dir).build_commands }
-      Builder.parallel_execute(commands)
-    end
-    
-    def self.install
-      extension_dirs.each do |dir|
-        sh new(dir).install_command
-      end
-    end
-    
-    def self.clean
-      extension_dirs.each do |dir|
-        new(dir).clean_commands.each { |cmd| sh(cmd) }
-      end
-    end
-    
-    attr_reader :dir
-    
-    def initialize(dir)
-      @dir = dir
-    end
-    
-    def srcdir
-      @srcdir ||= File.join(dir.split(File::SEPARATOR).map { |x| '..' })
-    end
-    
-    def makefile
-      @makefile ||= File.join(@dir, 'Makefile')
-    end
-    
-    def extconf
-      File.join(@dir, 'extconf.rb')
-    end
-    
-    def create_makefile_command
-      if !File.exist?(makefile) or File.mtime(extconf) > File.mtime(makefile)
-        "cd #{dir} && #{srcdir}/miniruby -I#{srcdir} -I#{srcdir}/lib -r rbconfig -e \"RbConfig::CONFIG['libdir'] = '#{srcdir}'; require './extconf.rb'\""
-      end
-    end
-    
-    def build_commands
-      [create_makefile_command, make_command(:all)].compact
-    end
-    
-    def clean_commands
-      return [] unless File.exist?(makefile)
-      [create_makefile_command, make_command(:clean), "rm -f #{makefile}"].compact
-    end
-    
-    def install_command
-      make_command(:install)
-    end
-    
-    private
-    
-    # Possible targets are:
-    # * all
-    # * install
-    # * clean
-    def make_command(target)
-      cmd = "cd #{dir} && /usr/bin/make top_srcdir=#{srcdir} ruby=\"#{srcdir}/miniruby -I#{srcdir} -I#{srcdir}/lib\" extout=#{srcdir}/.ext hdrdir=#{srcdir}/include arch_hdrdir=#{srcdir}/include"
-      cmd << (target == :all ? " libdir=#{srcdir}" : " #{target}")
-      cmd
-    end
-  end
-end
-
-$builder = Builder.new(OBJS)
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20100126/354886da/attachment-0001.html>


More information about the macruby-changes mailing list