ruby/tool/mkrunnable.rb

86 строки
2.2 KiB
Ruby
Executable File

#!./miniruby
# -*- coding: us-ascii -*-
require 'mkmf'
case ARGV[0]
when "-n"
ARGV.shift
include FileUtils::DryRun
when "-v"
ARGV.shift
include FileUtils::Verbose
else
include FileUtils
end
module Mswin
def ln_safe(src, dest, *opt)
cmd = ["mklink", dest.tr("/", "\\"), src.tr("/", "\\")]
cmd[1, 0] = opt
# TODO: use RUNAS or something
puts cmd.join(" ")
end
def ln_dir_safe(src, dest)
ln_safe(src, dest, "/d")
end
end
def ln_safe(src, dest)
link = File.readlink(dest) rescue nil
return if link == src
ln_sf(src, dest)
end
alias ln_dir_safe ln_safe
if /mingw|mswin/ =~ RbConfig::CONFIG["build_os"]
extend Mswin
end
config = RbConfig::CONFIG
extout = ARGV[0] || config["EXTOUT"]
version = config["ruby_version"]
arch = config["arch"]
bindir = File.basename(config["bindir"])
libdir = File.basename(config["libdir"])
archdir = File.join(extout, arch)
[bindir, libdir, archdir].each do |dir|
File.directory?(dir) or mkdir_p(dir)
end
exeext = config["EXEEXT"]
ruby_install_name = config["ruby_install_name"]
rubyw_install_name = config["rubyw_install_name"]
goruby_install_name = "go" + ruby_install_name
[ruby_install_name, rubyw_install_name, goruby_install_name].map do |ruby|
ruby += exeext
if ruby and !ruby.empty?
ln_safe("../#{ruby}", "#{bindir}/#{ruby}")
end
end
libruby = config.values_at("LIBRUBY_A", "LIBRUBY_SO")
libruby.concat(config["LIBRUBY_ALIASES"].split)
libruby.each {|lib|ln_safe("../#{lib}", "#{libdir}/#{lib}")}
if File.expand_path(extout) == extout
ln_dir_safe(extout, "#{libdir}/ruby")
else
ln_dir_safe(File.join("..", extout), "#{libdir}/ruby")
cur = "#{extout}/".gsub(/(\A|\/)(?:\.\/)+/, '\1').tr_s('/', '/')
nil while cur.sub!(/[^\/]+\/\.\.\//, '')
if /(\A|\/)\.\.\// =~ cur
cur = nil
else
cur.gsub!(/[^\/]+/, '..')
end
end
if cur
ln_safe(File.join("..", cur, "rbconfig.rb"), File.join(archdir, "rbconfig.rb"))
else
ln_safe(File.expand_path("rbconfig.rb"), File.join(archdir, "rbconfig.rb"))
end
ln_dir_safe("common", File.join(extout, version))
ln_dir_safe(File.join("..", arch), File.join(extout, "common", arch))
ln_dir_safe(relative_from(File.join(File.dirname(config["srcdir"]), "lib"), ".."), File.join(extout, "vendor_ruby"))