Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Fetching contributors…

Cannot retrieve contributors at this time

327 lines (270 sloc) 9.472 kb
require 'fileutils'
# TODO abstract usage of with_destdir out of the rake tasks
# so that they only appear in helper methods
module Installer
include FileUtils
# Hard coded
def prog_mode; 0755; end
def dir_mode; 0755; end
def data_mode; 0644; end
def script_mode; 0775; end
def made_dirs
@made_dirs ||= []
end
def with_destdir dir
return dir if !DESTDIR or DESTDIR.empty?
return DESTDIR + dir
end
def ln_sf src, dest
super(src, with_destdir(dest))
# puts dest
end
def ln_sfh src, dest
ln_sf(src, dest) unless File.symlink?(with_destdir(dest))
end
def install src, dest, opts = {}
strip = opts.delete :strip
opts[:preserve] = true
super(src, with_destdir(dest), opts)
if made_dirs.include? dest
dest = File.join(dest, File.basename(src))
end
#puts dest
if strip
system("/usr/bin/strip -x '#{File.join(with_destdir(dest), File.basename(src))}'")
end
end
def makedirs *dirs
dirs.collect! do |dir|
realdir = with_destdir(dir)
realdir unless made_dirs.include?(dir) do
made_dirs << dir
# puts File.join(dir, '')
File.directory?(realdir)
end
end.compact!
super(dirs, :mode => dir_mode) unless dirs.empty?
end
def install_recursive srcdir, dest, options = {}
opts = options.clone
noinst = Array(opts.delete(:no_install))
glob = opts.delete(:glob) || '*'
subpath = srcdir.size..-1
Dir.glob("#{srcdir}/**/#{glob}") do |src|
base = File.basename(src)
next if base.match(/\A\#.*\#\z/) or base.match(/~\z/)
next if noinst.any? { |n| File.fnmatch?(n, base) }
d = dest + src[subpath]
if File.directory?(src)
makedirs(d)
else
makedirs(File.dirname(d))
install src, d, opts
end
end
end
def open_for_install path, mode
data = begin
realpath = with_destdir(path)
open(realpath, 'rb') { |f| f.read }
rescue
nil
end
newdata = yield
unless newdata == data
open(realpath, 'wb', mode) { |f| f.write newdata }
end
File.chmod(mode, realpath)
puts 'Wrote ' + path
end
def dylib
"lib#{RUBY_SO_NAME}.#{NEW_RUBY_VERSION}.dylib"
end
def ruby_shebang
"#{FRAMEWORK_USR_BIN}/#{RUBY_INSTALL_NAME}"
end
def man_dir
"#{FRAMEWORK_USR_SHARE}/man"
end
def ri_dir
"#{FRAMEWORK_USR_SHARE}/ri/#{NEW_RUBY_VERSION}/system"
end
def lib_dir
"#{FRAMEWORK_USR_LIB}/ruby/#{NEW_RUBY_VERSION}"
end
def arch_lib_dir
"#{lib_dir}/#{NEW_RUBY_PLATFORM}"
end
def header_dir
"#{FRAMEWORK_USR}/include/ruby-#{NEW_RUBY_VERSION}"
end
def ruby_header_dir
"#{header_dir}/ruby"
end
def arch_header_dir
"#{header_dir}/#{NEW_RUBY_PLATFORM}"
end
def dest_bin
"#{SYM_INSTDIR}/bin"
end
def dest_man
"#{SYM_INSTDIR}/share/man"
end
end
namespace :install do
extend Installer
task :all => [:standard, :xcode_support]
desc 'Install MacRuby without Xcode support'
task :standard => [:bin, :scripts, :lib, :ext, :headers, :doc, :man, :resources]
desc 'Install MacRuby binaries'
task :bin do
puts 'Installing the macruby binary and dependencies'
makedirs FRAMEWORK_USR_BIN, FRAMEWORK_USR_LIB, arch_lib_dir
install RUBY_INSTALL_NAME, FRAMEWORK_USR_BIN, :mode => prog_mode, :strip => true
install 'rbconfig.rb', arch_lib_dir, :mode => data_mode
install 'rbconfig.rbo', arch_lib_dir, :mode => data_mode
install dylib, FRAMEWORK_USR_LIB, :mode => prog_mode, :strip => true
for link in DYLIB_ALIASES.split
ln_sf dylib, "#{FRAMEWORK_USR_LIB}/#{link}"
end
puts 'Installing LLVM tool'
install "#{LLVM_PATH}/bin/llc", "#{FRAMEWORK_USR_BIN}/llc", :mode => prog_mode
end
desc 'Install command scripts (e.g. macirb)'
task :scripts do
puts 'Installing command scripts'
makedirs FRAMEWORK_USR_BIN
for src in Dir.glob('bin/*')
next unless File.file?(src)
next if /\/[.#]|(\.(old|bak|orig|rej|diff|patch|core)|~|\/core)$/i =~ src
bname = File.basename(src)
name = case bname
when 'rb_nibtool'
bname
else
RUBY_INSTALL_NAME.sub(/ruby/, bname)
end
shebang = ''
body = ''
open(src, 'rb') do |f|
shebang = f.gets
body = f.read
end
shebang.sub!(/^\#!.*?ruby\b/) { '#!' + ruby_shebang }
shebang.sub!(/\r$/, '')
body.gsub!(/\r$/, '')
cmd = "#{FRAMEWORK_USR_BIN}/#{name}"
open_for_install(cmd, script_mode) do
shebang + body
end
end
end
desc 'Install the standard library'
task :lib do
makedirs lib_dir
for file in Dir['lib/**/*{.rb,.rbo,help-message}']
dir = File.dirname(file).sub!(/\Alib/, lib_dir) || lib_dir
makedirs dir
install file, dir, :mode => data_mode
end
end
desc 'Install the C extensions'
task :ext do
Builder::Ext.install
# Install the extensions rbo.
Dir.glob('ext/**/lib/**/*.rbo').each do |path|
ext_name, sub_path = path.scan(/^ext\/(.+)\/lib\/(.+)$/)[0]
next unless EXTENSIONS.include?(ext_name)
sub_dir = File.dirname(sub_path)
install_recursive path, "#{RUBY_SITE_LIB2}/#{sub_dir}", :mode => prog_mode
end
puts 'Installing extension objects'
makedirs RUBY_SITE_LIB2, RUBY_VENDOR_ARCHLIB
install_recursive "#{EXTOUT}/#{NEW_RUBY_PLATFORM}", arch_lib_dir, :mode => prog_mode
install_recursive "#{EXTOUT}/include/#{NEW_RUBY_PLATFORM}", arch_header_dir, :glob => '*.h', :mode => data_mode
puts 'Installing extensions scripts'
install_recursive "#{EXTOUT}/common", lib_dir, :mode => data_mode
install_recursive "#{EXTOUT}/include/ruby", ruby_header_dir, :glob => '*.h', :mode => data_mode
end
desc 'Install the MacRuby headers'
task :headers do
puts 'Installing headers'
install_recursive 'include', header_dir, :glob => '*.h', :mode => data_mode
end
desc 'Install RDoc and RI documentation'
task :doc do
puts 'Installing RI data'
install_recursive 'doc/', ri_dir, :mode => data_mode
end
desc 'Install the MacRuby man pages'
task :man do
puts 'Installing man pages'
for mdoc in Dir['*.[1-9]']
# TODO is this check really needed?
next unless File.file?(mdoc) and open(mdoc){ |fh| fh.read(1) == '.' }
destdir = "#{man_dir}/man#{mdoc[/(\d+)$/]}"
destfile = "#{destdir}/#{mdoc.sub(/^/, 'mac')}"
makedirs destdir
install mdoc, destfile, :mode => data_mode
end
end
task :resources do
desc 'Install the MacRuby framework and related resources'
puts 'Installing framework resources'
makedirs FRAMEWORK_RESOURCES
install 'framework/Info.plist', FRAMEWORK_RESOURCES, :mode => data_mode
resources = "#{FRAMEWORK_RESOURCES}/English.lproj"
makedirs resources
install 'framework/InfoPlist.strings', resources, :mode => data_mode
if File.symlink?(with_destdir("#{FRAMEWORK_VERSION}/../Current"))
rm_f "#{FRAMEWORK_VERSION}/../Current"
end
ln_sfh INSTALL_VERSION.to_s, "#{FRAMEWORK_VERSION}/../Current"
ln_sfh 'Versions/Current/Headers', "#{FRAMEWORK_VERSION}/../../Headers"
ln_sfh 'Versions/Current/MacRuby', "#{FRAMEWORK_VERSION}/../../MacRuby"
ln_sfh 'Versions/Current/Resources', "#{FRAMEWORK_VERSION}/../../Resources"
ln_sfh "usr/lib/#{dylib}", "#{FRAMEWORK_VERSION}/MacRuby"
ln_sfh "usr/include/ruby-#{NEW_RUBY_VERSION}", "#{FRAMEWORK_VERSION}/Headers"
ln_sfh "../#{NEW_RUBY_PLATFORM}/ruby/config.h",
"#{FRAMEWORK_VERSION}/usr/include/ruby-#{NEW_RUBY_VERSION}/ruby/config.h"
puts 'Installing executable symlinks'
makedirs dest_bin
Dir.entries(with_destdir(FRAMEWORK_USR_BIN)).each do |file|
next if file.match(/^\./)
# Except rb_nibtool & llc!
next if file == 'rb_nibtool' or file == 'llc'
link = "#{FRAMEWORK_USR_BIN}/#{file}"
link.sub!(/#{INSTALL_VERSION}/, 'Current')
link_dest = "#{dest_bin}/#{File.basename(file)}"
unless File.exists?(with_destdir(link_dest))
ln_sfh link, link_dest
end
end
puts 'Installing man page symlinks'
makedirs dest_man
Dir.entries(with_destdir(man_dir)).each do |man_set|
next if man_set.match(/^\./)
if File.stat("#{with_destdir(man_dir)}/#{man_set}").directory?
makedirs "#{dest_man}/#{File.basename(man_set)}"
Dir.entries("#{with_destdir(man_dir)}/#{man_set}").each do |man_file|
next if man_file.match(/^\./)
link = "../../../../../#{man_dir}/#{man_set}/#{man_file}"
link.sub!(/#{INSTALL_VERSION}/, 'Current')
link_dest = "#{dest_man}/#{File.basename(man_set)}/#{File.basename(man_file)}"
unless File.exists?(with_destdir(link_dest))
ln_sfh link, link_dest
end
end
else
link = "../../../../#{man_dir}/#{man_set}"
link.sub!(/#{INSTALL_VERSION}/, 'Current')
ln_sfh link, "#{dest_man}/#{File.basename(man_set)}"
end
end
install_recursive 'misc/xcode4-templates', "#{FRAMEWORK_RESOURCES}/Templates", :mode => prog_mode
end
desc 'Install all Xcode related things'
task :xcode_support do
`/usr/local/bin/macruby_install_xcode_support`
end
end
Jump to Line
Something went wrong with that request. Please try again.