Index: lib/fileutils.rb
===================================================================
RCS file: /cvs/ruby/src/ruby/lib/fileutils.rb,v
retrieving revision 1.38
diff -u -2 -p -d -r1.38 fileutils.rb
--- lib/fileutils.rb	13 Feb 2004 12:53:42 -0000	1.38
+++ lib/fileutils.rb	15 Feb 2004 08:55:59 -0000
@@ -643,5 +643,12 @@ module FileUtils
   # 
   def install(src, dest, options = {})
-    fu_check_options options, :mode, :preserve, :noop, :verbose
+    fu_check_options options, :mode, :preserve, :directory, :noop, :verbose
+    if options[:directory] and not File.exist?(dest)
+      opt = {:verbose => options[:verbose], :noop => options[:noop]}
+      if mode = options[:mode]
+        opt[:mode] = ((mode & 0444) >> 2) | mode
+      end
+      mkdir_p dest, opt
+    end
     fu_output_message "install -c#{options[:preserve] && ' -p'}#{options[:mode] ? (' -m 0%o' % options[:mode]) : ''} #{[src,dest].flatten.join ' '}" if options[:verbose]
     return if options[:noop]
Index: lib/mkmf.rb
===================================================================
RCS file: /cvs/ruby/src/ruby/lib/mkmf.rb,v
retrieving revision 1.173
diff -u -2 -p -d -r1.173 mkmf.rb
--- lib/mkmf.rb	14 Feb 2004 16:50:53 -0000	1.173
+++ lib/mkmf.rb	15 Feb 2004 09:24:00 -0000
@@ -411,4 +411,5 @@ ensure
 end
 
+=begin
 def install_files(mfile, ifiles, map = nil, srcprefix = nil)
   ifiles or return
@@ -447,4 +448,5 @@ def install_files(mfile, ifiles, map = n
   dirs
 end
+=end
 
 def install_rb(mfile, dest, srcdir = nil)
@@ -907,33 +909,30 @@ static:		$(STATIC_LIB)
 }
   mfile.print CLEANINGS
-  dirs = []
   mfile.print "install: install-so install-rb\n\n"
   if not $static and target
-    dirs << (dir = "$(RUBYARCHDIR)")
-    mfile.print("install-so: #{dir}\n")
+    dir = "$(RUBYARCHDIR)"
     f = "$(DLLIB)"
     dest = "#{dir}/#{f}"
     mfile.print "install-so: #{dest}\n"
     unless $extout
-      mfile.print "#{dest}: #{f}\n\t@$(INSTALL_PROG) #{f} #{dir}\n"
+      mfile.print "#{dest}: #{f}\n\t@$(INSTALL_PROG) #{f} #{dest}\n"
     end
   end
-  dirs << (dir = "$(RUBYLIBDIR)")
-  mfile.print("install-rb: #{dir}\n")
-  for i in [[["lib/**/*.rb", "$(RUBYLIBDIR)", "lib"]], $INSTALLFILES]
-    files = install_files(mfile, i, nil, srcprefix) or next
-    for dir, *files in files
-      unless dirs.include?(dir)
-	dirs << dir
-	mfile.print "install-rb: #{dir}\n"
-      end
-      files.each do |f|
-	dest = "#{dir}/#{File.basename(f)}"
-	mfile.print("install-rb: #{dest}\n")
-	mfile.print("#{dest}: #{f}\n\t@$(INSTALL_DATA) #{f} #{dir}\n")
+  dir = "$(RUBYLIBDIR)"
+  mfile.print("install-rb:\n")
+  for ifiles in [[["lib/**/*.rb", "$(RUBYLIBDIR)", "lib"]], $INSTALLFILES]
+    ifiles or next
+    ifiles.each do |files, dir, prefix|
+      dir = map_dir(dir, INSTALL_DIRS)
+      files = files.sub(/\A\.\//, '')
+      src = $& || "$(srcdir)/"
+      if prefix
+        files = files.sub(%r"\A(#{Regexp.quote(prefix)})(?:/|\z)", '')
+        src << $1 if $1
       end
+      src.chomp!("/")
+      mfile.print("\t@$(INSTALL_DATA) -P#{files} #{src} #{dir}\n")
     end
   end
-  dirs.each {|dir| mfile.print "#{dir}:\n\t@$(MAKEDIRS) $@\n"}
 
   mfile.print <<-SITEINSTALL
Index: lib/un.rb
===================================================================
RCS file: /cvs/ruby/src/ruby/lib/un.rb,v
retrieving revision 1.5
diff -u -2 -p -d -r1.5 un.rb
--- lib/un.rb	14 Feb 2004 14:27:43 -0000	1.5
+++ lib/un.rb	15 Feb 2004 08:38:06 -0000
@@ -31,16 +31,4 @@ end
 
 def setup(options = "")
-  ARGV.map! do |x|
-    case x
-    when /^-/
-      x.delete "^-#{options}v"
-    when /[*?\[{]/
-      Dir[x]
-    else
-      x
-    end
-  end
-  ARGV.flatten!
-  ARGV.delete_if{|x| x == "-"}
   opt_hash = {}
   OptionParser.new do |o|
@@ -53,4 +41,12 @@ def setup(options = "")
     o.parse!
   end
+  ARGV.map! do |x|
+    case x
+    when /[*?\[{]/
+      Dir[x]
+    else
+      x
+    end
+  end.flatten!
   yield ARGV, opt_hash
 end
@@ -172,14 +168,26 @@ end
 #  		corresponding destination files
 #   -m		set permission mode (as in chmod), instead of 0755
+#   -d		create directory if needed
+#   -Ppattern	glob by pattern
 #   -v		verbose
 #
 
 def install
-  setup("pm:") do |argv, options|
+  setup("pm:dP:") do |argv, options|
     options[:mode] = (mode = options.delete :m) ? mode.oct : 0755
     options[:preserve] = true if options.delete :p
+    options[:directory] = true if options.delete :d
     dest = argv.pop
-    argv = argv[0] if argv.size == 1
-    FileUtils.install argv, dest, options
+    if pattern = options.delete(:P)
+      argv.each do |dir|
+        Dir.glob(File.join(dir, pattern)) do |src|
+          d = File.dirname(File.join(dest, src[(dir.size+1)..-1]))
+          FileUtils.install src, d, options
+        end
+      end
+    else
+      argv = argv[0] if argv.size == 1
+      FileUtils.install argv, dest, options
+    end
   end
 end
