[macruby-changes] [942] MacRuby/branches/experimental

source_changes at macosforge.org source_changes at macosforge.org
Mon Mar 16 14:50:06 PDT 2009


Revision: 942
          http://trac.macosforge.org/projects/ruby/changeset/942
Author:   eloy.de.enige at gmail.com
Date:     2009-03-16 14:50:06 -0700 (Mon, 16 Mar 2009)
Log Message:
-----------
Moved guts of the code in Rakefile into seperate files in rakelib.

Modified Paths:
--------------
    MacRuby/branches/experimental/Rakefile

Added Paths:
-----------
    MacRuby/branches/experimental/rakelib/
    MacRuby/branches/experimental/rakelib/builder.rake
    MacRuby/branches/experimental/rakelib/builder.rb
    MacRuby/branches/experimental/rakelib/headers.rake
    MacRuby/branches/experimental/rakelib/spec.rake

Modified: MacRuby/branches/experimental/Rakefile
===================================================================
--- MacRuby/branches/experimental/Rakefile	2009-03-16 21:30:13 UTC (rev 941)
+++ MacRuby/branches/experimental/Rakefile	2009-03-16 21:50:06 UTC (rev 942)
@@ -1,677 +1,8 @@
-# User customizable variables.
-# These variables can be set from the command line. Example:
-#    $ rake framework_instdir=~/Library/Frameworks sym_instdir=~/bin
+# See ./rakelib/*.rake for all tasks.
 
-def do_option(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
-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' }
-
-# TODO: we should find a way to document these options in rake's --help
-
-# 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 "Warning: your appear to use a PowerPC machine. MacRuby's PPC support is very basic and may be dropped in a near future. Supported architectures are Intel 32-bit and 64-bit (i386 and x86_64)." 
-end
-
-LLVM_CONFIG = `which llvm-config`.strip
-if LLVM_CONFIG.empty?
-  $stderr.puts "The `llvm-config' executable was not located in your PATH. Please make sure LLVM is correctly installed on your machine or that your PATH is correctly set."
-  exit 1
-end
-
-version_h = File.read('version.h')
-NEW_RUBY_VERSION = version_h.scan(/#\s*define\s+RUBY_VERSION\s+\"([^"]+)\"/)[0][0]
-MACRUBY_VERSION = version_h.scan(/#\s*define\s+MACRUBY_VERSION\s+(.*)/)[0][0]
-
-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"
-CFLAGS = "-I. -I./include -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}`.strip
-CXXFLAGS << " -I. -I./include -g -Wall #{ARCHFLAGS}"
-CXXFLAGS << " -Wno-parentheses -Wno-deprecated-declarations -Werror" if NO_WARN_BUILD
-LDFLAGS = `#{LLVM_CONFIG} --ldflags --libs #{LLVM_MODULES}`.strip.gsub(/\n/, '')
-LDFLAGS << " -lpthread -ldl -lxml2 -lobjc -lffi -lauto -framework Foundation"
-DLDFLAGS = "-dynamiclib -undefined suppress -flat_namespace -install_name #{INSTALL_NAME} -current_version #{MACRUBY_VERSION} -compatibility_version #{MACRUBY_VERSION}"
-
-# removed: marshal
-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 regcomp regenc regerror regexec regparse regsyntax
-  ruby set signal sprintf st string struct time transcode util variable version
-  thread id objc bs encoding main dln dmyext enc/ascii 
-  vm_eval prelude miniprelude gc-stub roxor
-}
-
-class Builder
-  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
-    @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 ['/usr/bin/gcc', @cflags]
-            when '.cpp' then ['/usr/bin/g++', @cxxflags]
-            when '.m' then ['/usr/bin/gcc', @objc_cflags]
-          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("/usr/bin/g++ #{@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'].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
-end
-
-$builder = Builder.new(OBJS)
-
 desc "Same as all"
 task :default => :all
 
-desc "Create config.h"
-task :config_h do
-  config_h = 'include/ruby/config.h'
-  new_config_h = File.read(config_h + '.in') << "\n"
-  flag = ['/System/Library/Frameworks', '/Library/Frameworks'].any? do |p|
-    File.exist?(File.join(p, 'BridgeSupport.framework'))
-  end 
-  new_config_h << "#define HAVE_BRIDGESUPPORT_FRAMEWORK #{flag ? 1 : 0}\n"
-  flag = File.exist?('/usr/include/auto_zone.h')
-  new_config_h << "#define HAVE_AUTO_ZONE_H #{flag ? 1 : 0}\n"
-  new_config_h << "#define ENABLE_DEBUG_LOGGING 1\n" if ENABLE_DEBUG_LOGGING
-  new_config_h << "#define RUBY_PLATFORM \"#{NEW_RUBY_PLATFORM}\"\n"
-  new_config_h << "#define RUBY_LIB \"#{RUBY_LIB}\"\n"
-  new_config_h << "#define RUBY_ARCHLIB \"#{RUBY_ARCHLIB}\"\n"
-  new_config_h << "#define RUBY_SITE_LIB \"#{RUBY_SITE_LIB}\"\n"
-  new_config_h << "#define RUBY_SITE_LIB2 \"#{RUBY_SITE_LIB2}\"\n"
-  new_config_h << "#define RUBY_SITE_ARCHLIB \"#{RUBY_SITE_ARCHLIB}\"\n"
-  new_config_h << "#define RUBY_VENDOR_LIB \"#{RUBY_VENDOR_LIB}\"\n"
-  new_config_h << "#define RUBY_VENDOR_LIB2 \"#{RUBY_VENDOR_LIB2}\"\n"
-  new_config_h << "#define RUBY_VENDOR_ARCHLIB \"#{RUBY_VENDOR_ARCHLIB}\"\n"
-  if !File.exist?(config_h) or File.read(config_h) != new_config_h
-    File.open(config_h, 'w') { |io| io.print new_config_h }
-    ext_dir = ".ext/include/#{NEW_RUBY_PLATFORM}/ruby"
-    mkdir_p(ext_dir)
-    cp(config_h, ext_dir)
-  end
-end
-
-desc "Create dtrace.h"
-task :dtrace_h do
-  dtrace_h = 'dtrace.h'
-  if !File.exist?(dtrace_h) or File.mtime(dtrace_h) < File.mtime('dtrace.d')
-    sh "/usr/sbin/dtrace -h -s dtrace.d -o new_dtrace.h"
-    if !File.exist?(dtrace_h) or File.read(dtrace_h) != File.read('new_dtrace.h')
-      mv 'new_dtrace.h', dtrace_h
-    end
-  end
-end
-
-desc "Create revision.h"
-task :revision_h do
-  revision_h = 'revision.h'
-  current_revision = nil
-  if File.exist?('.svn')
-    info = `sh -c 'LANG=C svn info' 2>&1`
-    md_revision = /^Revision: (\d+)$/.match(info)
-    md_url = /^URL: (.+)$/.match(info)
-    current_revision = "svn revision #{md_revision[1]} from #{md_url[1]}" if md_revision and md_url
-  end
-  if not current_revision and File.exist?('.git/HEAD')
-    commit_sha1 = nil
-    head = File.read('.git/HEAD').strip
-    md_ref = /^ref: (.+)$/.match(head)
-    if md_ref
-      # if the HEAD file contains "ref: XXXX", it's the reference to a branch
-      # so we read the file indicating the last commit of the branch
-      head_file = ".git/#{md_ref[1]}"
-      commit_sha1 = File.read(head_file).strip if File.exist?(head_file)
-    else
-      # otherwise, it's a detached head so it should be the SHA1 of the last commit
-      commit_sha1 = head
-    end
-    current_revision = "git commit #{commit_sha1}" if commit_sha1 and not commit_sha1.empty?
-  end
-  current_revision = 'unknown revision' unless current_revision
-  
-  new_revision_h = "#define MACRUBY_REVISION \"#{current_revision}\"\n"
-  
-  must_recreate_header = true
-  if File.exist?(revision_h)
-    must_recreate_header = false if File.read(revision_h) == new_revision_h
-  end
-  
-  if must_recreate_header
-    File.open(revision_h, 'w') do |f|
-      f.print new_revision_h
-    end
-  end
-end
-
-
-desc "Build known objects"
-task :objects => [:config_h, :dtrace_h, :revision_h] do
-  sh "/usr/bin/ruby tool/compile_prelude.rb prelude.rb miniprelude.c.new"
-  if !File.exist?('miniprelude.c') or File.read('miniprelude.c') != File.read('miniprelude.c.new')
-    mv('miniprelude.c.new', 'miniprelude.c')
-  else
-    rm('miniprelude.c.new')
-  end
-  if !File.exist?('prelude.c')
-    touch('prelude.c') # create empty file nevertheless
-  end
-  if !File.exist?('parse.c') or File.mtime('parse.y') > File.mtime('parse.c')
-    sh("/usr/bin/bison -o y.tab.c parse.y")
-    sh("/usr/bin/sed -f ./tool/ytab.sed -e \"/^#/s!y\.tab\.c!parse.c!\" y.tab.c > parse.c.new")
-    if !File.exist?('parse.c') or File.read('parse.c.new') != File.read('parse.c')
-      mv('parse.c.new', 'parse.c')
-      rm_f('parse.o')
-    else
-      rm('parse.c.new')
-    end
-  end
-  if !File.exist?('lex.c') or File.read('lex.c') != File.read('lex.c.blt')
-    cp('lex.c.blt', 'lex.c')
-  end
-  if !File.exist?('node_name.inc') or File.mtime('include/ruby/node.h') > File.mtime('node_name.inc')
-    sh("/usr/bin/ruby -n tool/node_name.rb include/ruby/node.h > node_name.inc")
-  end
-  $builder.build
-end
-
-desc "Create miniruby"
-task :miniruby => :objects do
-  $builder.link_executable('miniruby', OBJS - ['prelude'])
-end
-
-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"] = "gcc"
-  CONFIG["CFLAGS"] = "-fno-common -pipe $(cflags)"
-  CONFIG["LDFLAGS"] = ""
-  CONFIG["CPPFLAGS"] = "$(cppflags)"
-  CONFIG["OBJEXT"] = "o"
-  CONFIG["CXX"] = "g++"
-  CONFIG["CXXFLAGS"] = ""
-  CONFIG["CPP"] = "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"] = "-O2"
-  CONFIG["debugflags"] = "-g"
-  CONFIG["warnflags"] = "-Wall -Wno-parentheses"
-  CONFIG["LIBRUBY_LDSHARED"] = "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"] = "-l$(RUBY_SO_NAME)-static #{LDFLAGS}"
-  CONFIG["LIBRUBYARG_SHARED"] = "-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["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
-
-namespace :macruby do
-  desc "Build dynamic libraries for MacRuby"
-  task :dylib => [:rbconfig, :miniruby] do
-    sh("./miniruby -I. -I./lib -rrbconfig tool/compile_prelude.rb prelude.rb gem_prelude.rb prelude.c.new")
-    if !File.exist?('prelude.c') or File.read('prelude.c') != File.read('prelude.c.new')
-      mv('prelude.c.new', 'prelude.c')
-      $builder.build(['prelude'])
-    else
-      rm('prelude.c.new')
-    end
-    dylib = "lib#{RUBY_SO_NAME}.#{NEW_RUBY_VERSION}.dylib"
-    $builder.link_dylib(dylib, $builder.objs - ['main', 'gc-stub', 'miniprelude'])
-    major, minor, teeny = NEW_RUBY_VERSION.scan(/\d+/)
-    ["lib#{RUBY_SO_NAME}.#{major}.#{minor}.dylib", "lib#{RUBY_SO_NAME}.dylib"].each do |dylib_alias|
-      if !File.exist?(dylib_alias) or File.readlink(dylib_alias) != dylib  
-        rm_f(dylib_alias)
-        ln_s(dylib, dylib_alias)
-      end
-    end
-  end
-
-  desc "Build static libraries for MacRuby"
-  task :static => :dylib do
-    $builder.link_archive("lib#{RUBY_SO_NAME}-static.a", $builder.objs - ['main', 'gc-stub', 'miniprelude'])
-  end
-
-  desc "Build MacRuby"
-  task :build => :dylib do
-    $builder.link_executable(RUBY_INSTALL_NAME, ['main', 'gc-stub'], "-L. -l#{RUBY_SO_NAME} -lobjc")
-  end
-end
-
-DESTDIR = (ENV['DESTDIR'] or "")
-EXTOUT = (ENV['EXTOUT'] or ".ext")
-INSTALLED_LIST = '.installed.list'
-SCRIPT_ARGS = "--make=\"/usr/bin/make\" --dest-dir=\"#{DESTDIR}\" --extout=\"#{EXTOUT}\" --mflags=\"\" --make-flags=\"\""
-EXTMK_ARGS = "#{SCRIPT_ARGS} --extension --extstatic"
-INSTRUBY_ARGS = "#{SCRIPT_ARGS} --data-mode=0644 --prog-mode=0755 --installed-list #{INSTALLED_LIST} --mantype=\"doc\" --sym-dest-dir=\"#{SYM_INSTDIR}\""
-
-desc "Build extensions"
-task :extensions => [:miniruby, "macruby:static"] do
-  sh "./miniruby -I./lib -I.ext/common -I./- -r./ext/purelib.rb ext/extmk.rb #{EXTMK_ARGS}"
-end
-
-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 }
-  end
-
-  desc "Install the framework"
-  task :install => :info_plist do
-    sh "./miniruby instruby.rb #{INSTRUBY_ARGS}"
-  end
-end
-
-namespace :clean do
-  desc "Clean local build files"
-  task :local do
-    $builder.clean
-    ['parse.c', 'lex.c', INSTALLED_LIST, 'Makefile', *Dir['*.inc']].each { |x| rm_f(x) }
-  end
-
-  desc "Clean extension build files"
-  task :ext do
-    if File.exist?('./miniruby') 
-      sh "./miniruby -I./lib -I.ext/common -I./- -r./ext/purelib.rb ext/extmk.rb #{EXTMK_ARGS} -- clean"
-    end
-  end
-end
-
-namespace :spec do
-  desc "Run continuous integration examples for Ruby 1.9 including stdlib"
-  task :ci do
-    #sh "./mspec/bin/mspec ci -t ./miniruby -B spec/frozen/macruby.mspec"
-    
-    # TODO: Still fails at another require statment.
-    # It seems to spawns yet another process which also needs the proper laod path.
-    # Anyways load paths are currently broken on roxor. Will find out a tmp workaround tonight.
-    sh "./miniruby -v -I./mspec/lib ./mspec/bin/mspec-ci -B spec/frozen/macruby.mspec"
-  end
-end
-
-# desc "Run all 'known good' specs (task alias for spec:ci)"
-# task :spec => 'spec:ci'
-
 desc "Same as framework:install"
 task :install => 'framework:install'
 
@@ -710,3 +41,6 @@
 task :git_archive do
   sh "git archive --format=tar --prefix=MacRuby-HEAD/ HEAD | gzip >MacRuby-HEAD.tar.gz"
 end
+
+# desc "Run all 'known good' specs (task alias for spec:ci)"
+# task :spec => 'spec:ci'
\ No newline at end of file

Added: MacRuby/branches/experimental/rakelib/builder.rake
===================================================================
--- MacRuby/branches/experimental/rakelib/builder.rake	                        (rev 0)
+++ MacRuby/branches/experimental/rakelib/builder.rake	2009-03-16 21:50:06 UTC (rev 942)
@@ -0,0 +1,339 @@
+require File.expand_path('../builder', __FILE__)
+
+desc "Build known objects"
+task :objects => [:config_h, :dtrace_h, :revision_h] do
+  sh "/usr/bin/ruby tool/compile_prelude.rb prelude.rb miniprelude.c.new"
+  if !File.exist?('miniprelude.c') or File.read('miniprelude.c') != File.read('miniprelude.c.new')
+    mv('miniprelude.c.new', 'miniprelude.c')
+  else
+    rm('miniprelude.c.new')
+  end
+  if !File.exist?('prelude.c')
+    touch('prelude.c') # create empty file nevertheless
+  end
+  if !File.exist?('parse.c') or File.mtime('parse.y') > File.mtime('parse.c')
+    sh("/usr/bin/bison -o y.tab.c parse.y")
+    sh("/usr/bin/sed -f ./tool/ytab.sed -e \"/^#/s!y\.tab\.c!parse.c!\" y.tab.c > parse.c.new")
+    if !File.exist?('parse.c') or File.read('parse.c.new') != File.read('parse.c')
+      mv('parse.c.new', 'parse.c')
+      rm_f('parse.o')
+    else
+      rm('parse.c.new')
+    end
+  end
+  if !File.exist?('lex.c') or File.read('lex.c') != File.read('lex.c.blt')
+    cp('lex.c.blt', 'lex.c')
+  end
+  if !File.exist?('node_name.inc') or File.mtime('include/ruby/node.h') > File.mtime('node_name.inc')
+    sh("/usr/bin/ruby -n tool/node_name.rb include/ruby/node.h > node_name.inc")
+  end
+  $builder.build
+end
+
+desc "Create miniruby"
+task :miniruby => :objects do
+  $builder.link_executable('miniruby', OBJS - ['prelude'])
+end
+
+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"] = "gcc"
+  CONFIG["CFLAGS"] = "-fno-common -pipe $(cflags)"
+  CONFIG["LDFLAGS"] = ""
+  CONFIG["CPPFLAGS"] = "$(cppflags)"
+  CONFIG["OBJEXT"] = "o"
+  CONFIG["CXX"] = "g++"
+  CONFIG["CXXFLAGS"] = ""
+  CONFIG["CPP"] = "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"] = "-O2"
+  CONFIG["debugflags"] = "-g"
+  CONFIG["warnflags"] = "-Wall -Wno-parentheses"
+  CONFIG["LIBRUBY_LDSHARED"] = "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"] = "-l$(RUBY_SO_NAME)-static #{LDFLAGS}"
+  CONFIG["LIBRUBYARG_SHARED"] = "-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["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
+
+namespace :macruby do
+  desc "Build dynamic libraries for MacRuby"
+  task :dylib => [:rbconfig, :miniruby] do
+    sh("./miniruby -I. -I./lib -rrbconfig tool/compile_prelude.rb prelude.rb gem_prelude.rb prelude.c.new")
+    if !File.exist?('prelude.c') or File.read('prelude.c') != File.read('prelude.c.new')
+      mv('prelude.c.new', 'prelude.c')
+      $builder.build(['prelude'])
+    else
+      rm('prelude.c.new')
+    end
+    dylib = "lib#{RUBY_SO_NAME}.#{NEW_RUBY_VERSION}.dylib"
+    $builder.link_dylib(dylib, $builder.objs - ['main', 'gc-stub', 'miniprelude'])
+    major, minor, teeny = NEW_RUBY_VERSION.scan(/\d+/)
+    ["lib#{RUBY_SO_NAME}.#{major}.#{minor}.dylib", "lib#{RUBY_SO_NAME}.dylib"].each do |dylib_alias|
+      if !File.exist?(dylib_alias) or File.readlink(dylib_alias) != dylib  
+        rm_f(dylib_alias)
+        ln_s(dylib, dylib_alias)
+      end
+    end
+  end
+
+  desc "Build static libraries for MacRuby"
+  task :static => :dylib do
+    $builder.link_archive("lib#{RUBY_SO_NAME}-static.a", $builder.objs - ['main', 'gc-stub', 'miniprelude'])
+  end
+
+  desc "Build MacRuby"
+  task :build => :dylib do
+    $builder.link_executable(RUBY_INSTALL_NAME, ['main', 'gc-stub'], "-L. -l#{RUBY_SO_NAME} -lobjc")
+  end
+end
+
+DESTDIR = (ENV['DESTDIR'] or "")
+EXTOUT = (ENV['EXTOUT'] or ".ext")
+INSTALLED_LIST = '.installed.list'
+SCRIPT_ARGS = "--make=\"/usr/bin/make\" --dest-dir=\"#{DESTDIR}\" --extout=\"#{EXTOUT}\" --mflags=\"\" --make-flags=\"\""
+EXTMK_ARGS = "#{SCRIPT_ARGS} --extension --extstatic"
+INSTRUBY_ARGS = "#{SCRIPT_ARGS} --data-mode=0644 --prog-mode=0755 --installed-list #{INSTALLED_LIST} --mantype=\"doc\" --sym-dest-dir=\"#{SYM_INSTDIR}\""
+
+desc "Build extensions"
+task :extensions => [:miniruby, "macruby:static"] do
+  sh "./miniruby -I./lib -I.ext/common -I./- -r./ext/purelib.rb ext/extmk.rb #{EXTMK_ARGS}"
+end
+
+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 }
+  end
+
+  desc "Install the framework"
+  task :install => :info_plist do
+    sh "./miniruby instruby.rb #{INSTRUBY_ARGS}"
+  end
+end
+
+namespace :clean do
+  desc "Clean local build files"
+  task :local do
+    $builder.clean
+    ['parse.c', 'lex.c', INSTALLED_LIST, 'Makefile', *Dir['*.inc']].each { |x| rm_f(x) }
+  end
+
+  desc "Clean extension build files"
+  task :ext do
+    if File.exist?('./miniruby') 
+      sh "./miniruby -I./lib -I.ext/common -I./- -r./ext/purelib.rb ext/extmk.rb #{EXTMK_ARGS} -- clean"
+    end
+  end
+end
\ No newline at end of file

Added: MacRuby/branches/experimental/rakelib/builder.rb
===================================================================
--- MacRuby/branches/experimental/rakelib/builder.rb	                        (rev 0)
+++ MacRuby/branches/experimental/rakelib/builder.rb	2009-03-16 21:50:06 UTC (rev 942)
@@ -0,0 +1,236 @@
+# User customizable variables.
+# These variables can be set from the command line. Example:
+#    $ rake framework_instdir=~/Library/Frameworks sym_instdir=~/bin
+
+def do_option(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
+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' }
+
+# TODO: we should find a way to document these options in rake's --help
+
+# 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 "Warning: your appear to use a PowerPC machine. MacRuby's PPC support is very basic and may be dropped in a near future. Supported architectures are Intel 32-bit and 64-bit (i386 and x86_64)." 
+end
+
+LLVM_CONFIG = `which llvm-config`.strip
+if LLVM_CONFIG.empty?
+  $stderr.puts "The `llvm-config' executable was not located in your PATH. Please make sure LLVM is correctly installed on your machine or that your PATH is correctly set."
+  exit 1
+end
+
+version_h = File.read('version.h')
+NEW_RUBY_VERSION = version_h.scan(/#\s*define\s+RUBY_VERSION\s+\"([^"]+)\"/)[0][0]
+MACRUBY_VERSION = version_h.scan(/#\s*define\s+MACRUBY_VERSION\s+(.*)/)[0][0]
+
+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"
+CFLAGS = "-I. -I./include -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}`.strip
+CXXFLAGS << " -I. -I./include -g -Wall #{ARCHFLAGS}"
+CXXFLAGS << " -Wno-parentheses -Wno-deprecated-declarations -Werror" if NO_WARN_BUILD
+LDFLAGS = `#{LLVM_CONFIG} --ldflags --libs #{LLVM_MODULES}`.strip.gsub(/\n/, '')
+LDFLAGS << " -lpthread -ldl -lxml2 -lobjc -lffi -lauto -framework Foundation"
+DLDFLAGS = "-dynamiclib -undefined suppress -flat_namespace -install_name #{INSTALL_NAME} -current_version #{MACRUBY_VERSION} -compatibility_version #{MACRUBY_VERSION}"
+
+# removed: marshal
+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 regcomp regenc regerror regexec regparse regsyntax
+  ruby set signal sprintf st string struct time transcode util variable version
+  thread id objc bs encoding main dln dmyext enc/ascii 
+  vm_eval prelude miniprelude gc-stub roxor
+}
+
+class Builder
+  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
+    @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 ['/usr/bin/gcc', @cflags]
+            when '.cpp' then ['/usr/bin/g++', @cxxflags]
+            when '.m' then ['/usr/bin/gcc', @objc_cflags]
+          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("/usr/bin/g++ #{@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'].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
+end
+
+$builder = Builder.new(OBJS)
\ No newline at end of file

Added: MacRuby/branches/experimental/rakelib/headers.rake
===================================================================
--- MacRuby/branches/experimental/rakelib/headers.rake	                        (rev 0)
+++ MacRuby/branches/experimental/rakelib/headers.rake	2009-03-16 21:50:06 UTC (rev 942)
@@ -0,0 +1,79 @@
+desc "Create config.h"
+task :config_h do
+  config_h = 'include/ruby/config.h'
+  new_config_h = File.read(config_h + '.in') << "\n"
+  flag = ['/System/Library/Frameworks', '/Library/Frameworks'].any? do |p|
+    File.exist?(File.join(p, 'BridgeSupport.framework'))
+  end 
+  new_config_h << "#define HAVE_BRIDGESUPPORT_FRAMEWORK #{flag ? 1 : 0}\n"
+  flag = File.exist?('/usr/include/auto_zone.h')
+  new_config_h << "#define HAVE_AUTO_ZONE_H #{flag ? 1 : 0}\n"
+  new_config_h << "#define ENABLE_DEBUG_LOGGING 1\n" if ENABLE_DEBUG_LOGGING
+  new_config_h << "#define RUBY_PLATFORM \"#{NEW_RUBY_PLATFORM}\"\n"
+  new_config_h << "#define RUBY_LIB \"#{RUBY_LIB}\"\n"
+  new_config_h << "#define RUBY_ARCHLIB \"#{RUBY_ARCHLIB}\"\n"
+  new_config_h << "#define RUBY_SITE_LIB \"#{RUBY_SITE_LIB}\"\n"
+  new_config_h << "#define RUBY_SITE_LIB2 \"#{RUBY_SITE_LIB2}\"\n"
+  new_config_h << "#define RUBY_SITE_ARCHLIB \"#{RUBY_SITE_ARCHLIB}\"\n"
+  new_config_h << "#define RUBY_VENDOR_LIB \"#{RUBY_VENDOR_LIB}\"\n"
+  new_config_h << "#define RUBY_VENDOR_LIB2 \"#{RUBY_VENDOR_LIB2}\"\n"
+  new_config_h << "#define RUBY_VENDOR_ARCHLIB \"#{RUBY_VENDOR_ARCHLIB}\"\n"
+  if !File.exist?(config_h) or File.read(config_h) != new_config_h
+    File.open(config_h, 'w') { |io| io.print new_config_h }
+    ext_dir = ".ext/include/#{NEW_RUBY_PLATFORM}/ruby"
+    mkdir_p(ext_dir)
+    cp(config_h, ext_dir)
+  end
+end
+
+desc "Create dtrace.h"
+task :dtrace_h do
+  dtrace_h = 'dtrace.h'
+  if !File.exist?(dtrace_h) or File.mtime(dtrace_h) < File.mtime('dtrace.d')
+    sh "/usr/sbin/dtrace -h -s dtrace.d -o new_dtrace.h"
+    if !File.exist?(dtrace_h) or File.read(dtrace_h) != File.read('new_dtrace.h')
+      mv 'new_dtrace.h', dtrace_h
+    end
+  end
+end
+
+desc "Create revision.h"
+task :revision_h do
+  revision_h = 'revision.h'
+  current_revision = nil
+  if File.exist?('.svn')
+    info = `sh -c 'LANG=C svn info' 2>&1`
+    md_revision = /^Revision: (\d+)$/.match(info)
+    md_url = /^URL: (.+)$/.match(info)
+    current_revision = "svn revision #{md_revision[1]} from #{md_url[1]}" if md_revision and md_url
+  end
+  if not current_revision and File.exist?('.git/HEAD')
+    commit_sha1 = nil
+    head = File.read('.git/HEAD').strip
+    md_ref = /^ref: (.+)$/.match(head)
+    if md_ref
+      # if the HEAD file contains "ref: XXXX", it's the reference to a branch
+      # so we read the file indicating the last commit of the branch
+      head_file = ".git/#{md_ref[1]}"
+      commit_sha1 = File.read(head_file).strip if File.exist?(head_file)
+    else
+      # otherwise, it's a detached head so it should be the SHA1 of the last commit
+      commit_sha1 = head
+    end
+    current_revision = "git commit #{commit_sha1}" if commit_sha1 and not commit_sha1.empty?
+  end
+  current_revision = 'unknown revision' unless current_revision
+  
+  new_revision_h = "#define MACRUBY_REVISION \"#{current_revision}\"\n"
+  
+  must_recreate_header = true
+  if File.exist?(revision_h)
+    must_recreate_header = false if File.read(revision_h) == new_revision_h
+  end
+  
+  if must_recreate_header
+    File.open(revision_h, 'w') do |f|
+      f.print new_revision_h
+    end
+  end
+end
\ No newline at end of file

Added: MacRuby/branches/experimental/rakelib/spec.rake
===================================================================
--- MacRuby/branches/experimental/rakelib/spec.rake	                        (rev 0)
+++ MacRuby/branches/experimental/rakelib/spec.rake	2009-03-16 21:50:06 UTC (rev 942)
@@ -0,0 +1,11 @@
+namespace :spec do
+  desc "Run continuous integration examples for Ruby 1.9 including stdlib"
+  task :ci do
+    #sh "./mspec/bin/mspec ci -t ./miniruby -B spec/frozen/macruby.mspec"
+    
+    # TODO: Still fails at another require statment.
+    # It seems to spawns yet another process which also needs the proper laod path.
+    # Anyways load paths are currently broken on roxor. Will find out a tmp workaround tonight.
+    sh "./miniruby -v -I./mspec/lib ./mspec/bin/mspec-ci -B spec/frozen/macruby.mspec"
+  end
+end
\ No newline at end of file
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20090316/e798ed97/attachment-0001.html>


More information about the macruby-changes mailing list