libguib 1.1.0

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