[macruby-changes] [2904] MacRuby/trunk/bin/ruby_deploy
source_changes at macosforge.org
source_changes at macosforge.org
Tue Oct 27 16:09:42 PDT 2009
Revision: 2904
http://trac.macosforge.org/projects/ruby/changeset/2904
Author: lsansonetti at apple.com
Date: 2009-10-27 16:09:40 -0700 (Tue, 27 Oct 2009)
Log Message:
-----------
adding macruby_deploy, a tool to help embedding macruby inside an application bundle
Added Paths:
-----------
MacRuby/trunk/bin/ruby_deploy
Added: MacRuby/trunk/bin/ruby_deploy
===================================================================
--- MacRuby/trunk/bin/ruby_deploy (rev 0)
+++ MacRuby/trunk/bin/ruby_deploy 2009-10-27 23:09:40 UTC (rev 2904)
@@ -0,0 +1,101 @@
+#!/usr/bin/ruby
+# MacRuby Deployer.
+#
+# This file is covered by the Ruby license.
+#
+# Copyright (C) 2009, Apple Inc
+
+require 'optparse'
+require 'rbconfig'
+require 'fileutils'
+
+class Deployer
+ include FileUtils
+
+ NAME = File.basename(__FILE__)
+
+ def initialize(argv)
+ OptionParser.new do |opts|
+ opts.banner = "Usage: #{NAME} [options] application-bundle"
+ opts.on('--no-stdlib', "Do not include the standard library") do
+ @no_stdlib = true
+ end
+ opts.on('-v', '--version', 'Display the version') do
+ puts RUBY_DESCRIPTION
+ exit 1
+ end
+ begin
+ opts.parse!(argv)
+ rescue OptionParser::InvalidOption => e
+ die e, opts
+ end
+ die opts if argv.size != 1
+ @app_bundle = argv[0]
+ end
+
+ if !File.exist?(@app_bundle)
+ die "Given path `#{@app_bundle}' doesn't exist"
+ end
+ if !File.directory?(@app_bundle) or !File.exist?(File.join(@app_bundle, 'Contents'))
+ die "Given path `#{@app_bundle}' doesn't seem to be a valid application bundle"
+ end
+
+ # Locate necessary programs.
+ @install_name_tool = locate('install_name_tool')
+
+ # Locate the MacRuby framework.
+ @macruby_framework_path = Config::CONFIG['libdir'].scan(/^.+MacRuby\.framework/)[0]
+ if !File.exist?(@macruby_framework_path)
+ die "Cannot locate MacRuby.framework from rbconfig.rb"
+ end
+ end
+
+ def run
+ # Copy MacRuby.framework inside MyApp.app/Contents/Frameworks.
+ app_frameworks = File.join(@app_bundle, 'Contents/Frameworks')
+ mkdir_p(app_frameworks)
+ app_macruby = File.join(app_frameworks, 'MacRuby.framework')
+ rm_rf(app_macruby)
+ cp_r(@macruby_framework_path, app_frameworks)
+
+ # Delete unnecessary things in the MacRuby.framework copy.
+ app_macruby_usr = File.join(app_macruby, 'Versions', MACRUBY_VERSION, 'usr')
+ macruby_usr = File.join(@macruby_framework_path, 'Versions', MACRUBY_VERSION, 'usr')
+ die "oops" if !File.exist?(app_macruby_usr) or !File.exist?(macruby_usr)
+ dirs = ['bin', 'include', 'lib/libmacruby-static.a', 'share']
+ if @no_stdlib
+ dirs << 'lib/ruby'
+ end
+ dirs << 'lib/ruby/Gems' # TODO add gems support
+ dirs.each { |x| rm_rf(File.join(app_macruby_usr, x)) }
+
+ # Hack the application binaries to link against the MacRuby.framework copy.
+ patterns = [File.join(@app_bundle, 'Contents/MacOS/*'), File.join(app_macruby_usr, 'lib/ruby/**/*.{bundle,rbo}')]
+ patterns.each do |pat|
+ Dir.glob(pat).each do |bin|
+ execute("#{@install_name_tool} -change #{macruby_usr}/lib/libmacruby.dylib @executable_path/../Frameworks/MacRuby.framework/Versions/#{MACRUBY_VERSION}/usr/lib/libmacruby.dylib '#{bin}'")
+ end
+ end
+ end
+
+ private
+
+ def execute(line)
+ ret = `#{line}`
+ die "Error when executing `#{line}'" unless $?.success?
+ ret
+ end
+
+ def locate(progname)
+ path = `which #{progname}`.strip
+ die "Can't locate program `#{progname}'" if path.empty?
+ path
+ end
+
+ def die(*args)
+ $stderr.puts args
+ exit 1
+ end
+end
+
+Deployer.new(ARGV).run
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20091027/9a928a47/attachment.html>
More information about the macruby-changes
mailing list