setup.rb in reap-5.10.10 vs setup.rb in reap-6.0.0
- old
+ new
@@ -1,32 +1,59 @@
-#!/usr/bin/env ruby
-
#
# setup.rb
#
# Copyright (c) 2000-2005 Minero Aoki
#
# This program is free software.
# You can distribute/modify this program under the terms of
# the GNU LGPL, Lesser General Public License version 2.1.
#
-unless Enumerable.method_defined?(:map) # Ruby 1.4.6
- module Enumerable
- alias map collect
- end
-end
+#############################
+# Forked from version 3.2.1 #
+# #
+# -trans #
+#############################
-unless File.respond_to?(:read) # Ruby 1.6
- def File.read(fname)
- open(fname) {|f|
- return f.read
- }
+# CHANGE No longer need to support 1.4.6 or 1.6 versions of Ruby.
+
+# unless Enumerable.method_defined?(:map) # Ruby 1.4.6
+# module Enumerable
+# alias map collect
+# end
+# end
+
+# unless File.respond_to?(:read) # Ruby 1.6
+# def File.read(fname)
+# open(fname) {|f|
+# return f.read
+# }
+# end
+# end
+
+# This is hack!
+# This is needed to install within an abitrary root dir.
+# B/c setup.rb has become spegetti code, I was forced to do this hack.
+# Setup.rb shuld be re-writ. I would use package.rb instead but
+# it lacks hooks and extension compilation. But we'll keep
+# an eye on that one for the future. -trans.
+
+$setup_install_root = nil
+ARGV.each{ |a|
+ if md = /--root=(.*)/.match( a )
+ $setup_install_root = md[1]
end
+}
+if $setup_install_root
+ ARGV.delete("--root=#{$setup_install_root}")
+ $setup_install_root = File.expand_path($setup_install_root)
+ puts "(root=#{$setup_install_root})"
end
-unless Errno.const_defined?(:ENOTEMPTY) # Windows?
+# Windows?
+
+unless Errno.const_defined?(:ENOTEMPTY)
module Errno
class ENOTEMPTY
# We do not raise this exception, implementation is not needed.
end
end
@@ -55,30 +82,21 @@
# options
@install_prefix = nil
@config_opt = nil
@verbose = true
@no_harm = false
- @libsrc_pattern = '*.rb'
end
attr_accessor :install_prefix
attr_accessor :config_opt
- attr_writer :verbose
+ def verbose=(x) @verbose = x end
+ def verbose?() @verbose end
- def verbose?
- @verbose
- end
+ def no_harm=(x) @no_harm = x end
+ def no_harm?() @no_harm end
- attr_writer :no_harm
-
- def no_harm?
- @no_harm
- end
-
- attr_accessor :libsrc_pattern
-
def [](key)
lookup(key).resolve(self)
end
def []=(key, val)
@@ -117,13 +135,11 @@
if File.file?(path)
MetaConfigEnvironment.new(self, inst).instance_eval File.read(path), path
end
end
- def savefile
- '.config'
- end
+ def savefile() '.config' end
def load_savefile
begin
File.foreach(savefile()) do |line|
k, v = *line.split(/=/, 2)
@@ -142,140 +158,140 @@
end
}
end
def load_standard_entries
- standard_entries(@rbconfig).each do |ent|
+ #standard_entries(@rbconfig).each do |ent|
+ standard_entries.each do |ent|
add ent
end
end
- def standard_entries(rbconfig)
- c = rbconfig
+ def standard_entries #(rbconfig)
+ rbconfig = @rbconfig
- rubypath = c['bindir'] + '/' + c['ruby_install_name']
+ rubypath = File.join(rbconfig['bindir'], rbconfig['ruby_install_name'] + rbconfig['EXEEXT'])
- major = c['MAJOR'].to_i
- minor = c['MINOR'].to_i
- teeny = c['TEENY'].to_i
+ major = rbconfig['MAJOR'].to_i
+ minor = rbconfig['MINOR'].to_i
+ teeny = rbconfig['TEENY'].to_i
version = "#{major}.#{minor}"
- # ruby ver. >= 1.4.4?
- newpath_p = ((major >= 2) or
- ((major == 1) and
- ((minor >= 5) or
- ((minor == 4) and (teeny >= 4)))))
+# CHANGE Do not need to support these old versions any more.
- if c['rubylibdir']
+# # ruby ver. >= 1.4.4?
+# newpath_p = ((major >= 2) or
+# ((major == 1) and
+# ((minor >= 5) or
+# ((minor == 4) and (teeny >= 4)))))
+
+ #if c['rubylibdir']
# V > 1.6.3
- libruby = "#{c['prefix']}/lib/ruby"
- librubyver = c['rubylibdir']
- librubyverarch = c['archdir']
- siteruby = c['sitedir']
- siterubyver = c['sitelibdir']
- siterubyverarch = c['sitearchdir']
- elsif newpath_p
- # 1.4.4 <= V <= 1.6.3
- libruby = "#{c['prefix']}/lib/ruby"
- librubyver = "#{c['prefix']}/lib/ruby/#{version}"
- librubyverarch = "#{c['prefix']}/lib/ruby/#{version}/#{c['arch']}"
- siteruby = c['sitedir']
- siterubyver = "$siteruby/#{version}"
- siterubyverarch = "$siterubyver/#{c['arch']}"
- else
- # V < 1.4.4
- libruby = "#{c['prefix']}/lib/ruby"
- librubyver = "#{c['prefix']}/lib/ruby/#{version}"
- librubyverarch = "#{c['prefix']}/lib/ruby/#{version}/#{c['arch']}"
- siteruby = "#{c['prefix']}/lib/ruby/#{version}/site_ruby"
- siterubyver = siteruby
- siterubyverarch = "$siterubyver/#{c['arch']}"
- end
+
+ root = '/'
+ prefix = rbconfig['prefix']
+
+ libruby = "#{prefix}/lib/ruby"
+ librubyver = rbconfig['rubylibdir']
+ librubyverarch = rbconfig['archdir']
+ siteruby = rbconfig['sitedir']
+ siterubyver = rbconfig['sitelibdir']
+ siterubyverarch = rbconfig['sitearchdir']
+
+ bindir = paramize(rbconfig['bindir'])
+ libdir = paramize(rbconfig['libdir'])
+ datadir = paramize(rbconfig['datadir'])
+ mandir = paramize(rbconfig['mandir'])
+ sysconfdir = paramize(rbconfig['sysconfdir'])
+ localstatedir = paramize(rbconfig['localstatedir'])
+
+# elsif newpath_p
+# # 1.4.4 <= V <= 1.6.3
+# libruby = "#{c['prefix']}/lib/ruby"
+# librubyver = "#{c['prefix']}/lib/ruby/#{version}"
+# librubyverarch = "#{c['prefix']}/lib/ruby/#{version}/#{c['arch']}"
+# siteruby = c['sitedir']
+# siterubyver = "$siteruby/#{version}"
+# siterubyverarch = "$siterubyver/#{c['arch']}"
+# else
+# # V < 1.4.4
+# libruby = "#{c['prefix']}/lib/ruby"
+# librubyver = "#{c['prefix']}/lib/ruby/#{version}"
+# librubyverarch = "#{c['prefix']}/lib/ruby/#{version}/#{c['arch']}"
+# siteruby = "#{c['prefix']}/lib/ruby/#{version}/site_ruby"
+# siterubyver = siteruby
+# siterubyverarch = "$siterubyver/#{c['arch']}"
+# end
+
parameterize = lambda {|path|
- path.sub(/\A#{Regexp.quote(c['prefix'])}/, '$prefix')
+ path.sub(/\A#{Regexp.quote(rbconfig['prefix'])}/, '$prefix')
}
- if arg = c['configure_args'].split.detect {|arg| /--with-make-prog=/ =~ arg }
+ if arg = rbconfig['configure_args'].split.detect {|arg| /--with-make-prog=/ =~ arg }
makeprog = arg.sub(/'/, '').split(/=/, 2)[1]
else
makeprog = 'make'
end
+ installdir_lambda = lambda {|val, table|
+ case val
+ when 'std'
+ table['rbdir'] = '$librubyver'
+ table['sodir'] = '$librubyverarch'
+ when 'site'
+ table['rbdir'] = '$siterubyver'
+ table['sodir'] = '$siterubyverarch'
+ when 'home'
+ setup_rb_error '$HOME was not set' unless ENV['HOME']
+ table['prefix'] = ENV['HOME']
+ table['rbdir'] = '$libdir/ruby'
+ table['sodir'] = '$libdir/ruby'
+ end
+ }
+
[
- ExecItem.new('installdirs', 'std/site/home',
- 'std: install under libruby; site: install under site_ruby; home: install under $HOME')\
- {|val, table|
- case val
- when 'std'
- table['rbdir'] = '$librubyver'
- table['sodir'] = '$librubyverarch'
- when 'site'
- table['rbdir'] = '$siterubyver'
- table['sodir'] = '$siterubyverarch'
- when 'home'
- setup_rb_error '$HOME was not set' unless ENV['HOME']
- table['prefix'] = ENV['HOME']
- table['rbdir'] = '$libdir/ruby'
- table['sodir'] = '$libdir/ruby'
- end
- },
- PathItem.new('prefix', 'path', c['prefix'],
- 'path prefix of target environment'),
- PathItem.new('bindir', 'path', parameterize.call(c['bindir']),
- 'the directory for commands'),
- PathItem.new('libdir', 'path', parameterize.call(c['libdir']),
- 'the directory for libraries'),
- PathItem.new('datadir', 'path', parameterize.call(c['datadir']),
- 'the directory for shared data'),
- PathItem.new('mandir', 'path', parameterize.call(c['mandir']),
- 'the directory for man pages'),
- PathItem.new('sysconfdir', 'path', parameterize.call(c['sysconfdir']),
- 'the directory for system configuration files'),
- PathItem.new('localstatedir', 'path', parameterize.call(c['localstatedir']),
- 'the directory for local state data'),
- PathItem.new('libruby', 'path', libruby,
- 'the directory for ruby libraries'),
- PathItem.new('librubyver', 'path', librubyver,
- 'the directory for standard ruby libraries'),
- PathItem.new('librubyverarch', 'path', librubyverarch,
- 'the directory for standard ruby extensions'),
- PathItem.new('siteruby', 'path', siteruby,
- 'the directory for version-independent aux ruby libraries'),
- PathItem.new('siterubyver', 'path', siterubyver,
- 'the directory for aux ruby libraries'),
- PathItem.new('siterubyverarch', 'path', siterubyverarch,
- 'the directory for aux ruby binaries'),
- PathItem.new('rbdir', 'path', '$siterubyver',
- 'the directory for ruby scripts'),
- PathItem.new('sodir', 'path', '$siterubyverarch',
- 'the directory for ruby extentions'),
- PathItem.new('rubypath', 'path', rubypath,
- 'the path to set to #! line'),
- ProgramItem.new('rubyprog', 'name', rubypath,
- 'the ruby program using for installation'),
- ProgramItem.new('makeprog', 'name', makeprog,
- 'the make program to compile ruby extentions'),
- SelectItem.new('shebang', 'all/ruby/never', 'ruby',
- 'shebang line (#!) editing mode'),
- BoolItem.new('without-ext', 'yes/no', 'no',
- 'does not compile/install ruby extentions')
+ ExecItem.new('installdirs', 'std/site/home', 'install under libruby, site_ruby or $HOME respectively', &installdir_lambda),
+ PathItem.new('root', 'path', root, 'root destination directory'),
+ PathItem.new('prefix', 'path', prefix, 'path prefix of target environment'),
+ PathItem.new('bindir', 'path', bindir, 'the directory for commands'),
+ PathItem.new('libdir', 'path', libdir, 'the directory for libraries'),
+ PathItem.new('datadir', 'path', datadir, 'the directory for shared data'),
+ PathItem.new('mandir', 'path', mandir, 'the directory for man pages'),
+ PathItem.new('sysconfdir', 'path', sysconfdir, 'the directory for system configuration files'),
+ PathItem.new('localstatedir', 'path', localstatedir, 'the directory for local state data'),
+ PathItem.new('libruby', 'path', libruby, 'the directory for ruby libraries'),
+ PathItem.new('librubyver', 'path', librubyver, 'the directory for standard ruby libraries'),
+ PathItem.new('librubyverarch', 'path', librubyverarch, 'the directory for standard ruby extensions'),
+ PathItem.new('siteruby', 'path', siteruby, 'the directory for version-independent aux ruby libraries'),
+ PathItem.new('siterubyver', 'path', siterubyver, 'the directory for aux ruby libraries'),
+ PathItem.new('siterubyverarch', 'path', siterubyverarch, 'the directory for aux ruby binaries'),
+ PathItem.new('rbdir', 'path', '$siterubyver', 'the directory for ruby scripts'),
+ PathItem.new('sodir', 'path', '$siterubyverarch', 'the directory for ruby extentions'),
+ PathItem.new('rubypath', 'path', rubypath, 'the path to set to #! line'),
+ ProgramItem.new('rubyprog', 'name', rubypath, 'the ruby program using for installation'),
+ ProgramItem.new('makeprog', 'name', makeprog, 'the make program to compile ruby extentions'),
+ SelectItem.new('shebang', 'all/ruby/never', 'ruby', 'shebang line (#!) editing mode'),
+ BoolItem.new('without-ext', 'yes/no', 'no', 'does not compile/install ruby extentions')
]
end
private :standard_entries
+ def paramize( path )
+ path.sub(/\A#{Regexp.quote(@rbconfig['prefix'])}/, '$prefix')
+ end
+ private :paramize
+
def load_multipackage_entries
multipackage_entries().each do |ent|
add ent
end
end
def multipackage_entries
[
- PackageSelectionItem.new('with', 'name,name...', '', 'ALL',
- 'package names that you want to install'),
- PackageSelectionItem.new('without', 'name,name...', '', 'NONE',
- 'package names that you do not want to install')
+ PackageSelectionItem.new('with', 'name,name...', '', 'ALL', 'package names that you want to install'),
+ PackageSelectionItem.new('without', 'name,name...', '', 'NONE', 'package names that you do not want to install')
]
end
private :multipackage_entries
ALIASES = {
@@ -336,18 +352,13 @@
def help_opt
"--#{@name}=#{@template}"
end
- def value?
- true
- end
+ def value? ; true ; end
+ def value ; @value ; end
- def value
- @value
- end
-
def resolve(table)
@value.gsub(%r<\$([^/]+)>) { table[$1] }
end
def set(val)
@@ -361,60 +372,52 @@
val
end
end
class BoolItem < Item
- def config_type
- 'bool'
- end
+ def config_type() 'bool' end
def help_opt
"--#{@name}"
end
private
def check(val)
return 'yes' unless val
- unless /\A(y(es)?|n(o)?|t(rue)?|f(alse))\z/i =~ val
+ case val
+ when /\Ay(es)?\z/i, /\At(rue)?\z/i then 'yes'
+ when /\An(o)?\z/i, /\Af(alse)\z/i then 'no'
+ else
setup_rb_error "config: --#{@name} accepts only yes/no for argument"
end
- (/\Ay(es)?|\At(rue)/i =~ value) ? 'yes' : 'no'
end
end
class PathItem < Item
- def config_type
- 'path'
- end
+ def config_type() 'path' end
private
-
def check(path)
setup_rb_error "config: --#{@name} requires argument" unless path
path[0,1] == '$' ? path : File.expand_path(path)
end
end
class ProgramItem < Item
- def config_type
- 'program'
- end
+ def config_type() 'program' end
end
class SelectItem < Item
def initialize(name, selection, default, desc)
super
@ok = selection.split('/')
end
- def config_type
- 'select'
- end
+ def config_type() 'select' end
private
-
def check(val)
unless @ok.include?(val.strip)
setup_rb_error "config: use --#{@name}=#{@template} (#{val})"
end
val.strip
@@ -472,11 +475,11 @@
val
end
end
class MetaConfigEnvironment
- def intiailize(config, installer)
+ def initialize(config, installer)
@config = config
@installer = installer
end
def config_names
@@ -537,11 +540,13 @@
# This module requires: #verbose?, #no_harm?
module FileOperations
def mkdir_p(dirname, prefix = nil)
- dirname = prefix + File.expand_path(dirname) if prefix
+ dirname = File.join(prefix, File.expand_path(dirname)) if prefix
+ dirname = File.join( $setup_install_root, dirname ) if $setup_install_root
+
$stderr.puts "mkdir -p #{dirname}" if verbose?
return if no_harm?
# Does not check '/', it's too abnormal.
dirs = File.expand_path(dirname).split(%r<(?=/)>)
@@ -621,25 +626,33 @@
File.chmod 0777, path
File.unlink path
end
def install(from, dest, mode, prefix = nil)
+
+ realdest = prefix ? File.join(prefix, File.expand_path(dest)) : dest
+ realdest = File.join($setup_install_root, File.expand_path(realdest)) if $setup_install_root
+
$stderr.puts "install #{from} #{dest}" if verbose?
return if no_harm?
- realdest = prefix ? prefix + File.expand_path(dest) : dest
realdest = File.join(realdest, File.basename(from)) if File.dir?(realdest)
+
str = File.binread(from)
if diff?(str, realdest)
verbose_off {
rm_f realdest if File.exist?(realdest)
}
File.open(realdest, 'wb') {|f|
f.write str
}
File.chmod mode, realdest
+ # Do not make InstalledFiles entry if to alternate root.
+ # This prevents problem with root permissions on this file.
+ return true unless $setup_install_root
+
File.open("#{objdir_root()}/InstalledFiles", 'a') {|f|
if prefix
f.puts realdest.sub(prefix, '')
else
f.puts realdest
@@ -660,11 +673,11 @@
end
def ruby(*args)
command config('rubyprog'), *args
end
-
+
def make(task = nil)
command(*[config('makeprog'), task].compact)
end
def extdir?(dir)
@@ -700,38 +713,19 @@
# obsolete: use metaconfig to change configuration
def set_config(key, val)
@config[key] = val
end
- #
# srcdir/objdir (works only in the package directory)
- #
- def curr_srcdir
- "#{srcdir_root()}/#{relpath()}"
- end
+ def curr_srcdir() "#{srcdir_root()}/#{relpath()}" end
+ def curr_objdir() "#{objdir_root()}/#{relpath()}" end
+ def srcfile(path) "#{curr_srcdir()}/#{path}" end
+ def srcexist?(path) File.exist?(srcfile(path)) end
+ def srcdirectory?(path) File.dir?(srcfile(path)) end
+ def srcfile?(path) File.file?(srcfile(path)) end
- def curr_objdir
- "#{objdir_root()}/#{relpath()}"
- end
-
- def srcfile(path)
- "#{curr_srcdir()}/#{path}"
- end
-
- def srcexist?(path)
- File.exist?(srcfile(path))
- end
-
- def srcdirectory?(path)
- File.dir?(srcfile(path))
- end
-
- def srcfile?(path)
- File.file?(srcfile(path))
- end
-
def srcentries(path = '.')
Dir.open("#{curr_srcdir()}/#{path}") {|d|
return d.to_a - %w(. ..)
}
end
@@ -751,11 +745,11 @@
end
class ToplevelInstaller
- Version = '3.4.0'
+ Version = '3.4.1'
Copyright = 'Copyright (c) 2000-2005 Minero Aoki'
TASKS = [
[ 'all', 'do config, setup, then install' ],
[ 'config', 'saves your configurations' ],
@@ -765,34 +759,35 @@
[ 'test', 'run all tests in test/' ],
[ 'clean', "does `make clean' for each extention" ],
[ 'distclean',"does `make distclean' for each extention" ]
]
- def ToplevelInstaller.invoke
- config = ConfigTable.new(load_rbconfig())
+ def self.invoke
+ config = ConfigTable.new(load_rbconfig)
config.load_standard_entries
config.load_multipackage_entries if multipackage?
config.fixup
klass = (multipackage?() ? ToplevelInstallerMulti : ToplevelInstaller)
klass.new(File.dirname($0), config).invoke
end
- def ToplevelInstaller.multipackage?
+ def self.multipackage?
File.dir?(File.dirname($0) + '/packages')
end
- def ToplevelInstaller.load_rbconfig
+ def self.load_rbconfig
if arg = ARGV.detect {|arg| /\A--rbconfig=/ =~ arg }
ARGV.delete(arg)
load File.expand_path(arg.split(/=/, 2)[1])
$".push 'rbconfig.rb'
else
require 'rbconfig'
end
::Config::CONFIG
end
+
def initialize(ardir_root, config)
@ardir = File.expand_path(ardir_root)
@config = config
# cache
@valid_task_re = nil
@@ -827,11 +822,11 @@
__send__ "parsearg_#{task}"
init_installers
__send__ "exec_#{task}"
end
end
-
+
def run_metaconfigs
@config.load_script "#{@ardir}/metaconfig"
end
def init_installers
@@ -840,22 +835,14 @@
#
# Hook Script API bases
#
- def srcdir_root
- @ardir
- end
+ def srcdir_root() @ardir end
+ def objdir_root() '.' end
+ def relpath() '.' end
- def objdir_root
- '.'
- end
-
- def relpath
- '.'
- end
-
#
# Option Parsing
#
def parsearg_global
@@ -892,10 +879,11 @@
@valid_task_re ||= /\A(?:#{TASKS.map {|task,desc| task }.join('|')})\z/
end
def parsearg_no_options
unless ARGV.empty?
+ task = caller(0).first.slice(%r<`parsearg_(\w+)'>, 1)
setup_rb_error "#{task}: unknown options: #{ARGV.join(' ')}"
end
end
alias parsearg_show parsearg_no_options
@@ -979,10 +967,11 @@
end
out.printf fmt, '--rbconfig=path', 'rbconfig.rb to load',"running ruby's"
out.puts
out.puts 'Options for INSTALL:'
out.printf fmt, '--no-harm', 'only display what to do if given', 'off'
+ out.printf fmt, '--root=path', 'install root directory (effects all paths)', '/'
out.printf fmt, '--prefix=path', 'install path prefix', ''
out.puts
end
#
@@ -1173,26 +1162,20 @@
def inspect
"#<#{self.class} #{File.basename(@srcdir)}>"
end
+ def noop(rel) ; end
+
#
# Hook Script API base methods
#
- def srcdir_root
- @srcdir
- end
+ def srcdir_root() @srcdir end
+ def objdir_root() @objdir end
+ def relpath() @currdir end
- def objdir_root
- @objdir
- end
-
- def relpath
- @currdir
- end
-
#
# Config Access
#
# module FileOperations requires this
@@ -1220,80 +1203,118 @@
def exec_config
exec_task_traverse 'config'
end
- def config_dir_bin(rel)
- end
+ alias config_dir_bin noop
+ alias config_dir_lib noop
- def config_dir_lib(rel)
- end
-
- def config_dir_man(rel)
- end
-
def config_dir_ext(rel)
extconf if extdir?(curr_srcdir())
end
+ alias config_dir_data noop
+ alias config_dir_conf noop
+ alias config_dir_man noop
+
def extconf
ruby "#{curr_srcdir()}/extconf.rb", *@config.config_opt
end
- def config_dir_data(rel)
- end
-
- def config_dir_conf(rel)
- end
-
#
# TASK setup
#
def exec_setup
exec_task_traverse 'setup'
end
def setup_dir_bin(rel)
files_of(curr_srcdir()).each do |fname|
- adjust_shebang "#{curr_srcdir()}/#{fname}"
+ update_shebang_line "#{curr_srcdir()}/#{fname}"
end
end
- def adjust_shebang(path)
+ alias setup_dir_lib noop
+
+ def setup_dir_ext(rel)
+ make if extdir?(curr_srcdir())
+ end
+
+ alias setup_dir_data noop
+ alias setup_dir_conf noop
+ alias setup_dir_man noop
+
+ def update_shebang_line(path)
return if no_harm?
+ return if config('shebang') == 'never'
+ old = Shebang.load(path)
+ if old
+ $stderr.puts "warning: #{path}: Shebang line includes too many args. It is not portable and your program may not work." if old.args.size > 1
+ new = new_shebang(old)
+ return if new.to_s == old.to_s
+ else
+ return unless config('shebang') == 'all'
+ new = Shebang.new(config('rubypath'))
+ end
+ $stderr.puts "updating shebang: #{File.basename(path)}" if verbose?
+ open_atomic_writer(path) {|output|
+ File.open(path, 'rb') {|f|
+ f.gets if old # discard
+ output.puts new.to_s
+ output.print f.read
+ }
+ }
+ end
+
+ def new_shebang(old)
+ if /\Aruby/ =~ File.basename(old.cmd)
+ Shebang.new(config('rubypath'), old.args)
+ elsif File.basename(old.cmd) == 'env' and old.args.first == 'ruby'
+ Shebang.new(config('rubypath'), old.args[1..-1])
+ else
+ return old unless config('shebang') == 'all'
+ Shebang.new(config('rubypath'))
+ end
+ end
+
+ def open_atomic_writer(path, &block)
tmpfile = File.basename(path) + '.tmp'
begin
- File.open(path, 'rb') {|r|
- first = r.gets
- return unless File.basename(first.sub(/\A\#!/, '').split[0].to_s) == 'ruby'
- $stderr.puts "adjusting shebang: #{File.basename(path)}" if verbose?
- File.open(tmpfile, 'wb') {|w|
- w.print first.sub(/\A\#!\s*\S+/, '#! ' + config('rubypath'))
- w.write r.read
- }
- }
- move_file tmpfile, File.basename(path)
+ File.open(tmpfile, 'wb', &block)
+ File.rename tmpfile, File.basename(path)
ensure
File.unlink tmpfile if File.exist?(tmpfile)
end
end
- def setup_dir_lib(rel)
- end
+ class Shebang
+ def Shebang.load(path)
+ line = nil
+ File.open(path) {|f|
+ line = f.gets
+ }
+ return nil unless /\A#!/ =~ line
+ parse(line)
+ end
- def setup_dir_man(rel)
- end
+ def Shebang.parse(line)
+ cmd, *args = *line.strip.sub(/\A\#!/, '').split(' ')
+ new(cmd, args)
+ end
- def setup_dir_ext(rel)
- make if extdir?(curr_srcdir())
- end
+ def initialize(cmd, args = [])
+ @cmd = cmd
+ @args = args
+ end
- def setup_dir_data(rel)
- end
+ attr_reader :cmd
+ attr_reader :args
- def setup_dir_conf(rel)
+ def to_s
+ "#! #{@cmd}" + (@args.empty? ? '' : " #{@args.join(' ')}")
+ end
end
#
# TASK install
#
@@ -1306,11 +1327,11 @@
def install_dir_bin(rel)
install_files targetfiles(), "#{config('bindir')}/#{rel}", 0755
end
def install_dir_lib(rel)
- install_files rubyscripts(), "#{config('rbdir')}/#{rel}", 0644
+ install_files libfiles(), "#{config('rbdir')}/#{rel}", 0644
end
def install_dir_ext(rel)
return unless extdir?(curr_srcdir())
install_files rubyextentions('.'),
@@ -1332,17 +1353,18 @@
install_files targetfiles(), "#{config('mandir')}/#{rel}", 0644
end
def install_files(list, dest, mode)
mkdir_p dest, @config.install_prefix
+ #mkdir_p dest, offset_dir
list.each do |fname|
install fname, dest, mode, @config.install_prefix
end
end
- def rubyscripts
- glob_select(@config.libsrc_pattern, targetfiles())
+ def libfiles
+ glob_reject(%w(*.y *.output), targetfiles())
end
def rubyextentions(dir)
ents = glob_select("*.#{@config.dllext}", targetfiles())
if ents.empty?
@@ -1416,11 +1438,15 @@
unless File.directory?('test')
$stderr.puts 'no test in this package' if verbose?
return
end
$stderr.puts 'Running tests...' if verbose?
- require 'test/unit'
+ begin
+ require 'test/unit'
+ rescue LoadError
+ setup_rb_error 'test/unit cannot loaded. You need Ruby 1.8 or later to invoke this task.'
+ end
runner = Test::Unit::AutoRunner.new(true)
runner.to_run << TESTDIR
runner.run
end
@@ -1432,61 +1458,50 @@
exec_task_traverse 'clean'
rm_f @config.savefile
rm_f 'InstalledFiles'
end
- def clean_dir_bin(rel)
- end
+ alias clean_dir_bin noop
+ alias clean_dir_lib noop
+ alias clean_dir_data noop
+ alias clean_dir_conf noop
+ alias clean_dir_man noop
- def clean_dir_lib(rel)
- end
-
def clean_dir_ext(rel)
return unless extdir?(curr_srcdir())
make 'clean' if File.file?('Makefile')
end
- def clean_dir_data(rel)
- end
-
- def clean_dir_conf(rel)
- end
-
#
# TASK distclean
#
def exec_distclean
exec_task_traverse 'distclean'
rm_f @config.savefile
rm_f 'InstalledFiles'
end
- def distclean_dir_bin(rel)
- end
+ alias distclean_dir_bin noop
+ alias distclean_dir_lib noop
- def distclean_dir_lib(rel)
- end
-
def distclean_dir_ext(rel)
return unless extdir?(curr_srcdir())
make 'distclean' if File.file?('Makefile')
end
- def distclean_dir_data(rel)
- end
+ alias distclean_dir_data noop
+ alias distclean_dir_conf noop
+ alias distclean_dir_man noop
- def distclean_dir_conf(rel)
- end
-
#
- # lib
+ # Traversing
#
def exec_task_traverse(task)
run_hook "pre-#{task}"
FILETYPES.each do |type|
- if config('without-ext') == 'yes' and type == 'ext'
+ if type == 'ext' and config('without-ext') == 'yes'
$stderr.puts 'skipping ext/* by user option' if verbose?
next
end
traverse task, type, "#{task}_dir_#{type}"
end