Develop and Download Open Source Software

Browse CVS Repository

Diff of /exerb/exerb-cc/setup.rb

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph | View Patch Patch

revision 1.1 by yuya, Thu Sep 18 04:35:26 2003 UTC revision 1.2 by yuya, Thu Feb 12 16:29:01 2004 UTC
# Line 3  Line 3 
3  #  #
4  # setup.rb  # setup.rb
5  #  #
6  #   Copyright (c) 2000-2003 Minero Aoki <aamine@loveruby.net>  # Copyright (c) 2000-2003 Minero Aoki <aamine@loveruby.net>
7  #  #
8  #   This program is free software.  # This program is free software.
9  #   You can distribute/modify this program under the terms of  # You can distribute/modify this program under the terms of
10  #   the GNU Lesser General Public License version 2.  # the GNU Lesser General Public License version 2.
11  #  #
12    
13  def multipackage_install?  def multipackage_install?
# Line 18  end Line 18  end
18  # compat.rb  # compat.rb
19  #  #
20    
21  module Enumerable  unless Enumerable.method_defined?(:map)
22    methods = instance_methods(true)    module Enumerable
   
   unless methods.include?('map')  
23      alias map collect      alias map collect
24    end    end
25    end
26    
27    unless methods.include?('select')  unless Enumerable.method_defined?(:select)
28      module Enumerable
29      alias select find_all      alias select find_all
30    end    end
31    end
32    
33    unless methods.include?('reject')  unless Enumerable.method_defined?(:reject)
34      module Enumerable
35      def reject      def reject
36        result = []        result = []
37        each do |i|        each do |i|
# Line 38  module Enumerable Line 40  module Enumerable
40        result        result
41      end      end
42    end    end
43    end
44    
45    unless methods.include?('inject')  unless Enumerable.method_defined?(:inject)
46      def inject( result )    module Enumerable
47        def inject(result)
48        each do |i|        each do |i|
49          result = yield(result, i)          result = yield(result, i)
50        end        end
51        result        result
52      end      end
53    end    end
54    end
55    
56    unless methods.include?('any?')  unless Enumerable.method_defined?(:any?)
57      module Enumerable
58      def any?      def any?
59        each do |i|        each do |i|
60          return true if yield(i)          return true if yield(i)
# Line 57  module Enumerable Line 63  module Enumerable
63      end      end
64    end    end
65  end  end
66    
67    unless File.respond_to?(:read)
68      def File.read(fname)
69        File.open(fname, 'rb') {|f|
70          return f.read
71        }
72      end
73    end
74  #  #
75  # fileop.rb  # fileop.rb
76  #  #
77    
78  module FileOperations  module FileOperations
79    
80    def mkdir_p( dirname, prefix = nil )    def mkdir_p(dirname, prefix = nil)
81      dirname = prefix + dirname if prefix      dirname = prefix + dirname if prefix
82      $stderr.puts "mkdir -p #{dirname}" if verbose?      $stderr.puts "mkdir -p #{dirname}" if verbose?
83      return if no_harm?      return if no_harm?
84    
85      # does not check '/'... it's too abnormal case      # does not check '/'... it's too abnormal case
86      dirs = dirname.split(%r<(?=/)>)      dirs = dirname.split(%r<(?=/)>)
87      if /\A[a-z]:\z/i === dirs[0]      if /\A[a-z]:\z/i =~ dirs[0]
88        disk = dirs.shift        disk = dirs.shift
89        dirs[0] = disk + dirs[0]        dirs[0] = disk + dirs[0]
90      end      end
91      dirs.each_index do |idx|      dirs.each_index do |idx|
92        path = dirs[0..idx].join('')        path = dirs[0..idx].join('')
93        Dir.mkdir path unless dir?(path)        Dir.mkdir path unless File.dir?(path)
94      end      end
95    end    end
96    
97    def rm_f( fname )    def rm_f(fname)
98      $stderr.puts "rm -f #{fname}" if verbose?      $stderr.puts "rm -f #{fname}" if verbose?
99      return if no_harm?      return if no_harm?
100    
101      if FileTest.exist?(fname) or FileTest.symlink?(fname)      if File.exist?(fname) or File.symlink?(fname)
102        File.chmod 0777, fname        File.chmod 0777, fname
103        File.unlink fname        File.unlink fname
104      end      end
105    end    end
106    
107    def rm_rf( dn )    def rm_rf(dn)
108      $stderr.puts "rm -rf #{dn}" if verbose?      $stderr.puts "rm -rf #{dn}" if verbose?
109      return if no_harm?      return if no_harm?
110    
# Line 98  module FileOperations Line 112  module FileOperations
112      Dir.foreach('.') do |fn|      Dir.foreach('.') do |fn|
113        next if fn == '.'        next if fn == '.'
114        next if fn == '..'        next if fn == '..'
115        if dir?(fn)        if File.dir?(fn)
116          verbose_off {          verbose_off {
117            rm_rf fn            rm_rf fn
118          }          }
# Line 112  module FileOperations Line 126  module FileOperations
126      Dir.rmdir dn      Dir.rmdir dn
127    end    end
128    
129    def move_file( src, dest )    def move_file(src, dest)
130      File.unlink dest if FileTest.exist?(dest)      File.unlink dest if File.exist?(dest)
131      begin      begin
132        File.rename src, dest        File.rename src, dest
133      rescue      rescue
134        File.open(dest, 'wb') {|f| f.write read_file(src) }        File.open(dest, 'wb') {|f| f.write File.read(src) }
135        File.chmod File.stat(src).mode, dest        File.chmod File.stat(src).mode, dest
136        File.unlink src        File.unlink src
137      end      end
138    end    end
139    
140    def install( from, dest, mode, prefix = nil )    def install(from, dest, mode, prefix = nil)
141      $stderr.puts "install #{from} #{dest}" if verbose?      $stderr.puts "install #{from} #{dest}" if verbose?
142      return if no_harm?      return if no_harm?
143    
144      realdest = prefix + dest if prefix      realdest = prefix + dest if prefix
145      realdest += '/' + File.basename(from) if dir?(realdest)      realdest += '/' + File.basename(from) if File.dir?(realdest)
146      str = read_file(from)      str = File.read(from)
147      if diff?(str, realdest)      if diff?(str, realdest)
148        verbose_off {        verbose_off {
149          rm_f realdest if File.exist?(realdest)          rm_f realdest if File.exist?(realdest)
# Line 137  module FileOperations Line 151  module FileOperations
151        File.open(realdest, 'wb') {|f| f.write str }        File.open(realdest, 'wb') {|f| f.write str }
152        File.chmod mode, realdest        File.chmod mode, realdest
153    
154        File.open("#{objdir_root()}/InstalledFiles", 'a') {|f| f.puts realdest }        File.open("#{objdir_root()}/InstalledFiles", 'a') {|f| f.puts dest }
155      end      end
156    end    end
157    
158    def diff?( orig, targ )    def diff?(orig, targ)
159      return true unless File.exist?(targ)      return true unless File.exist?(targ)
160      orig != read_file(targ)      orig != File.read(targ)
161    end    end
162    
163    def command( str )    def command(str)
164      $stderr.puts str if verbose?      $stderr.puts str if verbose?
165      system str or raise RuntimeError, "'system #{str}' failed"      system str or raise RuntimeError, "'system #{str}' failed"
166    end    end
167    
168    def ruby( str )    def ruby(str)
169      command config('ruby-prog') + ' ' + str      command config('ruby-prog') + ' ' + str
170    end    end
171        
172    def make( task = '' )    def make(task = '')
173      command config('make-prog') + ' ' + task      command config('make-prog') + ' ' + task
174    end    end
175    
176    def extdir?( dir )    def extdir?(dir)
177      File.exist?(dir + '/MANIFEST')      File.exist?(dir + '/MANIFEST')
178    end    end
179    
180    def dir?( path )    def all_files_in(dirname)
     # for corrupted windows stat()  
     FileTest.directory?((path[-1,1] == '/') ? path : path + '/')  
   end  
   
   def all_files_in( dirname )  
181      Dir.open(dirname) {|d|      Dir.open(dirname) {|d|
182        return d.select {|ent| FileTest.file?("#{dirname}/#{ent}") }        return d.select {|ent| File.file?("#{dirname}/#{ent}") }
183      }      }
184    end    end
185    
# Line 178  module FileOperations Line 187  module FileOperations
187      CVS SCCS RCS CVS.adm      CVS SCCS RCS CVS.adm
188    )    )
189    
190    def all_dirs_in( dirname )    def all_dirs_in(dirname)
191      Dir.open(dirname) {|d|      Dir.open(dirname) {|d|
192        return d.select {|n| dir?("#{dirname}/#{n}") } - %w(. ..) - REJECT_DIRS        return d.select {|n| File.dir?("#{dirname}/#{n}") } - %w(. ..) - REJECT_DIRS
193      }      }
194    end    end
195    
196    def read_file( fname )  end
197      File.open(fname, 'rb') {|f| return f.read }  
198    
199    class File
200    
201      def File.dir?(path)
202        # for corrupted windows stat()
203        File.directory?((path[-1,1] == '/') ? path : path + '/')
204    end    end
205    
206  end  end
# Line 193  end Line 208  end
208  # config.rb  # config.rb
209  #  #
210    
211  if i = ARGV.index(/\A--rbconfig=/)  if idx = ARGV.index(/\A--rbconfig=/)
212    file = $'    require ARGV.delete_at(idx).split(/=/, 2)[1]
   ARGV.delete_at(i)  
   require file  
213  else  else
214    require 'rbconfig'    require 'rbconfig'
215  end  end
216    
   
217  class ConfigTable  class ConfigTable
218    
219    c = ::Config::CONFIG    c = ::Config::CONFIG
# Line 219  class ConfigTable Line 231  class ConfigTable
231                  ((minor >= 5) or                  ((minor >= 5) or
232                   ((minor == 4) and (teeny >= 4)))))                   ((minor == 4) and (teeny >= 4)))))
233        
   re = Regexp.new('\A' + Regexp.quote(c['prefix']))  
234    subprefix = lambda {|path|    subprefix = lambda {|path|
235        re === path and path.sub(re, '$prefix')      path.sub(/\A#{Regexp.quote(c['prefix'])}/o, '$prefix')
236    }    }
237    
238    if c['rubylibdir']    if c['rubylibdir']
# Line 300  class ConfigTable Line 311  class ConfigTable
311    
312    SAVE_FILE = 'config.save'    SAVE_FILE = 'config.save'
313    
314    def ConfigTable.each_name( &block )    def ConfigTable.each_name(&block)
315      keys().each(&block)      keys().each(&block)
316    end    end
317    
# Line 308  class ConfigTable Line 319  class ConfigTable
319      DESCRIPTER.map {|name, *dummy| name }      DESCRIPTER.map {|name, *dummy| name }
320    end    end
321    
322    def ConfigTable.each_definition( &block )    def ConfigTable.each_definition(&block)
323      DESCRIPTER.each(&block)      DESCRIPTER.each(&block)
324    end    end
325    
326    def ConfigTable.get_entry( name )    def ConfigTable.get_entry(name)
327      name, ent = DESCRIPTER.assoc(name)      name, ent = DESCRIPTER.assoc(name)
328      ent      ent
329    end    end
330    
331    def ConfigTable.get_entry!( name )    def ConfigTable.get_entry!(name)
332      get_entry(name) or raise ArgumentError, "no such config: #{name}"      get_entry(name) or raise ArgumentError, "no such config: #{name}"
333    end    end
334    
335    def ConfigTable.add_entry( name, vals )    def ConfigTable.add_entry(name, vals)
336      ConfigTable::DESCRIPTER.push [name,vals]      ConfigTable::DESCRIPTER.push [name,vals]
337    end    end
338    
339    def ConfigTable.remove_entry( name )    def ConfigTable.remove_entry(name)
340      get_entry(name) or raise ArgumentError, "no such config: #{name}"      get_entry(name) or raise ArgumentError, "no such config: #{name}"
341      DESCRIPTER.delete_if {|n, arr| n == name }      DESCRIPTER.delete_if {|n, arr| n == name }
342    end    end
343    
344    def ConfigTable.config_key?( name )    def ConfigTable.config_key?(name)
345      get_entry(name) ? true : false      get_entry(name) ? true : false
346    end    end
347    
348    def ConfigTable.bool_config?( name )    def ConfigTable.bool_config?(name)
349      ent = get_entry(name) or return false      ent = get_entry(name) or return false
350      ent[1] == 'yes/no'      ent[1] == 'yes/no'
351    end    end
352    
353    def ConfigTable.value_config?( name )    def ConfigTable.value_config?(name)
354      ent = get_entry(name) or return false      ent = get_entry(name) or return false
355      ent[1] != 'yes/no'      ent[1] != 'yes/no'
356    end    end
357    
358    def ConfigTable.path_config?( name )    def ConfigTable.path_config?(name)
359      ent = get_entry(name) or return false      ent = get_entry(name) or return false
360      ent[1] == 'path'      ent[1] == 'path'
361    end    end
# Line 375  class ConfigTable Line 386  class ConfigTable
386    
387    def initialize_from_file    def initialize_from_file
388      raise InstallError, "#{File.basename $0} config first"\      raise InstallError, "#{File.basename $0} config first"\
389                                      unless FileTest.file?(SAVE_FILE)          unless File.file?(SAVE_FILE)
390      @table = {}      @table = {}
391      File.foreach(SAVE_FILE) do |line|      File.foreach(SAVE_FILE) do |line|
392        k, v = line.split(/=/, 2)        k, v = line.split(/=/, 2)
# Line 385  class ConfigTable Line 396  class ConfigTable
396    
397    def save    def save
398      File.open(SAVE_FILE, 'w') {|f|      File.open(SAVE_FILE, 'w') {|f|
399          @table.each do |k, v|        @table.each do |k, v|
400            f.printf "%s=%s\n", k, v if v          f.printf "%s=%s\n", k, v if v
401          end        end
402      }      }
403    end    end
404    
405    def []=( k, v )    def []=(k, v)
406      raise InstallError, "unknown config option #{k}"\      raise InstallError, "unknown config option #{k}"\
407              unless ConfigTable.config_key?(k)          unless ConfigTable.config_key?(k)
408      if ConfigTable.path_config?(k)      @table[k] = v
       @table[k] = ((v[0,1] != '$') ? File.expand_path(v) : v)  
     else  
       @table[k] = v  
     end  
409    end    end
410            
411    def []( key )    def [](key)
412      return nil unless @table[key]      return nil unless @table[key]
413      @table[key].gsub(%r<\$([^/]+)>) { self[$1] }      @table[key].gsub(%r<\$([^/]+)>) { self[$1] }
414    end    end
415    
416    def set_raw( key, val )    def set_raw(key, val)
417      @table[key] = val      @table[key] = val
418    end    end
419    
420    def get_raw( key )    def get_raw(key)
421      @table[key]      @table[key]
422    end    end
423    
# Line 419  end Line 426  end
426    
427  module MetaConfigAPI  module MetaConfigAPI
428    
429    def eval_file_ifexist( fname )    def eval_file_ifexist(fname)
430      instance_eval read_file(fname), fname, 1 if FileTest.file?(fname)      instance_eval File.read(fname), fname, 1 if File.file?(fname)
431    end    end
432    
433    def config_names    def config_names
434      ConfigTable.keys      ConfigTable.keys
435    end    end
436    
437    def config?( name )    def config?(name)
438      ConfigTable.config_key?(name)      ConfigTable.config_key?(name)
439    end    end
440    
441    def bool_config?( name )    def bool_config?(name)
442      ConfigTable.bool_config?(name)      ConfigTable.bool_config?(name)
443    end    end
444    
445    def value_config?( name )    def value_config?(name)
446      ConfigTable.value_config?(name)      ConfigTable.value_config?(name)
447    end    end
448    
449    def path_config?( name )    def path_config?(name)
450      ConfigTable.path_config?(name)      ConfigTable.path_config?(name)
451    end    end
452    
453    def add_config( name, argname, default, desc )    def add_config(name, argname, default, desc)
454      ConfigTable.add_entry name,[default,argname,desc]      ConfigTable.add_entry name,[default,argname,desc]
455    end    end
456    
457    def add_path_config( name, default, desc )    def add_path_config(name, default, desc)
458      add_config name, 'path', default, desc      add_config name, 'path', default, desc
459    end    end
460    
461    def add_bool_config( name, default, desc )    def add_bool_config(name, default, desc)
462      add_config name, 'yes/no', default ? 'yes' : 'no', desc      add_config name, 'yes/no', default ? 'yes' : 'no', desc
463    end    end
464    
465    def set_config_default( name, default )    def set_config_default(name, default)
466      if bool_config?(name)      if bool_config?(name)
467        ConfigTable.get_entry!(name)[0] = (default ? 'yes' : 'no')        ConfigTable.get_entry!(name)[0] = (default ? 'yes' : 'no')
468      else      else
# Line 463  module MetaConfigAPI Line 470  module MetaConfigAPI
470      end      end
471    end    end
472    
473    def remove_config( name )    def remove_config(name)
474      ent = ConfigTable.get_entry(name)      ent = ConfigTable.get_entry(name)
475      ConfigTable.remove_entry name      ConfigTable.remove_entry name
476      ent      ent
# Line 482  class InstallError < StandardError; end Line 489  class InstallError < StandardError; end
489    
490  module HookUtils  module HookUtils
491    
492    def run_hook( name )    def run_hook(name)
493      try_run_hook "#{curr_srcdir()}/#{name}" or      try_run_hook "#{curr_srcdir()}/#{name}" or
494      try_run_hook "#{curr_srcdir()}/#{name}.rb"      try_run_hook "#{curr_srcdir()}/#{name}.rb"
495    end    end
496    
497    def try_run_hook( fname )    def try_run_hook(fname)
498      return false unless FileTest.file?(fname)      return false unless File.file?(fname)
499      begin      begin
500        instance_eval read_file(fname), fname, 1        instance_eval File.read(fname), fname, 1
501      rescue      rescue
502        raise InstallError, "hook #{fname} failed:\n" + $!.message        raise InstallError, "hook #{fname} failed:\n" + $!.message
503      end      end
# Line 502  end Line 509  end
509    
510  module HookScriptAPI  module HookScriptAPI
511    
512    def get_config( key )    def get_config(key)
513      @config[key]      @config[key]
514    end    end
515    
516    alias config get_config    alias config get_config
517    
518    def set_config( key, val )    def set_config(key, val)
519      @config[key] = val      @config[key] = val
520    end    end
521    
# Line 528  module HookScriptAPI Line 535  module HookScriptAPI
535      "#{objdir_root()}/#{relpath()}"      "#{objdir_root()}/#{relpath()}"
536    end    end
537    
538    def srcfile( path )    def srcfile(path)
539      "#{curr_srcdir()}/#{path}"      "#{curr_srcdir()}/#{path}"
540    end    end
541    
542    def srcexist?( path )    def srcexist?(path)
543      FileTest.exist? srcfile(path)      File.exist?(srcfile(path))
544    end    end
545    
546    def srcdirectory?( path )    def srcdirectory?(path)
547      dir? srcfile(path)      File.dir?(srcfile(path))
548    end    end
549        
550    def srcfile?( path )    def srcfile?(path)
551      FileTest.file? srcfile(path)      File.file? srcfile(path)
552    end    end
553    
554    def srcentries( path = '.' )    def srcentries(path = '.')
555      Dir.open("#{curr_srcdir()}/#{path}") {|d|      Dir.open("#{curr_srcdir()}/#{path}") {|d|
556        return d.to_a - %w(. ..)        return d.to_a - %w(. ..)
557      }      }
558    end    end
559    
560    def srcfiles( path = '.' )    def srcfiles(path = '.')
561      srcentries(path).select {|fname|      srcentries(path).select {|fname|
562        FileTest.file?(File.join(curr_srcdir(), path, fname))        File.file?(File.join(curr_srcdir(), path, fname))
563      }      }
564    end    end
565    
566    def srcdirectories( path = '.' )    def srcdirectories(path = '.')
567      srcentries(path).select {|fname|      srcentries(path).select {|fname|
568        dir?(File.join(curr_srcdir(), path, fname))        File.dir?(File.join(curr_srcdir(), path, fname))
569      }      }
570    end    end
571    
# Line 573  class Installer Line 580  class Installer
580    include HookUtils    include HookUtils
581    include FileOperations    include FileOperations
582    
583    def initialize( config, opt, srcroot, objroot )    def initialize(config, opt, srcroot, objroot)
584      @config = config      @config = config
585      @options = opt      @options = opt
586      @srcdir = File.expand_path(srcroot)      @srcdir = File.expand_path(srcroot)
# Line 630  class Installer Line 637  class Installer
637      exec_task_traverse 'config'      exec_task_traverse 'config'
638    end    end
639    
640    def config_dir_bin( rel )    def config_dir_bin(rel)
641    end    end
642    
643    def config_dir_lib( rel )    def config_dir_lib(rel)
644    end    end
645    
646    def config_dir_ext( rel )    def config_dir_ext(rel)
647      extconf if extdir?(curr_srcdir())      extconf if extdir?(curr_srcdir())
648    end    end
649    
# Line 645  class Installer Line 652  class Installer
652      command "#{config('ruby-prog')} #{curr_srcdir()}/extconf.rb #{opt}"      command "#{config('ruby-prog')} #{curr_srcdir()}/extconf.rb #{opt}"
653    end    end
654    
655    def config_dir_data( rel )    def config_dir_data(rel)
656    end    end
657    
658    #    #
# Line 656  class Installer Line 663  class Installer
663      exec_task_traverse 'setup'      exec_task_traverse 'setup'
664    end    end
665    
666    def setup_dir_bin( rel )    def setup_dir_bin(rel)
667      all_files_in(curr_srcdir()).each do |fname|      all_files_in(curr_srcdir()).each do |fname|
668        adjust_shebang "#{curr_srcdir()}/#{fname}"        adjust_shebang "#{curr_srcdir()}/#{fname}"
669      end      end
# Line 668  class Installer Line 675  class Installer
675    # not modify: #!/usr/bin/env ruby    # not modify: #!/usr/bin/env ruby
676    SHEBANG_RE = /\A\#!\s*\S*ruby\S*/    SHEBANG_RE = /\A\#!\s*\S*ruby\S*/
677    
678    def adjust_shebang( path )    def adjust_shebang(path)
679      return if no_harm?      return if no_harm?
680    
681      tmpfile = File.basename(path) + '.tmp'      tmpfile = File.basename(path) + '.tmp'
682      begin      begin
683        File.open(path) {|r|        File.open(path, 'rb') {|r|
684          File.open(tmpfile, 'w') {|w|          File.open(tmpfile, 'wb') {|w|
685            first = r.gets            first = r.gets
686            return unless SHEBANG_RE === first            return unless SHEBANG_RE =~ first
687    
688            $stderr.puts "adjusting shebang: #{File.basename path}" if verbose?            $stderr.puts "adjusting shebang: #{File.basename path}" if verbose?
689            w.print first.sub(SHEBANG_RE, '#!' + config('ruby-path'))            w.print first.sub(SHEBANG_RE, '#!' + config('ruby-path'))
# Line 689  class Installer Line 696  class Installer
696      end      end
697    end    end
698    
699    def setup_dir_lib( rel )    def setup_dir_lib(rel)
700    end    end
701    
702    def setup_dir_ext( rel )    def setup_dir_ext(rel)
703      make if extdir?(curr_srcdir())      make if extdir?(curr_srcdir())
704    end    end
705    
706    def setup_dir_data( rel )    def setup_dir_data(rel)
707    end    end
708    
709    #    #
# Line 707  class Installer Line 714  class Installer
714      exec_task_traverse 'install'      exec_task_traverse 'install'
715    end    end
716    
717    def install_dir_bin( rel )    def install_dir_bin(rel)
718      install_files collect_filenames_auto(), config('bin-dir') + '/' + rel, 0755      install_files collect_filenames_auto(), config('bin-dir') + '/' + rel, 0755
719    end    end
720    
721    def install_dir_lib( rel )    def install_dir_lib(rel)
722      install_files ruby_scripts(), config('rb-dir') + '/' + rel, 0644      install_files ruby_scripts(), config('rb-dir') + '/' + rel, 0644
723    end    end
724    
725    def install_dir_ext( rel )    def install_dir_ext(rel)
726      return unless extdir?(curr_srcdir())      return unless extdir?(curr_srcdir())
727      install_files ruby_extentions('.'),      install_files ruby_extentions('.'),
728                    config('so-dir') + '/' + File.dirname(rel),                    config('so-dir') + '/' + File.dirname(rel),
729                    0555                    0555
730    end    end
731    
732    def install_dir_data( rel )    def install_dir_data(rel)
733      install_files collect_filenames_auto(), config('data-dir') + '/' + rel, 0644      install_files collect_filenames_auto(), config('data-dir') + '/' + rel, 0644
734    end    end
735    
736    def install_files( list, dest, mode )    def install_files(list, dest, mode)
737      mkdir_p dest, @options['install-prefix']      mkdir_p dest, @options['install-prefix']
738      list.each do |fname|      list.each do |fname|
739        install fname, dest, mode, @options['install-prefix']        install fname, dest, mode, @options['install-prefix']
# Line 734  class Installer Line 741  class Installer
741    end    end
742    
743    def ruby_scripts    def ruby_scripts
744      collect_filenames_auto().select {|n| /\.rb\z/ === n }      collect_filenames_auto().select {|n| /\.rb\z/ =~ n }
745    end    end
746        
747    # picked up many entries from cvs-1.11.1/src/ignore.c    # picked up many entries from cvs-1.11.1/src/ignore.c
748    reject_patterns = %w(    reject_patterns = %w(
749      core RCSLOG tags TAGS .make.state      core RCSLOG tags TAGS .make.state
750      .nse_depinfo #* .#* cvslog.* ,* .del-* *.a *.olb *.o *.obj      .nse_depinfo #* .#* cvslog.* ,* .del-* *.olb
751      *.so *.Z *~ *.old *.elc *.ln *.bak *.BAK *.orig *.rej *.exe _$* *$      *~ *.old *.bak *.BAK *.orig *.rej _$* *$
752    
753      *.org *.in .*      *.org *.in .*
754    )    )
755    maptab = {    mapping = {
756      '.' => '\\.',      '.' => '\.',
757      '$' => '\\$',      '$' => '\$',
758        '#' => '\#',
759      '*' => '.*'      '*' => '.*'
760    }    }
761    REJECT_PATTERNS = Regexp.new('\A(?:' +    REJECT_PATTERNS = Regexp.new('\A(?:' +
762                                 reject_patterns.map {|pat|                                 reject_patterns.map {|pat|
763                                   pat.gsub(/[\.\$\*]/) {|s| maptab[s] }                                   pat.gsub(/[\.\$\#\*]/) {|ch| mapping[ch] }
764                                 }.join('|') +                                 }.join('|') +
765                                 ')\z')                                 ')\z')
766    
767    def collect_filenames_auto    def collect_filenames_auto
768      mapdir((existfiles() - hookfiles()).reject {|fname|      mapdir((existfiles() - hookfiles()).reject {|fname|
769               REJECT_PATTERNS === fname               REJECT_PATTERNS =~ fname
770             })             })
771    end    end
772    
# Line 772  class Installer Line 780  class Installer
780      }.flatten      }.flatten
781    end    end
782    
783    def mapdir( filelist )    def mapdir(filelist)
784      filelist.map {|fname|      filelist.map {|fname|
785        if File.exist?(fname)   # objdir        if File.exist?(fname)   # objdir
786          fname          fname
# Line 782  class Installer Line 790  class Installer
790      }      }
791    end    end
792    
793    def ruby_extentions( dir )    def ruby_extentions(dir)
794      _ruby_extentions(dir) or      _ruby_extentions(dir) or
795          raise InstallError, "no ruby extention exists: 'ruby #{$0} setup' first"          raise InstallError, "no ruby extention exists: 'ruby #{$0} setup' first"
796    end    end
797    
798    DLEXT = /\.#{ ::Config::CONFIG['DLEXT'] }\z/    DLEXT = /\.#{ ::Config::CONFIG['DLEXT'] }\z/
799    
800    def _ruby_extentions( dir )    def _ruby_extentions(dir)
801      Dir.open(dir) {|d|      Dir.open(dir) {|d|
802        return d.select {|fname| DLEXT === fname }        return d.select {|fname| DLEXT =~ fname }
803      }      }
804    end    end
805    
# Line 805  class Installer Line 813  class Installer
813      rm_f 'InstalledFiles'      rm_f 'InstalledFiles'
814    end    end
815    
816    def clean_dir_bin( rel )    def clean_dir_bin(rel)
817    end    end
818    
819    def clean_dir_lib( rel )    def clean_dir_lib(rel)
820    end    end
821    
822    def clean_dir_ext( rel )    def clean_dir_ext(rel)
823      return unless extdir?(curr_srcdir())      return unless extdir?(curr_srcdir())
824      make 'clean' if FileTest.file?('Makefile')      make 'clean' if File.file?('Makefile')
825    end    end
826    
827    def clean_dir_data( rel )    def clean_dir_data(rel)
828    end    end
829    
830    #    #
# Line 829  class Installer Line 837  class Installer
837      rm_f 'InstalledFiles'      rm_f 'InstalledFiles'
838    end    end
839    
840    def distclean_dir_bin( rel )    def distclean_dir_bin(rel)
841    end    end
842    
843    def distclean_dir_lib( rel )    def distclean_dir_lib(rel)
844    end    end
845    
846    def distclean_dir_ext( rel )    def distclean_dir_ext(rel)
847      return unless extdir?(curr_srcdir())      return unless extdir?(curr_srcdir())
848      make 'distclean' if FileTest.file?('Makefile')      make 'distclean' if File.file?('Makefile')
849    end    end
850    
851    #    #
852    # lib    # lib
853    #    #
854    
855    def exec_task_traverse( task )    def exec_task_traverse(task)
856      run_hook 'pre-' + task      run_hook "pre-#{task}"
857      FILETYPES.each do |type|      FILETYPES.each do |type|
858        if config('without-ext') == 'yes' and type == 'ext'        if config('without-ext') == 'yes' and type == 'ext'
859          $stderr.puts 'skipping ext/* by user option' if verbose?          $stderr.puts 'skipping ext/* by user option' if verbose?
860          next          next
861        end        end
862        traverse task, type, task + '_dir_' + type        traverse task, type, "#{task}_dir_#{type}"
863      end      end
864      run_hook 'post-' + task      run_hook "post-#{task}"
865    end    end
866    
867    def traverse( task, rel, mid )    def traverse(task, rel, mid)
868      dive_into(rel) {      dive_into(rel) {
869        run_hook 'pre-' + task        run_hook "pre-#{task}"
870        __send__ mid, rel.sub(%r[\A.*?(?:/|\z)], '')        __send__ mid, rel.sub(%r[\A.*?(?:/|\z)], '')
871        all_dirs_in(curr_srcdir()).each do |d|        all_dirs_in(curr_srcdir()).each do |d|
872          traverse task, rel + '/' + d, mid          traverse task, "#{rel}/#{d}", mid
873        end        end
874        run_hook 'post-' + task        run_hook "post-#{task}"
875      }      }
876    end    end
877    
878    def dive_into( rel )    def dive_into(rel)
879      return unless dir?("#{@srcdir}/#{rel}")      return unless File.dir?("#{@srcdir}/#{rel}")
880    
881      dir = File.basename(rel)      dir = File.basename(rel)
882      Dir.mkdir dir unless dir?(dir)      Dir.mkdir dir unless File.dir?(dir)
883      prevdir = Dir.pwd      prevdir = Dir.pwd
884      Dir.chdir dir      Dir.chdir dir
885      $stderr.puts '---> ' + rel if verbose?      $stderr.puts '---> ' + rel if verbose?
# Line 889  end Line 897  end
897    
898  class ToplevelInstaller  class ToplevelInstaller
899    
900    Version   = '3.2.1'    Version   = '3.2.2'
901    Copyright = 'Copyright (c) 2000-2003 Minero Aoki'    Copyright = 'Copyright (c) 2000-2003 Minero Aoki'
902    
903    TASKS = [    TASKS = [
# Line 914  class ToplevelInstaller Line 922  class ToplevelInstaller
922    
923    include MetaConfigAPI    include MetaConfigAPI
924    
925    def initialize( ardir_root )    def initialize(ardir_root)
926      @config = nil      @config = nil
927      @options = { 'verbose' => true }      @options = { 'verbose' => true }
928      @ardir = File.expand_path(ardir_root)      @ardir = File.expand_path(ardir_root)
# Line 937  class ToplevelInstaller Line 945  class ToplevelInstaller
945      eval_file_ifexist "#{@ardir}/metaconfig"      eval_file_ifexist "#{@ardir}/metaconfig"
946    end    end
947    
948    def load_config( task )    def load_config(task)
949      case task      case task
950      when 'config'      when 'config'
951        ConfigTable.new        ConfigTable.new
# Line 981  class ToplevelInstaller Line 989  class ToplevelInstaller
989      while arg = ARGV.shift      while arg = ARGV.shift
990        case arg        case arg
991        when /\A\w+\z/        when /\A\w+\z/
992          raise InstallError, "invalid task: #{arg}" unless valid_task === arg          raise InstallError, "invalid task: #{arg}" unless valid_task =~ arg
993          return arg          return arg
994    
995        when '-q', '--quiet'        when '-q', '--quiet'
# Line 1032  EOS Line 1040  EOS
1040      @options['config-opt'] = []      @options['config-opt'] = []
1041    
1042      while i = ARGV.shift      while i = ARGV.shift
1043        if /\A--?\z/ === i        if /\A--?\z/ =~ i
1044          @options['config-opt'] = ARGV.dup          @options['config-opt'] = ARGV.dup
1045          break          break
1046        end        end
# Line 1041  EOS Line 1049  EOS
1049        if value        if value
1050          if ConfigTable.bool_config?(name)          if ConfigTable.bool_config?(name)
1051            raise InstallError, "config: --#{name} allows only yes/no for argument"\            raise InstallError, "config: --#{name} allows only yes/no for argument"\
1052                unless /\A(y(es)?|n(o)?|t(rue)?|f(alse))\z/i === value                unless /\A(y(es)?|n(o)?|t(rue)?|f(alse))\z/i =~ value
1053            value = (/\Ay(es)?|\At(rue)/i === value) ? 'yes' : 'no'            value = (/\Ay(es)?|\At(rue)/i =~ value) ? 'yes' : 'no'
1054          end          end
1055        else        else
1056          raise InstallError, "config: --#{name} requires argument"\          raise InstallError, "config: --#{name} requires argument"\
# Line 1070  EOS Line 1078  EOS
1078      end      end
1079    end    end
1080    
1081    def print_usage( out )    def print_usage(out)
1082      out.puts 'Typical Installation Procedure:'      out.puts 'Typical Installation Procedure:'
1083      out.puts "  $ ruby #{File.basename $0} config"      out.puts "  $ ruby #{File.basename $0} config"
1084      out.puts "  $ ruby #{File.basename $0} setup"      out.puts "  $ ruby #{File.basename $0} setup"
# Line 1121  EOS Line 1129  EOS
1129    #    #
1130    
1131    def exec_config    def exec_config
     @config.save  
1132      @installer.exec_config      @installer.exec_config
1133        @config.save   # must be final
1134    end    end
1135    
1136    def exec_setup    def exec_setup
# Line 1160  class ToplevelInstallerMulti < ToplevelI Line 1168  class ToplevelInstallerMulti < ToplevelI
1168    include HookScriptAPI    include HookScriptAPI
1169    include FileOperations    include FileOperations
1170    
1171    def initialize( ardir )    def initialize(ardir)
1172      super      super
1173      @packages = all_dirs_in("#{@ardir}/packages")      @packages = all_dirs_in("#{@ardir}/packages")
1174      raise 'no package exists' if @packages.empty?      raise 'no package exists' if @packages.empty?
# Line 1189  class ToplevelInstallerMulti < ToplevelI Line 1197  class ToplevelInstallerMulti < ToplevelI
1197                  }                  }
1198    end    end
1199    
1200    def extract_selection( list )    def extract_selection(list)
1201      a = list.split(/,/)      a = list.split(/,/)
1202      a.each do |name|      a.each do |name|
1203        raise InstallError, "no such package: #{name}" \        raise InstallError, "no such package: #{name}" \
# Line 1198  class ToplevelInstallerMulti < ToplevelI Line 1206  class ToplevelInstallerMulti < ToplevelI
1206      a      a
1207    end    end
1208    
1209    def print_usage( f )    def print_usage(f)
1210      super      super
1211      f.puts 'Inluded packages:'      f.puts 'Inluded packages:'
1212      f.puts '  ' + @packages.sort.join(' ')      f.puts '  ' + @packages.sort.join(' ')
# Line 1211  class ToplevelInstallerMulti < ToplevelI Line 1219  class ToplevelInstallerMulti < ToplevelI
1219    
1220    attr_reader :packages    attr_reader :packages
1221    
1222    def declare_packages( list )    def declare_packages(list)
1223      raise 'package list is empty' if list.empty?      raise 'package list is empty' if list.empty?
1224      list.each do |name|      list.each do |name|
1225        raise "directory packages/#{name} does not exist"\        raise "directory packages/#{name} does not exist"\
1226                unless dir?("#{@ardir}/packages/#{name}")                unless File.dir?("#{@ardir}/packages/#{name}")
1227      end      end
1228      @packages = list      @packages = list
1229    end    end
# Line 1226  class ToplevelInstallerMulti < ToplevelI Line 1234  class ToplevelInstallerMulti < ToplevelI
1234    
1235    def exec_config    def exec_config
1236      run_hook 'pre-config'      run_hook 'pre-config'
     @config.save  
1237      each_selected_installers {|inst| inst.exec_config }      each_selected_installers {|inst| inst.exec_config }
1238      run_hook 'post-config'      run_hook 'post-config'
1239        @config.save   # must be final
1240    end    end
1241    
1242    def exec_setup    def exec_setup
# Line 1262  class ToplevelInstallerMulti < ToplevelI Line 1270  class ToplevelInstallerMulti < ToplevelI
1270    #    #
1271    
1272    def each_selected_installers    def each_selected_installers
1273      Dir.mkdir 'packages' unless dir?('packages')      Dir.mkdir 'packages' unless File.dir?('packages')
1274      @selected.each do |pack|      @selected.each do |pack|
1275        $stderr.puts "Processing the package `#{pack}' ..." if @options['verbose']        $stderr.puts "Processing the package `#{pack}' ..." if @options['verbose']
1276        Dir.mkdir "packages/#{pack}" unless dir?("packages/#{pack}")        Dir.mkdir "packages/#{pack}" unless File.dir?("packages/#{pack}")
1277        Dir.chdir "packages/#{pack}"        Dir.chdir "packages/#{pack}"
1278        yield @installers[pack]        yield @installers[pack]
1279        Dir.chdir '../..'        Dir.chdir '../..'

Legend:
Removed from v.1.1  
changed lines
  Added in v.1.2

Back to OSDN">Back to OSDN
ViewVC Help
Powered by ViewVC 1.1.26