setup 4.2.0 → 5.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (55) hide show
  1. data/HISTORY +47 -3
  2. data/MANIFEST +49 -16
  3. data/README.rdoc +148 -0
  4. data/bin/setup.rb +1 -5
  5. data/lib/setup.rb +2 -2
  6. data/lib/setup/base.rb +143 -0
  7. data/lib/setup/command.rb +218 -114
  8. data/lib/setup/compiler.rb +69 -0
  9. data/lib/setup/configuration.rb +822 -0
  10. data/lib/setup/constants.rb +12 -0
  11. data/lib/setup/{rubyver.rb → core_ext.rb} +0 -0
  12. data/lib/setup/documentor.rb +149 -0
  13. data/lib/setup/installer.rb +363 -0
  14. data/lib/setup/project.rb +68 -0
  15. data/lib/setup/rake.rb +44 -45
  16. data/lib/setup/session.rb +233 -0
  17. data/lib/setup/tester.rb +92 -0
  18. data/lib/setup/uninstaller.rb +76 -0
  19. data/meta/active +1 -0
  20. data/meta/collection +1 -0
  21. data/meta/{abstract → description} +0 -0
  22. data/meta/{package → name} +0 -0
  23. data/meta/repository +1 -0
  24. data/meta/ruby +3 -0
  25. data/meta/version +1 -1
  26. data/script/bstrap +5 -0
  27. data/script/bundle +64 -0
  28. data/script/setup +1338 -0
  29. data/script/test +3 -0
  30. data/test/cases/installer.rb +28 -0
  31. data/test/features/config.feature +16 -0
  32. data/test/features/document.feature +2 -0
  33. data/test/features/install.feature +72 -0
  34. data/test/features/make.feature +18 -0
  35. data/test/features/step_definitions/common_steps.rb +34 -0
  36. data/test/features/step_definitions/config_steps.rb +24 -0
  37. data/test/features/step_definitions/env.rb +37 -0
  38. data/test/features/step_definitions/install_steps.rb +75 -0
  39. data/test/features/step_definitions/setup_steps.rb +30 -0
  40. data/test/features/step_definitions/uninstall_steps.rb +8 -0
  41. data/test/features/test.feature +2 -0
  42. data/test/features/uninstall.feature +13 -0
  43. data/test/fixtures/faux-project/bin/faux +3 -0
  44. data/test/fixtures/faux-project/ext/faux/extconf.rb +12 -0
  45. data/test/fixtures/faux-project/ext/faux/faux.c +24 -0
  46. data/test/fixtures/faux-project/lib/faux.rb +1 -0
  47. metadata +58 -29
  48. data/README +0 -106
  49. data/RELEASE +0 -41
  50. data/lib/setup/build.rb +0 -2
  51. data/lib/setup/config.rb +0 -452
  52. data/lib/setup/error.rb +0 -4
  53. data/lib/setup/install.rb +0 -1007
  54. data/meta/setup/metaconfig.rb +0 -3
  55. data/test/test_installer.rb +0 -139
@@ -0,0 +1,822 @@
1
+ require 'rbconfig'
2
+ require 'fileutils'
3
+ require 'erb'
4
+ require 'yaml'
5
+ require 'setup/core_ext'
6
+ require 'setup/constants'
7
+
8
+ module Setup
9
+
10
+ # Stores platform information and general install settings.
11
+ #
12
+ class Configuration
13
+
14
+ # Ruby System Configuration
15
+ RBCONFIG = ::Config::CONFIG
16
+
17
+ # Confgiuration file
18
+ CONFIG_FILE = 'SetupConfig' # '.cache/setup/config'
19
+
20
+ # Custom configuration file.
21
+ META_CONFIG_FILE = META_EXTENSION_DIR + '/configuration.rb'
22
+
23
+ #
24
+ def self.options
25
+ @@options ||= []
26
+ end
27
+
28
+ # TODO: better methods for path type
29
+ def self.option(name, *args) #type, description)
30
+ options << [name.to_s, *args] #type, description]
31
+ attr_accessor(name)
32
+ end
33
+
34
+ option :prefix , :path, 'path prefix of target environment'
35
+ option :bindir , :path, 'directory for commands'
36
+ option :libdir , :path, 'directory for libraries'
37
+ option :datadir , :path, 'directory for shared data'
38
+ option :mandir , :path, 'directory for man pages'
39
+ option :docdir , :path, 'directory for documentation'
40
+ option :rbdir , :path, 'directory for ruby scripts'
41
+ option :sodir , :path, 'directory for ruby extentions'
42
+ option :sysconfdir , :path, 'directory for system configuration files'
43
+ option :localstatedir , :path, 'directory for local state data'
44
+
45
+ option :libruby , :path, 'directory for ruby libraries'
46
+ option :librubyver , :path, 'directory for standard ruby libraries'
47
+ option :librubyverarch , :path, 'directory for standard ruby extensions'
48
+ option :siteruby , :path, 'directory for version-independent aux ruby libraries'
49
+ option :siterubyver , :path, 'directory for aux ruby libraries'
50
+ option :siterubyverarch , :path, 'directory for aux ruby binaries'
51
+
52
+ option :rubypath , :prog, 'path to set to #! line'
53
+ option :rubyprog , :prog, 'ruby program used for installation'
54
+ option :makeprog , :prog, 'make program to compile ruby extentions'
55
+
56
+ option :extconfopt , :opts, 'options to pass-thru to extconf.rb'
57
+
58
+ option :shebang , :pick, 'shebang line (#!) editing mode (all,ruby,never)'
59
+
60
+ option :no_test, :t , :bool, 'run pre-installation tests'
61
+ option :no_ri, :d , :bool, 'generate ri documentation'
62
+ option :no_doc , :bool, 'install doc/ directory'
63
+ option :no_ext , :bool, 'compile/install ruby extentions'
64
+
65
+ #option :rdoc , :pick, 'generate rdoc documentation'
66
+ #option :rdoc_template , :pick, 'rdoc document template to use'
67
+ #option :testrunner , :pick, 'Runner to use for testing (auto|console|tk|gtk|gtk2)'
68
+
69
+ option :install_prefix , :path, 'install to alternate root location'
70
+ option :root , :path, 'install to alternate root location'
71
+
72
+ option :installdirs , :pick, 'install location mode (site,std,home)' #, local)
73
+ option :type , :pick, 'install location mode (site,std,home)'
74
+
75
+ # Turn all of CONFIG into methods.
76
+
77
+ ::Config::CONFIG.each do |key,val|
78
+ next if key == "configure_args"
79
+ name = key.to_s.downcase
80
+ #name = name.sub(/^--/,'')
81
+ #name = name.gsub(/-/,'_')
82
+ define_method(name){ val }
83
+ end
84
+
85
+ # Turn all of CONFIG["configure_args"] into methods.
86
+
87
+ ::Config::CONFIG["configure_args"].each do |ent|
88
+ key, val = *ent.split("=")
89
+ name = key.downcase
90
+ name = name.sub(/^--/,'')
91
+ name = name.gsub(/-/,'_')
92
+ define_method(name){ val }
93
+ end
94
+
95
+ #
96
+ def options
97
+ #(class << self ; self ; end).options
98
+ self.class.options
99
+ end
100
+
101
+ # # I N I T I A L I Z E # #
102
+
103
+ # New ConfigTable
104
+ def initialize(values={})
105
+ initialize_metaconfig
106
+ initialize_defaults
107
+ initialize_environment
108
+ initialize_configfile
109
+ values.each{ |k,v| __send__("#{k}=", v) }
110
+ yeild(self) if block_given?
111
+ end
112
+
113
+ #
114
+ def initialize_metaconfig
115
+ if File.exist?(META_CONFIG_FILE)
116
+ script = File.read(META_CONFIG_FILE)
117
+ (class << self; self; end).class_eval(script)
118
+ end
119
+ end
120
+
121
+ # By default installation is to site locations, tests will
122
+ # not be run, ri documentation will not be generated, but
123
+ # the +doc/+ directory will be installed.
124
+ def initialize_defaults
125
+ self.type = 'site'
126
+ self.no_ri = true
127
+ self.no_test = true
128
+ self.no_doc = false
129
+ self.no_ext = false
130
+ #@rbdir = siterubyver #'$siterubyver'
131
+ #@sodir = siterubyverarch #'$siterubyverarch'
132
+ end
133
+
134
+ # Get configuration from environment.
135
+ def initialize_environment
136
+ options.each do |name, *args|
137
+ if value = ENV["RUBYSETUP_#{name.to_s.upcase}"]
138
+ __send__("#{name}=", value)
139
+ end
140
+ end
141
+ end
142
+
143
+ # Load configuration.
144
+ def initialize_configfile
145
+ if File.exist?(CONFIG_FILE)
146
+ erb = ERB.new(File.read(CONFIG_FILE))
147
+ txt = erb.result(binding)
148
+ dat = YAML.load(txt)
149
+ dat.each do |k, v|
150
+ next if 'type' == k
151
+ next if 'installdirs' == k
152
+ k = k.gsub('-','_')
153
+ __send__("#{k}=", v)
154
+ end
155
+ # do these last
156
+ if dat['type']
157
+ self.type = dat['type']
158
+ end
159
+ if dat['installdirs']
160
+ self.installdirs = dat['installdirs']
161
+ end
162
+ #else
163
+ # raise Error, $!.message + "\n#{File.basename($0)} config first"
164
+ end
165
+ end
166
+
167
+ #def initialize_configfile
168
+ # begin
169
+ # File.foreach(CONFIG_FILE) do |line|
170
+ # k, v = *line.split(/=/, 2)
171
+ # k.gsub!('-','_')
172
+ # __send__("#{k}=",v.strip) #self[k] = v.strip
173
+ # end
174
+ # rescue Errno::ENOENT
175
+ # raise Error, $!.message + "\n#{File.basename($0)} config first"
176
+ # end
177
+ #end
178
+
179
+ # # B A S E D I R E C T O R I E S # #
180
+
181
+ #
182
+ #def base_libruby
183
+ # "lib/ruby"
184
+ #end
185
+
186
+ # Base bin directory
187
+ def base_bindir
188
+ @base_bindir ||= subprefix('bindir')
189
+ end
190
+
191
+ # Base libdir
192
+ def base_libdir
193
+ @base_libdir ||= subprefix('libdir')
194
+ end
195
+
196
+ #
197
+ def base_datadir
198
+ @base_datadir ||= subprefix('datadir')
199
+ end
200
+
201
+ #
202
+ def base_mandir
203
+ @base_mandir ||= subprefix('mandir')
204
+ end
205
+
206
+ # NOTE: This removed the trailing <tt>$(PACKAGE)</tt>.
207
+ def base_docdir
208
+ @base_docdir || File.dirname(subprefix('docdir'))
209
+ end
210
+
211
+ #
212
+ def base_rubylibdir
213
+ @rubylibdir ||= subprefix('rubylibdir')
214
+ end
215
+
216
+ #
217
+ def base_rubyarchdir
218
+ @base_rubyarchdir ||= subprefix('archdir')
219
+ end
220
+
221
+ # Base directory for system configuration files
222
+ def base_sysconfdir
223
+ @base_sysconfdir ||= subprefix('sysconfdir')
224
+ end
225
+
226
+ # Base directory for local state data
227
+ def base_localstatedir
228
+ @base_localstatedir ||= subprefix('localstatedir')
229
+ end
230
+
231
+
232
+ # # C O N F I G U R A T I O N # #
233
+
234
+ #
235
+ def type
236
+ @type ||= 'site'
237
+ end
238
+
239
+ #
240
+ def type=(val)
241
+ @type = val
242
+ case val.to_s
243
+ when 'std', 'ruby'
244
+ @rbdir = librubyver #'$librubyver'
245
+ @sodir = librubyverarch #'$librubyverarch'
246
+ when 'site'
247
+ @rbdir = siterubyver #'$siterubyver'
248
+ @sodir = siterubyverarch #'$siterubyverarch'
249
+ when 'home'
250
+ self.prefix = File.join(home, '.local') # TODO: Use XDG
251
+ @rbdir = nil #'$libdir/ruby'
252
+ @sodir = nil #'$libdir/ruby'
253
+ #when 'local'
254
+ # rbdir = subprefix(librubyver, '')
255
+ # sodir = subprefix(librubyverarch, '')
256
+ # self.prefix = '/usr/local' # FIXME: how?
257
+ # self.rbdir = File.join(prefix, rbdir) #'$libdir/ruby'
258
+ # self.sodir = File.join(prefix, sodir) #'$libdir/ruby'
259
+ else
260
+ raise Error, "bad config: use type=(std|site|home) [#{val}]"
261
+ end
262
+ end
263
+
264
+ #
265
+ alias_method :installdirs, :type
266
+
267
+ #
268
+ alias_method :installdirs=, :type=
269
+
270
+
271
+ #
272
+ alias_method :install_prefix, :root
273
+
274
+ #
275
+ alias_method :install_prefix=, :root=
276
+
277
+
278
+ # Path prefix of target environment
279
+ def prefix
280
+ @prefix ||= RBCONFIG['prefix']
281
+ end
282
+
283
+ # Set path prefix of target environment
284
+ def prefix=(path)
285
+ @prefix = pathname(path)
286
+ end
287
+
288
+ # Directory for ruby libraries
289
+ def libruby
290
+ @libruby ||= RBCONFIG['prefix'] + "/lib/ruby"
291
+ end
292
+
293
+ # Set directory for ruby libraries
294
+ def libruby=(path)
295
+ path = pathname(path)
296
+ @librubyver = librubyver.sub(libruby, path)
297
+ @librubyverarch = librubyverarch.sub(libruby, path)
298
+ @libruby = path
299
+ end
300
+
301
+ # Directory for standard ruby libraries
302
+ def librubyver
303
+ @librubyver ||= RBCONFIG['rubylibdir']
304
+ end
305
+
306
+ # Set directory for standard ruby libraries
307
+ def librubyver=(path)
308
+ @librubyver = pathname(path)
309
+ end
310
+
311
+ # Directory for standard ruby extensions
312
+ def librubyverarch
313
+ @librubyverarch ||= RBCONFIG['archdir']
314
+ end
315
+
316
+ # Set directory for standard ruby extensions
317
+ def librubyverarch=(path)
318
+ @librubyverarch = pathname(path)
319
+ end
320
+
321
+ # Directory for version-independent aux ruby libraries
322
+ def siteruby
323
+ @siteruby ||= RBCONFIG['sitedir']
324
+ end
325
+
326
+ # Set directory for version-independent aux ruby libraries
327
+ def siteruby=(path)
328
+ path = pathname(path)
329
+ @siterubyver = siterubyver.sub(siteruby, path)
330
+ @siterubyverarch = siterubyverarch.sub(siteruby, path)
331
+ @siteruby = path
332
+ end
333
+
334
+ # Directory for aux ruby libraries
335
+ def siterubyver
336
+ @siterubyver ||= RBCONFIG['sitelibdir']
337
+ end
338
+
339
+ # Set directory for aux ruby libraries
340
+ def siterubyver=(path)
341
+ @siterubyver = pathname(path)
342
+ end
343
+
344
+ # Directory for aux ruby binary libraries
345
+ def siterubyverarch
346
+ @siterubyverarch ||= RBCONFIG['sitearchdir']
347
+ end
348
+
349
+ # Set directory for aux arch ruby binaries
350
+ def siterubyverarch=(path)
351
+ @siterubyverarch = pathname(path)
352
+ end
353
+
354
+ # Directory for commands
355
+ def bindir
356
+ @bindir || File.join(prefix, base_bindir)
357
+ end
358
+
359
+ # Set directory for commands
360
+ def bindir=(path)
361
+ @bindir = pathname(path)
362
+ end
363
+
364
+ # Directory for libraries
365
+ def libdir
366
+ @libdir || File.join(prefix, base_libdir)
367
+ end
368
+
369
+ # Set directory for libraries
370
+ def libdir=(path)
371
+ @libdir = pathname(path)
372
+ end
373
+
374
+ # Directory for shared data
375
+ def datadir
376
+ @datadir || File.join(prefix, base_datadir)
377
+ end
378
+
379
+ # Set directory for shared data
380
+ def datadir=(path)
381
+ @datadir = pathname(path)
382
+ end
383
+
384
+ # Directory for man pages
385
+ def mandir
386
+ @mandir || File.join(prefix, base_mandir)
387
+ end
388
+
389
+ # Set directory for man pages
390
+ def mandir=(path)
391
+ @mandir = pathname(path)
392
+ end
393
+
394
+ # Directory for documentation
395
+ def docdir
396
+ @docdir || File.join(prefix, base_docdir)
397
+ end
398
+
399
+ # Set directory for documentation
400
+ def docdir=(path)
401
+ @docdir = pathname(path)
402
+ end
403
+
404
+ # Directory for ruby scripts
405
+ def rbdir
406
+ @rbdir || File.join(prefix, base_rubylibdir)
407
+ end
408
+
409
+ # Directory for ruby extentions
410
+ def sodir
411
+ @sodir || File.join(prefix, base_rubyarchdir)
412
+ end
413
+
414
+ # Directory for system configuration files
415
+ # TODO: Can this be prefixed?
416
+ def sysconfdir
417
+ @sysconfdir ||= base_sysconfdir
418
+ end
419
+
420
+ # Set directory for system configuration files
421
+ def sysconfdir=(path)
422
+ @sysconfdir = pathname(path)
423
+ end
424
+
425
+ # Directory for local state data
426
+ # TODO: Can this be prefixed?
427
+ def localstatedir
428
+ @localstatedir ||= base_localstatedir
429
+ end
430
+
431
+ # Set directory for local state data
432
+ def localstatedir=(path)
433
+ @localstatedir = pathname(path)
434
+ end
435
+
436
+ #
437
+ def rubypath
438
+ #@rubypath ||= RBCONFIG['libexecdir']
439
+ @rubypath ||= File.join(RBCONFIG['bindir'], RBCONFIG['ruby_install_name'] + RBCONFIG['EXEEXT'])
440
+ end
441
+
442
+ #
443
+ def rubypath=(path)
444
+ @rubypath = pathname(path)
445
+ end
446
+
447
+ #
448
+ def rubyprog
449
+ @rubyprog || rubypath
450
+ end
451
+
452
+ #
453
+ def rubyprog=(command)
454
+ @rubyprog = command
455
+ end
456
+
457
+ # TODO: Does this handle 'nmake' on windows?
458
+ def makeprog
459
+ @makeprog ||= (
460
+ if arg = RBCONFIG['configure_args'].split.detect {|arg| /--with-make-prog=/ =~ arg }
461
+ arg.sub(/'/, '').split(/=/, 2)[1]
462
+ else
463
+ 'make'
464
+ end
465
+ )
466
+ end
467
+
468
+ #
469
+ def makeprog=(command)
470
+ @makeprog = command
471
+ end
472
+
473
+ #
474
+ def extconfopt
475
+ @extconfopt ||= ''
476
+ end
477
+
478
+ #
479
+ def extconfopt=(string)
480
+ @extconfopt = string
481
+ end
482
+
483
+ # Default is +ruby+.
484
+ def shebang
485
+ @shebang ||= 'ruby'
486
+ end
487
+
488
+ # There are three options: +all+, +ruby+, +never+.
489
+ def shebang=(val)
490
+ if %w(all ruby never).include?(val)
491
+ @shebang = val
492
+ else
493
+ raise Error, "bad config: use SHEBANG=(all|ruby|never) [#{val}]"
494
+ end
495
+ end
496
+
497
+ #
498
+ def no_ext
499
+ @no_ext
500
+ end
501
+
502
+ #
503
+ def no_ext=(val)
504
+ @no_ext = boolean(val)
505
+ end
506
+
507
+ #
508
+ def no_test
509
+ @no_test
510
+ end
511
+
512
+ #
513
+ def no_test=(val)
514
+ @no_test = boolean(val)
515
+ end
516
+
517
+ #
518
+ def no_doc
519
+ @no_doc
520
+ end
521
+
522
+ #
523
+ def no_doc=(val)
524
+ @no_doc = boolean(val)
525
+ end
526
+
527
+ #
528
+ def no_ri
529
+ @no_ri
530
+ end
531
+
532
+ #
533
+ def no_ri=(val)
534
+ @no_ri = boolean(val)
535
+ end
536
+
537
+ #def rdoc = 'no'
538
+ #def rdoctemplate = nil
539
+ #def testrunner = 'auto' # needed?
540
+
541
+ # Compile native extensions?
542
+ def compile?
543
+ !no_ext
544
+ end
545
+
546
+ # Run unit tests?
547
+ def test?
548
+ !no_test
549
+ end
550
+
551
+ # Generate ri documentation?
552
+ def ri?
553
+ !no_ri
554
+ end
555
+
556
+ # Install doc directory?
557
+ def doc?
558
+ !no_doc
559
+ end
560
+
561
+
562
+ # # C O N V E R S I O N # #
563
+
564
+ #
565
+ def to_h
566
+ h = {}
567
+ options.each do |name, *args|
568
+ h[name.to_s] = __send__(name)
569
+ end
570
+ h
571
+ end
572
+
573
+ #
574
+ def to_s
575
+ to_yaml.sub(/\A---\s*\n/,'')
576
+ end
577
+
578
+ #
579
+ def to_yaml(*args)
580
+ to_h.to_yaml(*args)
581
+ end
582
+
583
+ # Save configuration.
584
+ def save_config
585
+ out = to_yaml
586
+ if not File.exist?(File.dirname(CONFIG_FILE))
587
+ FileUtils.mkdir_p(File.dirname(CONFIG_FILE))
588
+ end
589
+ if File.exist?(CONFIG_FILE)
590
+ txt = File.read(CONFIG_FILE)
591
+ return nil if txt == out
592
+ end
593
+ File.open(CONFIG_FILE, 'w'){ |f| f << out }
594
+ true
595
+ end
596
+
597
+ # Does the configuration file exist?
598
+ def exist?
599
+ File.exist?(CONFIG_FILE)
600
+ end
601
+
602
+ #
603
+ #def show
604
+ # fmt = "%-20s %s\n"
605
+ # OPTIONS.each do |name|
606
+ # value = self[name]
607
+ # reslv = __send__(name)
608
+ # case reslv
609
+ # when String
610
+ # reslv = "(none)" if reslv.empty?
611
+ # when false, nil
612
+ # reslv = "no"
613
+ # when true
614
+ # reslv = "yes"
615
+ # end
616
+ # printf fmt, name, reslv
617
+ # end
618
+ #end
619
+
620
+ private
621
+
622
+ def pathname(path)
623
+ path.gsub(%r<\\$([^/]+)>){ self[$1] }
624
+ end
625
+
626
+ #def absolute_pathname(path)
627
+ # File.expand_path(path).gsub(%r<\\$([^/]+)>){ self[$1] }
628
+ #end
629
+
630
+ # Boolean attribute. Can be assigned true, false, nil, or
631
+ # a string matching yes|true|y|t or no|false|n|f.
632
+ def boolean(val, name=nil)
633
+ case val
634
+ when true, false, nil
635
+ val
636
+ else
637
+ case val.to_s.downcase
638
+ when 'y', 'yes', 't', 'true'
639
+ true
640
+ when 'n', 'no', 'f', 'false'
641
+ false
642
+ else
643
+ raise Error, "bad config: use --#{name}=(yes|no) [\#{val}]"
644
+ end
645
+ end
646
+ end
647
+
648
+ #
649
+ def subprefix(path, with='')
650
+ val = RBCONFIG[path]
651
+ raise "Unknown path -- #{path}" if val.nil?
652
+ prefix = Regexp.quote(RBCONFIG['prefix'])
653
+ val.sub(/\A#{prefix}/, with)
654
+ end
655
+
656
+ #
657
+ def home
658
+ ENV['HOME'] || raise(Error, 'HOME is not set.')
659
+ end
660
+
661
+ # Get unresloved attribute.
662
+ #def [](name)
663
+ # instance_variable_get("@#{name}")
664
+ #end
665
+
666
+ # Set attribute.
667
+ #def []=(name, value)
668
+ # instance_variable_set("@#{name}", value)
669
+ #end
670
+
671
+ # Resolved attribute. (for paths)
672
+ #def resolve(name)
673
+ # self[name].gsub(%r<\\$([^/]+)>){ self[$1] }
674
+ #end
675
+
676
+ end #class ConfigTable
677
+
678
+ end #module Setup
679
+
680
+
681
+
682
+
683
+
684
+
685
+
686
+
687
+ # Pathname attribute. Pathnames are automatically expanded
688
+ # unless they start with '$', a path variable.
689
+ #def self.attr_pathname(name)
690
+ # class_eval %{
691
+ # def #{name}
692
+ # @#{name}.gsub(%r<\\$([^/]+)>){ self[$1] }
693
+ # end
694
+ # def #{name}=(path)
695
+ # raise Error, "bad config: #{name.to_s.upcase} requires argument" unless path
696
+ # @#{name} = (path[0,1] == '$' ? path : File.expand_path(path))
697
+ # end
698
+ # }
699
+ #end
700
+
701
+ # List of pathnames. These are not expanded though.
702
+ #def self.attr_pathlist(name)
703
+ # class_eval %{
704
+ # def #{name}
705
+ # @#{name}
706
+ # end
707
+ # def #{name}=(pathlist)
708
+ # case pathlist
709
+ # when Array
710
+ # @#{name} = pathlist
711
+ # else
712
+ # @#{name} = pathlist.to_s.split(/[:;,]/)
713
+ # end
714
+ # end
715
+ # }
716
+ #end
717
+
718
+ # Adds boolean support.
719
+ #def self.attr_accessor(*names)
720
+ # bools, attrs = names.partition{ |name| name.to_s =~ /\?$/ }
721
+ # attr_boolean *bools
722
+ # super *attrs
723
+ #end
724
+
725
+
726
+ # # provide verbosity (default is true)
727
+ # attr_accessor :verbose?
728
+
729
+ # # don't actually write files to system
730
+ # attr_accessor :no_harm?
731
+
732
+ =begin
733
+ # Metaconfig file is '.config/setup/metaconfig{,.rb}'.
734
+ def inintialize_metaconfig
735
+ path = Dir.glob(METACONFIG_FILE).first
736
+ if path && File.file?(path)
737
+ MetaConfigEnvironment.new(self).instance_eval(File.read(path), path)
738
+ end
739
+ end
740
+
741
+ #= Meta Configuration
742
+ # This works a bit differently from 3.4.1.
743
+ # Defaults are currently not supported but remain in the method interfaces.
744
+ class MetaConfigEnvironment
745
+ def initialize(config) #, installer)
746
+ @config = config
747
+ #@installer = installer
748
+ end
749
+
750
+ #
751
+ def config_names
752
+ @config.descriptions.collect{ |n, t, d| n.to_s }
753
+ end
754
+
755
+ #
756
+ def config?(name)
757
+ @config.descriptions.find do |sym, type, desc|
758
+ sym.to_s == name.to_s
759
+ end
760
+ end
761
+
762
+ #
763
+ def bool_config?(name)
764
+ @config.descriptions.find do |sym, type, desc|
765
+ sym.to_s == name.to_s && type == :bool
766
+ end
767
+ #@config.lookup(name).config_type == 'bool'
768
+ end
769
+
770
+ #
771
+ def path_config?(name)
772
+ @config.descriptions.find do |sym, type, desc|
773
+ sym.to_s == name.to_s && type == :path
774
+ end
775
+ #@config.lookup(name).config_type == 'path'
776
+ end
777
+
778
+ #
779
+ def value_config?(name)
780
+ @config.descriptions.find do |sym, type, desc|
781
+ sym.to_s == name.to_s && type != :prog
782
+ end
783
+ #@config.lookup(name).config_type != 'exec'
784
+ end
785
+
786
+ #
787
+ def add_config(name, default, desc)
788
+ @config.descriptions << [name.to_sym, nil, desc]
789
+ #@config.add item
790
+ end
791
+
792
+ #
793
+ def add_bool_config(name, default, desc)
794
+ @config.descriptions << [name.to_sym, :bool, desc]
795
+ #@config.add BoolItem.new(name, 'yes/no', default ? 'yes' : 'no', desc)
796
+ end
797
+
798
+ #
799
+ def add_path_config(name, default, desc)
800
+ @config.descriptions << [name.to_sym, :path, desc]
801
+ #@config.add PathItem.new(name, 'path', default, desc)
802
+ end
803
+
804
+ #
805
+ def set_config_default(name, default)
806
+ @config[name] = default
807
+ end
808
+
809
+ #
810
+ def remove_config(name)
811
+ item = @config.descriptions.find do |sym, type, desc|
812
+ sym.to_s == name.to_s
813
+ end
814
+ index = @config.descriptions.index(item)
815
+ @config.descriptions.delete(index)
816
+ #@config.remove(name)
817
+ end
818
+ end
819
+ =end
820
+
821
+ # Designed to work with Ruby 1.6.3 or greater.
822
+