• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#
2# This file is automatically generated. DO NOT MODIFY!
3#
4# install.rb
5#
6#   Copyright (c) 2000-2002 Minero Aoki <aamine@loveruby.net>
7#
8#   This program is free software.
9#   You can distribute/modify this program under the terms of
10#   the GNU Lesser General Public License version 2.
11#
12
13### begin compat.rb
14
15unless Enumerable.instance_methods.include? 'inject' then
16module Enumerable
17  def inject( result )
18    each do |i|
19      result = yield(result, i)
20    end
21    result
22  end
23end
24end
25
26def File.read_all( fname )
27  File.open(fname, 'rb') {|f| return f.read }
28end
29
30def File.write( fname, str )
31  File.open(fname, 'wb') {|f| f.write str }
32end
33
34### end compat.rb
35### begin config.rb
36
37if i = ARGV.index(/\A--rbconfig=/) then
38  file = $'
39  ARGV.delete_at(i)
40  require file
41else
42  require 'rbconfig'
43end
44
45
46class ConfigTable
47
48  c = ::Config::CONFIG
49
50  rubypath = c['bindir'] + '/' + c['ruby_install_name']
51
52  major = c['MAJOR'].to_i
53  minor = c['MINOR'].to_i
54  teeny = c['TEENY'].to_i
55  version = "#{major}.#{minor}"
56
57  # ruby ver. >= 1.4.4?
58  newpath_p = ((major >= 2) or
59               ((major == 1) and
60                ((minor >= 5) or
61                 ((minor == 4) and (teeny >= 4)))))
62
63  re = Regexp.new('\A' + Regexp.quote(c['prefix']))
64  subprefix = lambda {|path|
65      re === path and path.sub(re, '$prefix')
66  }
67
68  if c['rubylibdir'] then
69    # 1.6.3 < V
70    stdruby    = subprefix.call(c['rubylibdir'])
71    siteruby   = subprefix.call(c['sitedir'])
72    versite    = subprefix.call(c['sitelibdir'])
73    sodir      = subprefix.call(c['sitearchdir'])
74  elsif newpath_p then
75    # 1.4.4 <= V <= 1.6.3
76    stdruby    = "$prefix/lib/ruby/#{version}"
77    siteruby   = subprefix.call(c['sitedir'])
78    versite    = siteruby + '/' + version
79    sodir      = "$site-ruby/#{c['arch']}"
80  else
81    # V < 1.4.4
82    stdruby    = "$prefix/lib/ruby/#{version}"
83    siteruby   = "$prefix/lib/ruby/#{version}/site_ruby"
84    versite    = siteruby
85    sodir      = "$site-ruby/#{c['arch']}"
86  end
87
88  DESCRIPTER = [
89    [ 'prefix',    [ c['prefix'],
90                     'path',
91                     'path prefix of target environment' ] ],
92    [ 'std-ruby',  [ stdruby,
93                     'path',
94                     'the directory for standard ruby libraries' ] ],
95    [ 'site-ruby-common', [ siteruby,
96                     'path',
97                     'the directory for version-independent non-standard ruby libraries' ] ],
98    [ 'site-ruby', [ versite,
99                     'path',
100                     'the directory for non-standard ruby libraries' ] ],
101    [ 'bin-dir',   [ '$prefix/bin',
102                     'path',
103                     'the directory for commands' ] ],
104    [ 'rb-dir',    [ '$site-ruby',
105                     'path',
106                     'the directory for ruby scripts' ] ],
107    [ 'so-dir',    [ sodir,
108                     'path',
109                     'the directory for ruby extentions' ] ],
110    [ 'data-dir',  [ '$prefix/share',
111                     'path',
112                     'the directory for shared data' ] ],
113    [ 'ruby-path', [ rubypath,
114                     'path',
115                     'path to set to #! line' ] ],
116    [ 'ruby-prog', [ rubypath,
117                     'name',
118                     'the ruby program using for installation' ] ],
119    [ 'make-prog', [ 'make',
120                     'name',
121                     'the make program to compile ruby extentions' ] ],
122    [ 'without-ext', [ 'no',
123                       'yes/no',
124                       'does not compile/install ruby extentions' ] ]
125  ]
126
127  SAVE_FILE = 'config.save'
128
129  def ConfigTable.each_name( &block )
130    keys().each( &block )
131  end
132
133  def ConfigTable.keys
134    DESCRIPTER.collect {|k,*dummy| k }
135  end
136
137  def ConfigTable.each_definition( &block )
138    DESCRIPTER.each( &block )
139  end
140
141  def ConfigTable.get_entry( name )
142    name, ent = DESCRIPTER.assoc(name)
143    ent
144  end
145
146  def ConfigTable.get_entry!( name )
147    get_entry(name) or raise ArgumentError, "no such config: #{name}"
148  end
149
150  def ConfigTable.add_entry( name, vals )
151    ConfigTable::DESCRIPTER.push [name,vals]
152  end
153
154  def ConfigTable.remove_entry( name )
155    get_entry name or raise ArgumentError, "no such config: #{name}"
156    DESCRIPTER.delete_if {|n,arr| n == name }
157  end
158
159  def ConfigTable.config_key?( name )
160    get_entry(name) ? true : false
161  end
162
163  def ConfigTable.bool_config?( name )
164    ent = get_entry(name) or return false
165    ent[1] == 'yes/no'
166  end
167
168  def ConfigTable.value_config?( name )
169    ent = get_entry(name) or return false
170    ent[1] != 'yes/no'
171  end
172
173  def ConfigTable.path_config?( name )
174    ent = get_entry(name) or return false
175    ent[1] == 'path'
176  end
177
178
179  class << self
180
181    alias newobj new
182
183    def new
184      c = newobj()
185      c.__send__ :init
186      c
187    end
188
189    def load
190      c = newobj()
191      File.file? SAVE_FILE or
192              raise InstallError, "#{File.basename $0} config first"
193      File.foreach( SAVE_FILE ) do |line|
194        k, v = line.split( '=', 2 )
195        c.instance_eval {
196            @table[k] = v.strip
197        }
198      end
199      c
200    end
201
202  end
203
204  def initialize
205    @table = {}
206  end
207
208  def init
209    DESCRIPTER.each do |k, (default, vname, desc, default2)|
210      @table[k] = default
211    end
212  end
213  private :init
214
215  def save
216    File.open( SAVE_FILE, 'w' ) {|f|
217        @table.each do |k, v|
218          f.printf "%s=%s\n", k, v if v
219        end
220    }
221  end
222
223  def []=( k, v )
224    ConfigTable.config_key? k or raise InstallError, "unknown config option #{k}"
225    if ConfigTable.path_config? k then
226      @table[k] = (v[0,1] != '$') ? File.expand_path(v) : v
227    else
228      @table[k] = v
229    end
230  end
231
232  def []( key )
233    @table[key] or return nil
234    @table[key].gsub( %r<\$([^/]+)> ) { self[$1] }
235  end
236
237  def set_raw( key, val )
238    @table[key] = val
239  end
240
241  def get_raw( key )
242    @table[key]
243  end
244
245end
246
247
248class MetaConfigEnvironment
249
250  def self.eval_file( file )
251    return unless File.file? file
252    new.instance_eval File.read_all(file), file, 1
253  end
254
255  private
256
257  def config_names
258    ConfigTable.keys
259  end
260
261  def config?( name )
262    ConfigTable.config_key? name
263  end
264
265  def bool_config?( name )
266    ConfigTable.bool_config? name
267  end
268
269  def value_config?( name )
270    ConfigTable.value_config? name
271  end
272
273  def path_config?( name )
274    ConfigTable.path_config? name
275  end
276
277  def add_config( name, argname, default, desc )
278    ConfigTable.add_entry name,[default,argname,desc]
279  end
280
281  def add_path_config( name, default, desc )
282    add_config name, 'path', default, desc
283  end
284
285  def add_bool_config( name, default, desc )
286    add_config name, 'yes/no', default ? 'yes' : 'no', desc
287  end
288
289  def set_config_default( name, default )
290    if bool_config? name then
291      ConfigTable.get_entry!(name)[0] = default ? 'yes' : 'no'
292    else
293      ConfigTable.get_entry!(name)[0] = default
294    end
295  end
296
297  def remove_config( name )
298    ent = ConfigTable.get_entry(name)
299    ConfigTable.remove_entry name
300    ent
301  end
302
303end
304
305### end config.rb
306### begin fileop.rb
307
308module FileOperations
309
310  def mkdir_p( dname, prefix = nil )
311    dname = prefix + dname if prefix
312    $stderr.puts "mkdir -p #{dname}" if verbose?
313    return if no_harm?
314
315    # does not check '/'... it's too abnormal case
316    dirs = dname.split(%r_(?=/)_)
317    if /\A[a-z]:\z/i === dirs[0] then
318      disk = dirs.shift
319      dirs[0] = disk + dirs[0]
320    end
321    dirs.each_index do |idx|
322      path = dirs[0..idx].join('')
323      Dir.mkdir path unless dir? path
324    end
325  end
326
327  def rm_f( fname )
328    $stderr.puts "rm -f #{fname}" if verbose?
329    return if no_harm?
330
331    if File.exist? fname or File.symlink? fname then
332      File.chmod 0777, fname
333      File.unlink fname
334    end
335  end
336
337  def rm_rf( dn )
338    $stderr.puts "rm -rf #{dn}" if verbose?
339    return if no_harm?
340
341    Dir.chdir dn
342    Dir.foreach('.') do |fn|
343      next if fn == '.'
344      next if fn == '..'
345      if dir? fn then
346        verbose_off {
347            rm_rf fn
348        }
349      else
350        verbose_off {
351            rm_f fn
352        }
353      end
354    end
355    Dir.chdir '..'
356    Dir.rmdir dn
357  end
358
359  def mv( src, dest )
360    rm_f dest
361    begin
362      File.link src, dest
363    rescue
364      File.write dest, File.read_all(src)
365      File.chmod File.stat(src).mode, dest
366    end
367    rm_f src
368  end
369
370  def install( from, dest, mode, prefix = nil )
371    $stderr.puts "install #{from} #{dest}" if verbose?
372    return if no_harm?
373
374    realdest = prefix + dest if prefix
375    if dir? realdest then
376      realdest += '/' + File.basename(from)
377    end
378    str = File.read_all(from)
379    if diff? str, realdest then
380      verbose_off {
381          rm_f realdest if File.exist? realdest
382      }
383      File.write realdest, str
384      File.chmod mode, realdest
385
386      File.open( objdir + '/InstalledFiles', 'a' ) {|f| f.puts realdest }
387    end
388  end
389
390  def diff?( orig, targ )
391    return true unless File.exist? targ
392    orig != File.read_all(targ)
393  end
394
395  def command( str )
396    $stderr.puts str if verbose?
397    system str or raise RuntimeError, "'system #{str}' failed"
398  end
399
400  def ruby( str )
401    command config('ruby-prog') + ' ' + str
402  end
403
404  def dir?( dname )
405    # for corrupted windows stat()
406    File.directory?( (dname[-1,1] == '/') ? dname : dname + '/' )
407  end
408
409  def all_files( dname )
410    Dir.open( dname ) {|d|
411        return d.find_all {|n| File.file? "#{dname}/#{n}" }
412    }
413  end
414
415  def all_dirs( dname )
416    Dir.open( dname ) {|d|
417        return d.find_all {|n| dir? "#{dname}/#{n}" } - %w(. ..)
418    }
419  end
420
421end
422
423### end fileop.rb
424### begin base.rb
425
426class InstallError < StandardError; end
427
428
429class Installer
430
431  Version   = '3.1.2'
432  Copyright = 'Copyright (c) 2000-2002 Minero Aoki'
433
434
435  @toplevel = nil
436
437  def self.declear_toplevel_installer( inst )
438    @toplevel and
439        raise ArgumentError, 'more than one toplevel installer decleared'
440    @toplevel = inst
441  end
442
443  def self.toplevel_installer
444    @toplevel
445  end
446
447
448  FILETYPES = %w( bin lib ext data )
449
450  include FileOperations
451
452  def initialize( config, opt, srcroot, objroot )
453    @config = config
454    @options = opt
455    @srcdir = File.expand_path(srcroot)
456    @objdir = File.expand_path(objroot)
457    @currdir = '.'
458  end
459
460  def inspect
461    "#<#{type} #{__id__}>"
462  end
463
464  #
465  # configs/options
466  #
467
468  def get_config( key )
469    @config[key]
470  end
471
472  alias config get_config
473
474  def set_config( key, val )
475    @config[key] = val
476  end
477
478  def no_harm?
479    @options['no-harm']
480  end
481
482  def verbose?
483    @options['verbose']
484  end
485
486  def verbose_off
487    save, @options['verbose'] = @options['verbose'], false
488    yield
489    @options['verbose'] = save
490  end
491
492  #
493  # srcdir/objdir
494  #
495
496  attr_reader :srcdir
497  alias srcdir_root srcdir
498  alias package_root srcdir
499
500  def curr_srcdir
501    "#{@srcdir}/#{@currdir}"
502  end
503
504  attr_reader :objdir
505  alias objdir_root objdir
506
507  def curr_objdir
508    "#{@objdir}/#{@currdir}"
509  end
510
511  def srcfile( path )
512    curr_srcdir + '/' + path
513  end
514
515  def srcexist?( path )
516    File.exist? srcfile(path)
517  end
518
519  def srcdirectory?( path )
520    dir? srcfile(path)
521  end
522
523  def srcfile?( path )
524    File.file? srcfile(path)
525  end
526
527  def srcentries( path = '.' )
528    Dir.open( curr_srcdir + '/' + path ) {|d|
529        return d.to_a - %w(. ..) - hookfilenames
530    }
531  end
532
533  def srcfiles( path = '.' )
534    srcentries(path).find_all {|fname|
535        File.file? File.join(curr_srcdir, path, fname)
536    }
537  end
538
539  def srcdirectories( path = '.' )
540    srcentries(path).find_all {|fname|
541        dir? File.join(curr_srcdir, path, fname)
542    }
543  end
544
545  def dive_into( rel )
546    return unless dir? "#{@srcdir}/#{rel}"
547
548    dir = File.basename(rel)
549    Dir.mkdir dir unless dir? dir
550    save = Dir.pwd
551    Dir.chdir dir
552    $stderr.puts '---> ' + rel if verbose?
553    @currdir = rel
554    yield
555    Dir.chdir save
556    $stderr.puts '<--- ' + rel if verbose?
557    @currdir = File.dirname(rel)
558  end
559
560  #
561  # config
562  #
563
564  def exec_config
565    exec_task_traverse 'config'
566  end
567
568  def config_dir_bin( rel )
569  end
570
571  def config_dir_lib( rel )
572  end
573
574  def config_dir_ext( rel )
575    extconf if extdir? curr_srcdir
576  end
577
578  def extconf
579    opt = @options['config-opt'].join(' ')
580    command "#{config('ruby-prog')} #{curr_srcdir}/extconf.rb #{opt}"
581  end
582
583  def config_dir_data( rel )
584  end
585
586  #
587  # setup
588  #
589
590  def exec_setup
591    exec_task_traverse 'setup'
592  end
593
594  def setup_dir_bin( relpath )
595    all_files( curr_srcdir ).each do |fname|
596      add_rubypath "#{curr_srcdir}/#{fname}"
597    end
598  end
599
600  SHEBANG_RE = /\A\#!\s*\S*ruby\S*/
601
602  def add_rubypath( path )
603    $stderr.puts %Q<set #! line to "\#!#{config('ruby-path')}" for #{path} ...> if verbose?
604    return if no_harm?
605
606    tmpfile = File.basename(path) + '.tmp'
607    begin
608      File.open( path ) {|r|
609      File.open( tmpfile, 'w' ) {|w|
610          first = r.gets
611          return unless SHEBANG_RE === first   # reject '/usr/bin/env ruby'
612
613          w.print first.sub( SHEBANG_RE, '#!' + config('ruby-path') )
614          w.write r.read
615      } }
616      mv tmpfile, File.basename(path)
617    ensure
618      rm_f tmpfile if File.exist? tmpfile
619    end
620  end
621
622  def setup_dir_lib( relpath )
623  end
624
625  def setup_dir_ext( relpath )
626    if extdir? curr_srcdir then
627      make
628    end
629  end
630
631  def make
632    command config('make-prog')
633  end
634
635  def setup_dir_data( relpath )
636  end
637
638  #
639  # install
640  #
641
642  def exec_install
643    exec_task_traverse 'install'
644  end
645
646  def install_dir_bin( rel )
647    install_files targfiles, config('bin-dir') + '/' + rel, 0755
648  end
649
650  def install_dir_lib( rel )
651    install_files targfiles, config('rb-dir') + '/' + rel, 0644
652  end
653
654  def install_dir_ext( rel )
655    if extdir? curr_srcdir then
656      install_dir_ext_main File.dirname(rel)
657    end
658  end
659
660  def install_dir_ext_main( rel )
661    install_files allext('.'), config('so-dir') + '/' + rel, 0555
662  end
663
664  def install_dir_data( rel )
665    install_files targfiles, config('data-dir') + '/' + rel, 0644
666  end
667
668  def install_files( list, dest, mode )
669    mkdir_p dest, @options['install-prefix']
670    list.each do |fname|
671      install fname, dest, mode, @options['install-prefix']
672    end
673  end
674
675  def targfiles
676    (targfilenames() - hookfilenames()).collect {|fname|
677        File.exist?(fname) ? fname : File.join(curr_srcdir(), fname)
678    }
679  end
680
681  def targfilenames
682    [ curr_srcdir(), '.' ].inject([]) {|ret, dir|
683        ret | all_files(dir)
684    }
685  end
686
687  def hookfilenames
688    %w( pre-%s post-%s pre-%s.rb post-%s.rb ).collect {|fmt|
689        %w( config setup install clean ).collect {|t| sprintf fmt, t }
690    }.flatten
691  end
692
693  def allext( dir )
694    _allext(dir) or raise InstallError,
695        "no extention exists: Have you done 'ruby #{$0} setup' ?"
696  end
697
698  DLEXT = /\.#{ ::Config::CONFIG['DLEXT'] }\z/
699
700  def _allext( dir )
701    Dir.open( dir ) {|d|
702        return d.find_all {|fname| DLEXT === fname }
703    }
704  end
705
706  #
707  # clean
708  #
709
710  def exec_clean
711    exec_task_traverse 'clean'
712    rm_f 'config.save'
713    rm_f 'InstalledFiles'
714  end
715
716  def clean_dir_bin( rel )
717  end
718
719  def clean_dir_lib( rel )
720  end
721
722  def clean_dir_ext( rel )
723    clean
724  end
725
726  def clean
727    command config('make-prog') + ' clean' if File.file? 'Makefile'
728  end
729
730  def clean_dir_data( rel )
731  end
732
733  #
734  # lib
735  #
736
737  def exec_task_traverse( task )
738    run_hook 'pre-' + task
739    FILETYPES.each do |type|
740      if config('without-ext') == 'yes' and type == 'ext' then
741        $stderr.puts 'skipping ext/* by user option' if verbose?
742        next
743      end
744      traverse task, type, task + '_dir_' + type
745    end
746    run_hook 'post-' + task
747  end
748
749  def traverse( task, rel, mid )
750    dive_into( rel ) {
751        run_hook 'pre-' + task
752        __send__ mid, rel.sub( %r_\A.*?(?:/|\z)_, '' )
753        all_dirs( curr_srcdir ).each do |d|
754          traverse task, rel + '/' + d, mid
755        end
756        run_hook 'post-' + task
757    }
758  end
759
760  def run_hook( name )
761    try_run_hook curr_srcdir + '/' + name           or
762    try_run_hook curr_srcdir + '/' + name + '.rb'
763  end
764
765  def try_run_hook( fname )
766    return false unless File.file? fname
767
768    env = self.dup
769    begin
770      env.instance_eval File.read_all(fname), fname, 1
771    rescue
772      raise InstallError, "hook #{fname} failed:\n" + $!.message
773    end
774    true
775  end
776
777  def extdir?( dir )
778    File.exist? dir + '/MANIFEST'
779  end
780
781end
782
783### end base.rb
784### begin toplevel.rb
785
786class ToplevelInstaller < Installer
787
788  TASKS = [
789    [ 'config',   'saves your configurations' ],
790    [ 'show',     'shows current configuration' ],
791    [ 'setup',    'compiles extention or else' ],
792    [ 'install',  'installs files' ],
793    [ 'clean',    "does `make clean' for each extention" ]
794  ]
795
796
797  def initialize( root )
798    super nil, {'verbose' => true}, root, '.'
799    Installer.declear_toplevel_installer self
800  end
801
802
803  def execute
804    run_metaconfigs
805
806    case task = parsearg_global()
807    when 'config'
808      @config = ConfigTable.new
809    else
810      @config = ConfigTable.load
811    end
812    parsearg_TASK task
813
814    exectask task
815  end
816
817
818  def run_metaconfigs
819    MetaConfigEnvironment.eval_file "#{srcdir_root}/#{metaconfig}"
820  end
821
822  def metaconfig
823    'metaconfig'
824  end
825
826
827  def exectask( task )
828    if task == 'show' then
829      exec_show
830    else
831      try task
832    end
833  end
834
835  def try( task )
836    $stderr.printf "#{File.basename $0}: entering %s phase...\n", task if verbose?
837    begin
838      __send__ 'exec_' + task
839    rescue
840      $stderr.printf "%s failed\n", task
841      raise
842    end
843    $stderr.printf "#{File.basename $0}: %s done.\n", task if verbose?
844  end
845
846  #
847  # processing arguments
848  #
849
850  def parsearg_global
851    task_re = /\A(?:#{TASKS.collect {|i| i[0] }.join '|'})\z/
852
853    while arg = ARGV.shift do
854      case arg
855      when /\A\w+\z/
856        task_re === arg or raise InstallError, "wrong task: #{arg}"
857        return arg
858
859      when '-q', '--quiet'
860        @options['verbose'] = false
861
862      when       '--verbose'
863        @options['verbose'] = true
864
865      when '-h', '--help'
866        print_usage $stdout
867        exit 0
868
869      when '-v', '--version'
870        puts "#{File.basename $0} version #{Version}"
871        exit 0
872
873      when '--copyright'
874        puts Copyright
875        exit 0
876
877      else
878        raise InstallError, "unknown global option '#{arg}'"
879      end
880    end
881
882    raise InstallError, 'no task or global option given'
883  end
884
885
886  def parsearg_TASK( task )
887    mid = "parsearg_#{task}"
888    if respond_to? mid, true then
889      __send__ mid
890    else
891      ARGV.empty? or
892          raise InstallError, "#{task}:  unknown options: #{ARGV.join ' '}"
893    end
894  end
895
896  def parsearg_config
897    re = /\A--(#{ConfigTable.keys.join '|'})(?:=(.*))?\z/
898    @options['config-opt'] = []
899
900    while i = ARGV.shift do
901      if /\A--?\z/ === i then
902        @options['config-opt'] = ARGV.dup
903        break
904      end
905      m = re.match(i) or raise InstallError, "config: unknown option #{i}"
906      name, value = m.to_a[1,2]
907      if value then
908        if ConfigTable.bool_config?(name) then
909          /\A(y(es)?|n(o)?|t(rue)?|f(alse))\z/i === value or raise InstallError, "config: --#{name} allows only yes/no for argument"
910          value = (/\Ay(es)?|\At(rue)/i === value) ? 'yes' : 'no'
911        end
912      else
913        ConfigTable.bool_config?(name) or raise InstallError, "config: --#{name} requires argument"
914        value = 'yes'
915      end
916      @config[name] = value
917    end
918  end
919
920  def parsearg_install
921    @options['no-harm'] = false
922    @options['install-prefix'] = ''
923    while a = ARGV.shift do
924      case a
925      when /\A--no-harm\z/
926        @options['no-harm'] = true
927      when /\A--prefix=(.*)\z/
928        path = $1
929        path = File.expand_path(path) unless path[0,1] == '/'
930        @options['install-prefix'] = path
931      else
932        raise InstallError, "install: unknown option #{a}"
933      end
934    end
935  end
936
937
938  def print_usage( out )
939    out.puts
940    out.puts 'Usage:'
941    out.puts "  ruby #{File.basename $0} <global option>"
942    out.puts "  ruby #{File.basename $0} [<global options>] <task> [<task options>]"
943
944    fmt = "  %-20s %s\n"
945    out.puts
946    out.puts 'Global options:'
947    out.printf fmt, '-q,--quiet',   'suppress message outputs'
948    out.printf fmt, '   --verbose', 'output messages verbosely'
949    out.printf fmt, '-h,--help',    'print this message'
950    out.printf fmt, '-v,--version', 'print version and quit'
951    out.printf fmt, '--copyright',  'print copyright and quit'
952
953    out.puts
954    out.puts 'Tasks:'
955    TASKS.each do |name, desc|
956      out.printf "  %-10s  %s\n", name, desc
957    end
958
959    out.puts
960    out.puts 'Options for config:'
961    ConfigTable.each_definition do |name, (default, arg, desc, default2)|
962      out.printf "  %-20s %s [%s]\n",
963                 '--'+ name + (ConfigTable.bool_config?(name) ? '' : '='+arg),
964                 desc,
965                 default2 || default
966    end
967    out.printf "  %-20s %s [%s]\n",
968        '--rbconfig=path', 'your rbconfig.rb to load', "running ruby's"
969
970    out.puts
971    out.puts 'Options for install:'
972    out.printf "  %-20s %s [%s]\n",
973        '--no-harm', 'only display what to do if given', 'off'
974
975    out.puts
976  end
977
978  #
979  # config
980  #
981
982  def exec_config
983    super
984    @config.save
985  end
986
987  #
988  # show
989  #
990
991  def exec_show
992    ConfigTable.each_name do |k|
993      v = @config.get_raw(k)
994      if not v or v.empty? then
995        v = '(not specified)'
996      end
997      printf "%-10s %s\n", k, v
998    end
999  end
1000
1001end
1002
1003### end toplevel.rb
1004
1005if $0 == __FILE__ then
1006  begin
1007    installer = ToplevelInstaller.new( File.dirname($0) )
1008    installer.execute
1009  rescue
1010    raise if $DEBUG
1011    $stderr.puts $!.message
1012    $stderr.puts "try 'ruby #{$0} --help' for usage"
1013    exit 1
1014  end
1015end
1016