Revision: 3355 http://trac.macosforge.org/projects/ruby/changeset/3355 Author: eloy.de.enige@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)