[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