# $Id: installer.rb,v 1.3 2003/07/21 03:46:50 icculus Exp $ require 'rbconfig' require 'find' require 'ftools' include Config module Slimb class Installer def initialize target_dir = "", &user_skip @user_skip = user_skip or proc {|f| false} @version = CONFIG["MAJOR"] + "." + CONFIG["MINOR"] @libdir = File.join(CONFIG["libdir"], "ruby", @version) @sitedir = CONFIG["sitedir"] || File.join(@libdir, "site_ruby") @dest = File.join @sitedir, target_dir File::makedirs @dest File::chmod 0755, @dest, true end def skip? file @user_skip[file] or file[0] == ?. or file[-1] == ?~ or file[-1] == ?# end def install_dir dir File::makedirs(File.join(@dest, dir)) File::chmod(0755, File.join(@dest, dir), true) Dir.foreach(dir) {|file| next if skip? file if File.ftype(File.join(dir, file)) == "directory" install_dir File.join(dir, file) else install_file File.join(dir, file) end } end def install_file file if file =~ /\.so$/ install_so file else File::install file, File.join(@dest, file), 0644, true end end def install_so file File::install file, File.join(CONFIG["sitearchdir"], file), 0644, true end def uninstall_so file file = File.join(CONFIG["sitearchdir"], file) File::safe_unlink file end def install something case something when Array something.each {|x| install x if x.is_a? String } when String if File.ftype(something) == "directory" install_dir something else install_file something end end end def uninstall what = "*" case what when Array files = what.map {|x| File.join(@dest, x)} when String files = Dir[File.join(@dest, what)] end files.each {|x| # FIXME: recursive uninstall is a must next if FileTest.directory? x File::safe_unlink x } end def run files, argv if !argv.grep(/--uninstall/).empty? uninstall files else install files end end end end # self-installation if $0 == __FILE__ $stderr.puts "Installing slimb installer..." Slimb::Installer.new("slimb").install File.basename(__FILE__) end