libguib 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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