Develop and Download Open Source Software

Browse CVS Repository

Annotation of /exerb/exerb/setup.rb

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


Revision 1.1 - (hide annotations) (download)
Thu Sep 18 04:29:08 2003 UTC (20 years, 6 months ago) by yuya
Branch: MAIN
CVS Tags: release300p9, release300p2, release300p3, release300p1, release300p6, release300p7, release300p4, release300p5, release300p8, release310, snapshot20031022, snapshot20031029, snapshot20031027, snapshot20031019, release320, release300, snapshot20031015, snapshot20031007, snapshot20031016
* install.rbをsetup.rb(3.2.1)に変更

1 yuya 1.1 #
2     # This file is automatically generated. DO NOT MODIFY!
3     #
4     # setup.rb
5     #
6     # Copyright (c) 2000-2003 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     def multipackage_install?
14     FileTest.directory?(File.dirname($0) + '/packages')
15     end
16    
17     #
18     # compat.rb
19     #
20    
21     module Enumerable
22     methods = instance_methods(true)
23    
24     unless methods.include?('map')
25     alias map collect
26     end
27    
28     unless methods.include?('select')
29     alias select find_all
30     end
31    
32     unless methods.include?('reject')
33     def reject
34     result = []
35     each do |i|
36     result.push i unless yield(i)
37     end
38     result
39     end
40     end
41    
42     unless methods.include?('inject')
43     def inject( result )
44     each do |i|
45     result = yield(result, i)
46     end
47     result
48     end
49     end
50    
51     unless methods.include?('any?')
52     def any?
53     each do |i|
54     return true if yield(i)
55     end
56     false
57     end
58     end
59     end
60     #
61     # fileop.rb
62     #
63    
64     module FileOperations
65    
66     def mkdir_p( dirname, prefix = nil )
67     dirname = prefix + dirname if prefix
68     $stderr.puts "mkdir -p #{dirname}" if verbose?
69     return if no_harm?
70    
71     # does not check '/'... it's too abnormal case
72     dirs = dirname.split(%r<(?=/)>)
73     if /\A[a-z]:\z/i === dirs[0]
74     disk = dirs.shift
75     dirs[0] = disk + dirs[0]
76     end
77     dirs.each_index do |idx|
78     path = dirs[0..idx].join('')
79     Dir.mkdir path unless dir?(path)
80     end
81     end
82    
83     def rm_f( fname )
84     $stderr.puts "rm -f #{fname}" if verbose?
85     return if no_harm?
86    
87     if FileTest.exist?(fname) or FileTest.symlink?(fname)
88     File.chmod 0777, fname
89     File.unlink fname
90     end
91     end
92    
93     def rm_rf( dn )
94     $stderr.puts "rm -rf #{dn}" if verbose?
95     return if no_harm?
96    
97     Dir.chdir dn
98     Dir.foreach('.') do |fn|
99     next if fn == '.'
100     next if fn == '..'
101     if dir?(fn)
102     verbose_off {
103     rm_rf fn
104     }
105     else
106     verbose_off {
107     rm_f fn
108     }
109     end
110     end
111     Dir.chdir '..'
112     Dir.rmdir dn
113     end
114    
115     def move_file( src, dest )
116     File.unlink dest if FileTest.exist?(dest)
117     begin
118     File.rename src, dest
119     rescue
120     File.open(dest, 'wb') {|f| f.write read_file(src) }
121     File.chmod File.stat(src).mode, dest
122     File.unlink src
123     end
124     end
125    
126     def install( from, dest, mode, prefix = nil )
127     $stderr.puts "install #{from} #{dest}" if verbose?
128     return if no_harm?
129    
130     realdest = prefix + dest if prefix
131     realdest += '/' + File.basename(from) if dir?(realdest)
132     str = read_file(from)
133     if diff?(str, realdest)
134     verbose_off {
135     rm_f realdest if File.exist?(realdest)
136     }
137     File.open(realdest, 'wb') {|f| f.write str }
138     File.chmod mode, realdest
139    
140     File.open("#{objdir_root()}/InstalledFiles", 'a') {|f| f.puts realdest }
141     end
142     end
143    
144     def diff?( orig, targ )
145     return true unless File.exist?(targ)
146     orig != read_file(targ)
147     end
148    
149     def command( str )
150     $stderr.puts str if verbose?
151     system str or raise RuntimeError, "'system #{str}' failed"
152     end
153    
154     def ruby( str )
155     command config('ruby-prog') + ' ' + str
156     end
157    
158     def make( task = '' )
159     command config('make-prog') + ' ' + task
160     end
161    
162     def extdir?( dir )
163     File.exist?(dir + '/MANIFEST')
164     end
165    
166     def dir?( path )
167     # for corrupted windows stat()
168     FileTest.directory?((path[-1,1] == '/') ? path : path + '/')
169     end
170    
171     def all_files_in( dirname )
172     Dir.open(dirname) {|d|
173     return d.select {|ent| FileTest.file?("#{dirname}/#{ent}") }
174     }
175     end
176    
177     REJECT_DIRS = %w(
178     CVS SCCS RCS CVS.adm
179     )
180    
181     def all_dirs_in( dirname )
182     Dir.open(dirname) {|d|
183     return d.select {|n| dir?("#{dirname}/#{n}") } - %w(. ..) - REJECT_DIRS
184     }
185     end
186    
187     def read_file( fname )
188     File.open(fname, 'rb') {|f| return f.read }
189     end
190    
191     end
192     #
193     # config.rb
194     #
195    
196     if i = ARGV.index(/\A--rbconfig=/)
197     file = $'
198     ARGV.delete_at(i)
199     require file
200     else
201     require 'rbconfig'
202     end
203    
204    
205     class ConfigTable
206    
207     c = ::Config::CONFIG
208    
209     rubypath = c['bindir'] + '/' + c['ruby_install_name']
210    
211     major = c['MAJOR'].to_i
212     minor = c['MINOR'].to_i
213     teeny = c['TEENY'].to_i
214     version = "#{major}.#{minor}"
215    
216     # ruby ver. >= 1.4.4?
217     newpath_p = ((major >= 2) or
218     ((major == 1) and
219     ((minor >= 5) or
220     ((minor == 4) and (teeny >= 4)))))
221    
222     re = Regexp.new('\A' + Regexp.quote(c['prefix']))
223     subprefix = lambda {|path|
224     re === path and path.sub(re, '$prefix')
225     }
226    
227     if c['rubylibdir']
228     # V < 1.6.3
229     stdruby = subprefix.call(c['rubylibdir'])
230     siteruby = subprefix.call(c['sitedir'])
231     versite = subprefix.call(c['sitelibdir'])
232     sodir = subprefix.call(c['sitearchdir'])
233     elsif newpath_p
234     # 1.4.4 <= V <= 1.6.3
235     stdruby = "$prefix/lib/ruby/#{version}"
236     siteruby = subprefix.call(c['sitedir'])
237     versite = siteruby + '/' + version
238     sodir = "$site-ruby/#{c['arch']}"
239     else
240     # V < 1.4.4
241     stdruby = "$prefix/lib/ruby/#{version}"
242     siteruby = "$prefix/lib/ruby/#{version}/site_ruby"
243     versite = siteruby
244     sodir = "$site-ruby/#{c['arch']}"
245     end
246    
247     common_descripters = [
248     [ 'prefix', [ c['prefix'],
249     'path',
250     'path prefix of target environment' ] ],
251     [ 'std-ruby', [ stdruby,
252     'path',
253     'the directory for standard ruby libraries' ] ],
254     [ 'site-ruby-common', [ siteruby,
255     'path',
256     'the directory for version-independent non-standard ruby libraries' ] ],
257     [ 'site-ruby', [ versite,
258     'path',
259     'the directory for non-standard ruby libraries' ] ],
260     [ 'bin-dir', [ '$prefix/bin',
261     'path',
262     'the directory for commands' ] ],
263     [ 'rb-dir', [ '$site-ruby',
264     'path',
265     'the directory for ruby scripts' ] ],
266     [ 'so-dir', [ sodir,
267     'path',
268     'the directory for ruby extentions' ] ],
269     [ 'data-dir', [ '$prefix/share',
270     'path',
271     'the directory for shared data' ] ],
272     [ 'ruby-path', [ rubypath,
273     'path',
274     'path to set to #! line' ] ],
275     [ 'ruby-prog', [ rubypath,
276     'name',
277     'the ruby program using for installation' ] ],
278     [ 'make-prog', [ 'make',
279     'name',
280     'the make program to compile ruby extentions' ] ],
281     [ 'without-ext', [ 'no',
282     'yes/no',
283     'does not compile/install ruby extentions' ] ]
284     ]
285     multipackage_descripters = [
286     [ 'with', [ '',
287     'name,name...',
288     'package names that you want to install',
289     'ALL' ] ],
290     [ 'without', [ '',
291     'name,name...',
292     'package names that you do not want to install',
293     'NONE' ] ]
294     ]
295     if multipackage_install?
296     DESCRIPTER = common_descripters + multipackage_descripters
297     else
298     DESCRIPTER = common_descripters
299     end
300    
301     SAVE_FILE = 'config.save'
302    
303     def ConfigTable.each_name( &block )
304     keys().each(&block)
305     end
306    
307     def ConfigTable.keys
308     DESCRIPTER.map {|name, *dummy| name }
309     end
310    
311     def ConfigTable.each_definition( &block )
312     DESCRIPTER.each(&block)
313     end
314    
315     def ConfigTable.get_entry( name )
316     name, ent = DESCRIPTER.assoc(name)
317     ent
318     end
319    
320     def ConfigTable.get_entry!( name )
321     get_entry(name) or raise ArgumentError, "no such config: #{name}"
322     end
323    
324     def ConfigTable.add_entry( name, vals )
325     ConfigTable::DESCRIPTER.push [name,vals]
326     end
327    
328     def ConfigTable.remove_entry( name )
329     get_entry(name) or raise ArgumentError, "no such config: #{name}"
330     DESCRIPTER.delete_if {|n, arr| n == name }
331     end
332    
333     def ConfigTable.config_key?( name )
334     get_entry(name) ? true : false
335     end
336    
337     def ConfigTable.bool_config?( name )
338     ent = get_entry(name) or return false
339     ent[1] == 'yes/no'
340     end
341    
342     def ConfigTable.value_config?( name )
343     ent = get_entry(name) or return false
344     ent[1] != 'yes/no'
345     end
346    
347     def ConfigTable.path_config?( name )
348     ent = get_entry(name) or return false
349     ent[1] == 'path'
350     end
351    
352    
353     class << self
354     alias newobj new
355     end
356    
357     def ConfigTable.new
358     c = newobj()
359     c.initialize_from_table
360     c
361     end
362    
363     def ConfigTable.load
364     c = newobj()
365     c.initialize_from_file
366     c
367     end
368    
369     def initialize_from_table
370     @table = {}
371     DESCRIPTER.each do |k, (default, vname, desc, default2)|
372     @table[k] = default
373     end
374     end
375    
376     def initialize_from_file
377     raise InstallError, "#{File.basename $0} config first"\
378     unless FileTest.file?(SAVE_FILE)
379     @table = {}
380     File.foreach(SAVE_FILE) do |line|
381     k, v = line.split(/=/, 2)
382     @table[k] = v.strip
383     end
384     end
385    
386     def save
387     File.open(SAVE_FILE, 'w') {|f|
388     @table.each do |k, v|
389     f.printf "%s=%s\n", k, v if v
390     end
391     }
392     end
393    
394     def []=( k, v )
395     raise InstallError, "unknown config option #{k}"\
396     unless ConfigTable.config_key?(k)
397     if ConfigTable.path_config?(k)
398     @table[k] = ((v[0,1] != '$') ? File.expand_path(v) : v)
399     else
400     @table[k] = v
401     end
402     end
403    
404     def []( key )
405     return nil unless @table[key]
406     @table[key].gsub(%r<\$([^/]+)>) { self[$1] }
407     end
408    
409     def set_raw( key, val )
410     @table[key] = val
411     end
412    
413     def get_raw( key )
414     @table[key]
415     end
416    
417     end
418    
419    
420     module MetaConfigAPI
421    
422     def eval_file_ifexist( fname )
423     instance_eval read_file(fname), fname, 1 if FileTest.file?(fname)
424     end
425    
426     def config_names
427     ConfigTable.keys
428     end
429    
430     def config?( name )
431     ConfigTable.config_key?(name)
432     end
433    
434     def bool_config?( name )
435     ConfigTable.bool_config?(name)
436     end
437    
438     def value_config?( name )
439     ConfigTable.value_config?(name)
440     end
441    
442     def path_config?( name )
443     ConfigTable.path_config?(name)
444     end
445    
446     def add_config( name, argname, default, desc )
447     ConfigTable.add_entry name,[default,argname,desc]
448     end
449    
450     def add_path_config( name, default, desc )
451     add_config name, 'path', default, desc
452     end
453    
454     def add_bool_config( name, default, desc )
455     add_config name, 'yes/no', default ? 'yes' : 'no', desc
456     end
457    
458     def set_config_default( name, default )
459     if bool_config?(name)
460     ConfigTable.get_entry!(name)[0] = (default ? 'yes' : 'no')
461     else
462     ConfigTable.get_entry!(name)[0] = default
463     end
464     end
465    
466     def remove_config( name )
467     ent = ConfigTable.get_entry(name)
468     ConfigTable.remove_entry name
469     ent
470     end
471    
472     end
473     #
474     # base.rb
475     #
476    
477     require 'rbconfig'
478    
479    
480     class InstallError < StandardError; end
481    
482    
483     module HookUtils
484    
485     def run_hook( name )
486     try_run_hook "#{curr_srcdir()}/#{name}" or
487     try_run_hook "#{curr_srcdir()}/#{name}.rb"
488     end
489    
490     def try_run_hook( fname )
491     return false unless FileTest.file?(fname)
492     begin
493     instance_eval read_file(fname), fname, 1
494     rescue
495     raise InstallError, "hook #{fname} failed:\n" + $!.message
496     end
497     true
498     end
499    
500     end
501    
502    
503     module HookScriptAPI
504    
505     def get_config( key )
506     @config[key]
507     end
508    
509     alias config get_config
510    
511     def set_config( key, val )
512     @config[key] = val
513     end
514    
515     #
516     # srcdir/objdir (works only in the package directory)
517     #
518    
519     #abstract srcdir_root
520     #abstract objdir_root
521     #abstract relpath
522    
523     def curr_srcdir
524     "#{srcdir_root()}/#{relpath()}"
525     end
526    
527     def curr_objdir
528     "#{objdir_root()}/#{relpath()}"
529     end
530    
531     def srcfile( path )
532     "#{curr_srcdir()}/#{path}"
533     end
534    
535     def srcexist?( path )
536     FileTest.exist? srcfile(path)
537     end
538    
539     def srcdirectory?( path )
540     dir? srcfile(path)
541     end
542    
543     def srcfile?( path )
544     FileTest.file? srcfile(path)
545     end
546    
547     def srcentries( path = '.' )
548     Dir.open("#{curr_srcdir()}/#{path}") {|d|
549     return d.to_a - %w(. ..)
550     }
551     end
552    
553     def srcfiles( path = '.' )
554     srcentries(path).select {|fname|
555     FileTest.file?(File.join(curr_srcdir(), path, fname))
556     }
557     end
558    
559     def srcdirectories( path = '.' )
560     srcentries(path).select {|fname|
561     dir?(File.join(curr_srcdir(), path, fname))
562     }
563     end
564    
565     end
566    
567    
568     class Installer
569    
570     FILETYPES = %w( bin lib ext data )
571    
572     include HookScriptAPI
573     include HookUtils
574     include FileOperations
575    
576     def initialize( config, opt, srcroot, objroot )
577     @config = config
578     @options = opt
579     @srcdir = File.expand_path(srcroot)
580     @objdir = File.expand_path(objroot)
581     @currdir = '.'
582     end
583    
584     def inspect
585     "#<#{self.class} #{File.basename(@srcdir)}>"
586     end
587    
588     #
589     # Hook Script API bases
590     #
591    
592     def srcdir_root
593     @srcdir
594     end
595    
596     def objdir_root
597     @objdir
598     end
599    
600     def relpath
601     @currdir
602     end
603    
604     #
605     # configs/options
606     #
607    
608     def no_harm?
609     @options['no-harm']
610     end
611    
612     def verbose?
613     @options['verbose']
614     end
615    
616     def verbose_off
617     begin
618     save, @options['verbose'] = @options['verbose'], false
619     yield
620     ensure
621     @options['verbose'] = save
622     end
623     end
624    
625     #
626     # TASK config
627     #
628    
629     def exec_config
630     exec_task_traverse 'config'
631     end
632    
633     def config_dir_bin( rel )
634     end
635    
636     def config_dir_lib( rel )
637     end
638    
639     def config_dir_ext( rel )
640     extconf if extdir?(curr_srcdir())
641     end
642    
643     def extconf
644     opt = @options['config-opt'].join(' ')
645     command "#{config('ruby-prog')} #{curr_srcdir()}/extconf.rb #{opt}"
646     end
647    
648     def config_dir_data( rel )
649     end
650    
651     #
652     # TASK setup
653     #
654    
655     def exec_setup
656     exec_task_traverse 'setup'
657     end
658    
659     def setup_dir_bin( rel )
660     all_files_in(curr_srcdir()).each do |fname|
661     adjust_shebang "#{curr_srcdir()}/#{fname}"
662     end
663     end
664    
665     # modify: #!/usr/bin/ruby
666     # modify: #! /usr/bin/ruby
667     # modify: #!ruby
668     # not modify: #!/usr/bin/env ruby
669     SHEBANG_RE = /\A\#!\s*\S*ruby\S*/
670    
671     def adjust_shebang( path )
672     return if no_harm?
673    
674     tmpfile = File.basename(path) + '.tmp'
675     begin
676     File.open(path) {|r|
677     File.open(tmpfile, 'w') {|w|
678     first = r.gets
679     return unless SHEBANG_RE === first
680    
681     $stderr.puts "adjusting shebang: #{File.basename path}" if verbose?
682     w.print first.sub(SHEBANG_RE, '#!' + config('ruby-path'))
683     w.write r.read
684     }
685     }
686     move_file tmpfile, File.basename(path)
687     ensure
688     File.unlink tmpfile if File.exist?(tmpfile)
689     end
690     end
691    
692     def setup_dir_lib( rel )
693     end
694    
695     def setup_dir_ext( rel )
696     make if extdir?(curr_srcdir())
697     end
698    
699     def setup_dir_data( rel )
700     end
701    
702     #
703     # TASK install
704     #
705    
706     def exec_install
707     exec_task_traverse 'install'
708     end
709    
710     def install_dir_bin( rel )
711     install_files collect_filenames_auto(), config('bin-dir') + '/' + rel, 0755
712     end
713    
714     def install_dir_lib( rel )
715     install_files ruby_scripts(), config('rb-dir') + '/' + rel, 0644
716     end
717    
718     def install_dir_ext( rel )
719     return unless extdir?(curr_srcdir())
720     install_files ruby_extentions('.'),
721     config('so-dir') + '/' + File.dirname(rel),
722     0555
723     end
724    
725     def install_dir_data( rel )
726     install_files collect_filenames_auto(), config('data-dir') + '/' + rel, 0644
727     end
728    
729     def install_files( list, dest, mode )
730     mkdir_p dest, @options['install-prefix']
731     list.each do |fname|
732     install fname, dest, mode, @options['install-prefix']
733     end
734     end
735    
736     def ruby_scripts
737     collect_filenames_auto().select {|n| /\.rb\z/ === n }
738     end
739    
740     # picked up many entries from cvs-1.11.1/src/ignore.c
741     reject_patterns = %w(
742     core RCSLOG tags TAGS .make.state
743     .nse_depinfo #* .#* cvslog.* ,* .del-* *.a *.olb *.o *.obj
744     *.so *.Z *~ *.old *.elc *.ln *.bak *.BAK *.orig *.rej *.exe _$* *$
745    
746     *.org *.in .*
747     )
748     maptab = {
749     '.' => '\\.',
750     '$' => '\\$',
751     '*' => '.*'
752     }
753     REJECT_PATTERNS = Regexp.new('\A(?:' +
754     reject_patterns.map {|pat|
755     pat.gsub(/[\.\$\*]/) {|s| maptab[s] }
756     }.join('|') +
757     ')\z')
758    
759     def collect_filenames_auto
760     mapdir((existfiles() - hookfiles()).reject {|fname|
761     REJECT_PATTERNS === fname
762     })
763     end
764    
765     def existfiles
766     all_files_in(curr_srcdir()) | all_files_in('.')
767     end
768    
769     def hookfiles
770     %w( pre-%s post-%s pre-%s.rb post-%s.rb ).map {|fmt|
771     %w( config setup install clean ).map {|t| sprintf(fmt, t) }
772     }.flatten
773     end
774    
775     def mapdir( filelist )
776     filelist.map {|fname|
777     if File.exist?(fname) # objdir
778     fname
779     else # srcdir
780     File.join(curr_srcdir(), fname)
781     end
782     }
783     end
784    
785     def ruby_extentions( dir )
786     _ruby_extentions(dir) or
787     raise InstallError, "no ruby extention exists: 'ruby #{$0} setup' first"
788     end
789    
790     DLEXT = /\.#{ ::Config::CONFIG['DLEXT'] }\z/
791    
792     def _ruby_extentions( dir )
793     Dir.open(dir) {|d|
794     return d.select {|fname| DLEXT === fname }
795     }
796     end
797    
798     #
799     # TASK clean
800     #
801    
802     def exec_clean
803     exec_task_traverse 'clean'
804     rm_f 'config.save'
805     rm_f 'InstalledFiles'
806     end
807    
808     def clean_dir_bin( rel )
809     end
810    
811     def clean_dir_lib( rel )
812     end
813    
814     def clean_dir_ext( rel )
815     return unless extdir?(curr_srcdir())
816     make 'clean' if FileTest.file?('Makefile')
817     end
818    
819     def clean_dir_data( rel )
820     end
821    
822     #
823     # TASK distclean
824     #
825    
826     def exec_distclean
827     exec_task_traverse 'distclean'
828     rm_f 'config.save'
829     rm_f 'InstalledFiles'
830     end
831    
832     def distclean_dir_bin( rel )
833     end
834    
835     def distclean_dir_lib( rel )
836     end
837    
838     def distclean_dir_ext( rel )
839     return unless extdir?(curr_srcdir())
840     make 'distclean' if FileTest.file?('Makefile')
841     end
842    
843     #
844     # lib
845     #
846    
847     def exec_task_traverse( task )
848     run_hook 'pre-' + task
849     FILETYPES.each do |type|
850     if config('without-ext') == 'yes' and type == 'ext'
851     $stderr.puts 'skipping ext/* by user option' if verbose?
852     next
853     end
854     traverse task, type, task + '_dir_' + type
855     end
856     run_hook 'post-' + task
857     end
858    
859     def traverse( task, rel, mid )
860     dive_into(rel) {
861     run_hook 'pre-' + task
862     __send__ mid, rel.sub(%r[\A.*?(?:/|\z)], '')
863     all_dirs_in(curr_srcdir()).each do |d|
864     traverse task, rel + '/' + d, mid
865     end
866     run_hook 'post-' + task
867     }
868     end
869    
870     def dive_into( rel )
871     return unless dir?("#{@srcdir}/#{rel}")
872    
873     dir = File.basename(rel)
874     Dir.mkdir dir unless dir?(dir)
875     prevdir = Dir.pwd
876     Dir.chdir dir
877     $stderr.puts '---> ' + rel if verbose?
878     @currdir = rel
879     yield
880     Dir.chdir prevdir
881     $stderr.puts '<--- ' + rel if verbose?
882     @currdir = File.dirname(rel)
883     end
884    
885     end
886     #
887     # toplevel.rb
888     #
889    
890     class ToplevelInstaller
891    
892     Version = '3.2.1'
893     Copyright = 'Copyright (c) 2000-2003 Minero Aoki'
894    
895     TASKS = [
896     [ 'config', 'saves your configurations' ],
897     [ 'show', 'shows current configuration' ],
898     [ 'setup', 'compiles ruby extentions and others' ],
899     [ 'install', 'installs files' ],
900     [ 'clean', "does `make clean' for each extention" ],
901     [ 'distclean',"does `make distclean' for each extention" ]
902     ]
903    
904     def ToplevelInstaller.invoke
905     instance().invoke
906     end
907    
908     @singleton = nil
909    
910     def ToplevelInstaller.instance
911     @singleton ||= new(File.dirname($0))
912     @singleton
913     end
914    
915     include MetaConfigAPI
916    
917     def initialize( ardir_root )
918     @config = nil
919     @options = { 'verbose' => true }
920     @ardir = File.expand_path(ardir_root)
921     end
922    
923     def inspect
924     "#<#{self.class} #{__id__()}>"
925     end
926    
927     def invoke
928     run_metaconfigs
929     task = parsearg_global()
930     @config = load_config(task)
931     __send__ "parsearg_#{task}"
932     init_installers
933     __send__ "exec_#{task}"
934     end
935    
936     def run_metaconfigs
937     eval_file_ifexist "#{@ardir}/metaconfig"
938     end
939    
940     def load_config( task )
941     case task
942     when 'config'
943     ConfigTable.new
944     when 'clean', 'distclean'
945     if File.exist?('config.save')
946     then ConfigTable.load
947     else ConfigTable.new
948     end
949     else
950     ConfigTable.load
951     end
952     end
953    
954     def init_installers
955     @installer = Installer.new(@config, @options, @ardir, File.expand_path('.'))
956     end
957    
958     #
959     # Hook Script API bases
960     #
961    
962     def srcdir_root
963     @ardir
964     end
965    
966     def objdir_root
967     '.'
968     end
969    
970     def relpath
971     '.'
972     end
973    
974     #
975     # Option Parsing
976     #
977    
978     def parsearg_global
979     valid_task = /\A(?:#{TASKS.map {|task,desc| task }.join '|'})\z/
980    
981     while arg = ARGV.shift
982     case arg
983     when /\A\w+\z/
984     raise InstallError, "invalid task: #{arg}" unless valid_task === arg
985     return arg
986    
987     when '-q', '--quiet'
988     @options['verbose'] = false
989    
990     when '--verbose'
991     @options['verbose'] = true
992    
993     when '-h', '--help'
994     print_usage $stdout
995     exit 0
996    
997     when '-v', '--version'
998     puts "#{File.basename($0)} version #{Version}"
999     exit 0
1000    
1001     when '--copyright'
1002     puts Copyright
1003     exit 0
1004    
1005     else
1006     raise InstallError, "unknown global option '#{arg}'"
1007     end
1008     end
1009    
1010     raise InstallError, <<EOS
1011     No task or global option given.
1012     Typical installation procedure is:
1013     $ ruby #{File.basename($0)} config
1014     $ ruby #{File.basename($0)} setup
1015     # ruby #{File.basename($0)} install (may require root privilege)
1016     EOS
1017     end
1018    
1019    
1020     def parsearg_no_options
1021     raise InstallError, "#{task}: unknown options: #{ARGV.join ' '}"\
1022     unless ARGV.empty?
1023     end
1024    
1025     alias parsearg_show parsearg_no_options
1026     alias parsearg_setup parsearg_no_options
1027     alias parsearg_clean parsearg_no_options
1028     alias parsearg_distclean parsearg_no_options
1029    
1030     def parsearg_config
1031     re = /\A--(#{ConfigTable.keys.join '|'})(?:=(.*))?\z/
1032     @options['config-opt'] = []
1033    
1034     while i = ARGV.shift
1035     if /\A--?\z/ === i
1036     @options['config-opt'] = ARGV.dup
1037     break
1038     end
1039     m = re.match(i) or raise InstallError, "config: unknown option #{i}"
1040     name, value = m.to_a[1,2]
1041     if value
1042     if ConfigTable.bool_config?(name)
1043     raise InstallError, "config: --#{name} allows only yes/no for argument"\
1044     unless /\A(y(es)?|n(o)?|t(rue)?|f(alse))\z/i === value
1045     value = (/\Ay(es)?|\At(rue)/i === value) ? 'yes' : 'no'
1046     end
1047     else
1048     raise InstallError, "config: --#{name} requires argument"\
1049     unless ConfigTable.bool_config?(name)
1050     value = 'yes'
1051     end
1052     @config[name] = value
1053     end
1054     end
1055    
1056     def parsearg_install
1057     @options['no-harm'] = false
1058     @options['install-prefix'] = ''
1059     while a = ARGV.shift
1060     case a
1061     when /\A--no-harm\z/
1062     @options['no-harm'] = true
1063     when /\A--prefix=(.*)\z/
1064     path = $1
1065     path = File.expand_path(path) unless path[0,1] == '/'
1066     @options['install-prefix'] = path
1067     else
1068     raise InstallError, "install: unknown option #{a}"
1069     end
1070     end
1071     end
1072    
1073     def print_usage( out )
1074     out.puts 'Typical Installation Procedure:'
1075     out.puts " $ ruby #{File.basename $0} config"
1076     out.puts " $ ruby #{File.basename $0} setup"
1077     out.puts " # ruby #{File.basename $0} install (may require root privilege)"
1078     out.puts
1079     out.puts 'Detailed Usage:'
1080     out.puts " ruby #{File.basename $0} <global option>"
1081     out.puts " ruby #{File.basename $0} [<global options>] <task> [<task options>]"
1082    
1083     fmt = " %-20s %s\n"
1084     out.puts
1085     out.puts 'Global options:'
1086     out.printf fmt, '-q,--quiet', 'suppress message outputs'
1087     out.printf fmt, ' --verbose', 'output messages verbosely'
1088     out.printf fmt, '-h,--help', 'print this message'
1089     out.printf fmt, '-v,--version', 'print version and quit'
1090     out.printf fmt, ' --copyright', 'print copyright and quit'
1091    
1092     out.puts
1093     out.puts 'Tasks:'
1094     TASKS.each do |name, desc|
1095     out.printf " %-10s %s\n", name, desc
1096     end
1097    
1098     out.puts
1099     out.puts 'Options for config:'
1100     ConfigTable.each_definition do |name, (default, arg, desc, default2)|
1101     out.printf " %-20s %s [%s]\n",
1102     '--'+ name + (ConfigTable.bool_config?(name) ? '' : '='+arg),
1103     desc,
1104     default2 || default
1105     end
1106     out.printf " %-20s %s [%s]\n",
1107     '--rbconfig=path', 'your rbconfig.rb to load', "running ruby's"
1108    
1109     out.puts
1110     out.puts 'Options for install:'
1111     out.printf " %-20s %s [%s]\n",
1112     '--no-harm', 'only display what to do if given', 'off'
1113     out.printf " %-20s %s [%s]\n",
1114     '--prefix', 'install path prefix', '$prefix'
1115    
1116     out.puts
1117     end
1118    
1119     #
1120     # Task Handlers
1121     #
1122    
1123     def exec_config
1124     @config.save
1125     @installer.exec_config
1126     end
1127    
1128     def exec_setup
1129     @installer.exec_setup
1130     end
1131    
1132     def exec_install
1133     @installer.exec_install
1134     end
1135    
1136     def exec_show
1137     ConfigTable.each_name do |k|
1138     v = @config.get_raw(k)
1139     if not v or v.empty?
1140     v = '(not specified)'
1141     end
1142     printf "%-10s %s\n", k, v
1143     end
1144     end
1145    
1146     def exec_clean
1147     @installer.exec_clean
1148     end
1149    
1150     def exec_distclean
1151     @installer.exec_distclean
1152     end
1153    
1154     end
1155    
1156    
1157     class ToplevelInstallerMulti < ToplevelInstaller
1158    
1159     include HookUtils
1160     include HookScriptAPI
1161     include FileOperations
1162    
1163     def initialize( ardir )
1164     super
1165     @packages = all_dirs_in("#{@ardir}/packages")
1166     raise 'no package exists' if @packages.empty?
1167     end
1168    
1169     def run_metaconfigs
1170     eval_file_ifexist "#{@ardir}/metaconfig"
1171     @packages.each do |name|
1172     eval_file_ifexist "#{@ardir}/packages/#{name}/metaconfig"
1173     end
1174     end
1175    
1176     def init_installers
1177     @installers = {}
1178     @packages.each do |pack|
1179     @installers[pack] = Installer.new(@config, @options,
1180     "#{@ardir}/packages/#{pack}",
1181     "packages/#{pack}")
1182     end
1183    
1184     with = extract_selection(config('with'))
1185     without = extract_selection(config('without'))
1186     @selected = @installers.keys.select {|name|
1187     (with.empty? or with.include?(name)) \
1188     and not without.include?(name)
1189     }
1190     end
1191    
1192     def extract_selection( list )
1193     a = list.split(/,/)
1194     a.each do |name|
1195     raise InstallError, "no such package: #{name}" \
1196     unless @installers.key?(name)
1197     end
1198     a
1199     end
1200    
1201     def print_usage( f )
1202     super
1203     f.puts 'Inluded packages:'
1204     f.puts ' ' + @packages.sort.join(' ')
1205     f.puts
1206     end
1207    
1208     #
1209     # multi-package metaconfig API
1210     #
1211    
1212     attr_reader :packages
1213    
1214     def declare_packages( list )
1215     raise 'package list is empty' if list.empty?
1216     list.each do |name|
1217     raise "directory packages/#{name} does not exist"\
1218     unless dir?("#{@ardir}/packages/#{name}")
1219     end
1220     @packages = list
1221     end
1222    
1223     #
1224     # Task Handlers
1225     #
1226    
1227     def exec_config
1228     run_hook 'pre-config'
1229     @config.save
1230     each_selected_installers {|inst| inst.exec_config }
1231     run_hook 'post-config'
1232     end
1233    
1234     def exec_setup
1235     run_hook 'pre-setup'
1236     each_selected_installers {|inst| inst.exec_setup }
1237     run_hook 'post-setup'
1238     end
1239    
1240     def exec_install
1241     run_hook 'pre-install'
1242     each_selected_installers {|inst| inst.exec_install }
1243     run_hook 'post-install'
1244     end
1245    
1246     def exec_clean
1247     rm_f 'config.save'
1248     run_hook 'pre-clean'
1249     each_selected_installers {|inst| inst.exec_clean }
1250     run_hook 'post-clean'
1251     end
1252    
1253     def exec_distclean
1254     rm_f 'config.save'
1255     run_hook 'pre-distclean'
1256     each_selected_installers {|inst| inst.exec_distclean }
1257     run_hook 'post-distclean'
1258     end
1259    
1260     #
1261     # lib
1262     #
1263    
1264     def each_selected_installers
1265     Dir.mkdir 'packages' unless dir?('packages')
1266     @selected.each do |pack|
1267     $stderr.puts "Processing the package `#{pack}' ..." if @options['verbose']
1268     Dir.mkdir "packages/#{pack}" unless dir?("packages/#{pack}")
1269     Dir.chdir "packages/#{pack}"
1270     yield @installers[pack]
1271     Dir.chdir '../..'
1272     end
1273     end
1274    
1275     def verbose?
1276     @options['verbose']
1277     end
1278    
1279     def no_harm?
1280     @options['no-harm']
1281     end
1282    
1283     end
1284    
1285     if $0 == __FILE__
1286     begin
1287     if multipackage_install?
1288     ToplevelInstallerMulti.invoke
1289     else
1290     ToplevelInstaller.invoke
1291     end
1292     rescue
1293     raise if $DEBUG
1294     $stderr.puts $!.message
1295     $stderr.puts "Try 'ruby #{$0} --help' for detailed usage."
1296     exit 1
1297     end
1298     end

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