reap 9.3.5 → 9.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (105) hide show
  1. data/CHANGES +10 -0
  2. data/MANIFEST +37 -21
  3. data/NOTES +13 -11
  4. data/bin/reap-announce +40 -2
  5. data/bin/reap-check-load +20 -2
  6. data/bin/reap-check-syntax +20 -2
  7. data/bin/reap-clean +24 -2
  8. data/bin/reap-clobber +17 -2
  9. data/bin/reap-doc +12 -2
  10. data/bin/reap-doc-rdoc +17 -2
  11. data/bin/reap-doc-ri +16 -2
  12. data/bin/reap-doc-spec +18 -0
  13. data/bin/reap-init +9 -0
  14. data/bin/reap-inspect +20 -2
  15. data/bin/reap-install +13 -2
  16. data/bin/reap-install-gem +14 -2
  17. data/bin/reap-log +15 -2
  18. data/bin/reap-log-changes +15 -2
  19. data/bin/reap-log-notes +20 -2
  20. data/bin/reap-make +16 -2
  21. data/bin/reap-make-clean +10 -2
  22. data/bin/reap-make-distclean +18 -2
  23. data/bin/reap-make-extconf +14 -2
  24. data/bin/reap-make-static +14 -2
  25. data/bin/reap-package +25 -2
  26. data/bin/reap-package-gem +14 -2
  27. data/bin/reap-package-tgz +14 -2
  28. data/bin/reap-package-zip +14 -2
  29. data/bin/reap-prepare +21 -2
  30. data/bin/reap-publish +25 -2
  31. data/bin/reap-release +22 -2
  32. data/bin/reap-rollout +32 -2
  33. data/bin/reap-scaffold +16 -2
  34. data/bin/reap-scm-branch +13 -2
  35. data/bin/reap-scm-tag +13 -2
  36. data/bin/reap-spec +14 -2
  37. data/bin/reap-stats +21 -2
  38. data/bin/reap-test +14 -2
  39. data/bin/reap-test-cross +23 -2
  40. data/bin/reap-test-load +17 -2
  41. data/bin/reap-test-solo +19 -2
  42. data/bin/reap-uninstall +14 -2
  43. data/bin/reap-uninstall-gem +17 -2
  44. data/bin/reap-version +10 -2
  45. data/lib/reap/announcement.rb +136 -0
  46. data/lib/reap/application.rb +3 -1
  47. data/lib/reap/default.yaml +12 -12
  48. data/lib/reap/defaults.rb +49 -0
  49. data/lib/reap/emailer.rb +189 -0
  50. data/lib/reap/extensions.rb +1 -2
  51. data/lib/reap/hosts.rb +4 -0
  52. data/lib/reap/hosts/host.rb +69 -0
  53. data/lib/reap/hosts/mailinglist.rb +83 -0
  54. data/lib/reap/{systems → hosts}/rubyforge.rb +72 -60
  55. data/lib/reap/hosts/rubytalk.rb +39 -0
  56. data/lib/reap/iobject.rb +5 -3
  57. data/lib/reap/metadata.rb +31 -4
  58. data/lib/reap/project.rb +101 -41
  59. data/lib/reap/project/announce.rb +50 -180
  60. data/lib/reap/project/check.rb +1 -1
  61. data/lib/reap/project/gem.rb +32 -68
  62. data/lib/reap/project/log.rb +12 -7
  63. data/lib/reap/project/make.rb +0 -1
  64. data/lib/reap/project/package.rb +228 -75
  65. data/lib/reap/project/rdoc.rb +9 -8
  66. data/lib/reap/project/release.rb +52 -6
  67. data/lib/reap/project/scm.rb +40 -25
  68. data/lib/reap/project/spec.rb +3 -3
  69. data/lib/reap/project/test.rb +1 -2
  70. data/lib/reap/project/version.rb +18 -4
  71. data/lib/reap/runmodes.rb +24 -0
  72. data/lib/reap/settings.rb +3 -14
  73. data/lib/reap/systems.rb +4 -0
  74. data/lib/reap/systems/git.rb +0 -0
  75. data/lib/reap/systems/hg.rb +0 -0
  76. data/lib/reap/systems/{subversion.rb → svn.rb} +47 -16
  77. data/lib/reap/systems/system.rb +53 -0
  78. data/lib/reap/tool.rb +38 -0
  79. data/lib/reap/utilities.rb +43 -86
  80. data/log/{Changelog.txt → changelog.rdoc} +56 -0
  81. data/log/fixme.rdoc +25 -0
  82. data/log/todo.rdoc +85 -0
  83. data/meta/project.yaml +13 -2
  84. data/meta/version +1 -0
  85. data/setup.rb +74 -64
  86. data/task/allshare.rb +109 -0
  87. data/task/clean +13 -0
  88. data/task/compile +28 -0
  89. data/task/configure +372 -0
  90. data/task/install +1481 -0
  91. data/test/case/test_init.rb +32 -0
  92. data/test/case/test_scaffold.rb +32 -0
  93. data/test/data/scaffold/meta/project.yaml +28 -0
  94. data/test/lib/case_testable.rb +23 -0
  95. metadata +64 -31
  96. data/bin/reap-spec-doc +0 -8
  97. data/demo/README +0 -15
  98. data/demo/lib/foo/foo.rb +0 -7
  99. data/demo/meta/VERSION +0 -1
  100. data/demo/meta/project.yaml +0 -21
  101. data/lib/reap/project/rubyforge.rb +0 -71
  102. data/lib/reap/project/svn.rb +0 -76
  103. data/log/Fixme.txt +0 -22
  104. data/log/Todo.txt +0 -84
  105. data/meta/VERSION +0 -1
@@ -0,0 +1 @@
1
+ 9.4.0 beta (2008-04-02)
data/setup.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
+
2
3
  # Setup.rb v3.5.0
3
4
  # Copyright (c) 2008 Minero Aoki, Trans
4
5
  #
@@ -6,9 +7,11 @@
6
7
  # You can distribute/modify this program under the terms of
7
8
  # the GNU LGPL, Lesser General Public License version 2.1.
8
9
 
9
- # Need the package name, and whether to generate documentation.
10
- PACKAGE = File.read(Dir.glob('{.,meta/}unixname{,.txt}', File::FNM_CASEFOLD).first).strip
11
- GENERATE_RDOCS = true # package developer may need to deactivate
10
+ # Need the package name. This is used to install docs in system doc/ruby-{name}/ location.
11
+ PACKAGE_NAME = File.read(Dir.glob('{.,meta/}unixname{,.txt}', File::FNM_CASEFOLD).first).strip
12
+
13
+ # Generate rdocs? Package developer may want to deactivate this.
14
+ GENERATE_RDOC = true
12
15
 
13
16
  require 'optparse'
14
17
  require 'rbconfig'
@@ -19,6 +22,9 @@ class SetupError < StandardError; end
19
22
  #
20
23
  # $ ./setup.rb
21
24
  #
25
+ # Which is the same al
26
+ #
27
+ #
22
28
  # -- or --
23
29
  #
24
30
  # $ ./setup.rb config
@@ -33,7 +39,8 @@ class SetupError < StandardError; end
33
39
  # TODO: Make cleaning more comprehensive (?)
34
40
 
35
41
  module Setup
36
- Version = "3.5.0"
42
+
43
+ Version = "3.5.1"
37
44
 
38
45
  Copyright = "Copyright (c) 2000,2008 Minero Aoki, Trans"
39
46
 
@@ -252,6 +259,7 @@ module Setup
252
259
 
253
260
  parameterize = lambda do |path|
254
261
  val = RBCONFIG[path]
262
+ raise "Unknown path -- #{path}" if val.nil?
255
263
  val.sub(/\A#{Regexp.quote(prefix)}/, '$prefix')
256
264
  end
257
265
 
@@ -321,8 +329,15 @@ module Setup
321
329
  OPTIONS.each do |name|
322
330
  value = self[name]
323
331
  reslv = __send__(name)
324
- reslv = "(none)" if String===reslv && reslv.empty?
325
- printf fmt, name, reslv if value
332
+ case reslv
333
+ when String
334
+ reslv = "(none)" if reslv.empty?
335
+ when false, nil
336
+ reslv = "no"
337
+ when true
338
+ reslv = "yes"
339
+ end
340
+ printf fmt, name, reslv
326
341
  end
327
342
  end
328
343
 
@@ -373,15 +388,15 @@ module Setup
373
388
  [ 'config', 'saves your configurations' ],
374
389
  [ 'show', 'shows current configuration' ],
375
390
  [ 'setup', 'compiles ruby extentions and others' ],
376
- [ 'doc', 'generate html documentation' ],
377
- [ 'index', 'generate index documentation' ],
391
+ [ 'rdoc', 'generate rdoc documentation' ],
392
+ [ 'ri', 'generate ri documentation' ],
378
393
  [ 'install', 'installs files' ],
379
394
  [ 'test', 'run all tests in test/' ],
380
395
  [ 'clean', "does `make clean' for each extention" ],
381
396
  [ 'distclean',"does `make distclean' for each extention" ]
382
397
  ]
383
398
 
384
- TASKS = %w(all config show setup test install uninstall doc index clean distclean)
399
+ TASKS = %w(all config show setup test install uninstall rdoc ri clean distclean)
385
400
 
386
401
  # Configuration
387
402
  attr :config
@@ -447,11 +462,11 @@ module Setup
447
462
  desc 'Runs unit tests'
448
463
  task :test do exec_test end
449
464
 
450
- desc 'Generate html api docs'
451
- task :doc do exec_doc end
465
+ desc 'Generate rdoc documentation'
466
+ task :rdoc do exec_rdoc end
452
467
 
453
- desc 'Generate api index docs'
454
- task :index do exec_index end
468
+ desc 'Generate ri documentation'
469
+ task :ri do exec_ri end
455
470
 
456
471
  desc 'Installs files'
457
472
  task :install do exec_install end
@@ -509,8 +524,9 @@ module Setup
509
524
  def exec_all
510
525
  exec_config
511
526
  exec_setup
512
- exec_test # TODO: we need to stop here if tests fail (how?)
513
- exec_doc if GENERATE_RDOCS && !config.without_doc?
527
+ exec_test # TODO: we need to stop here if tests fail (how?)
528
+ exec_rdoc unless config.without_doc? if GENERATE_RDOC
529
+ exec_ri unless config.without_doc?
514
530
  exec_install
515
531
  end
516
532
 
@@ -706,12 +722,12 @@ module Setup
706
722
  #end
707
723
 
708
724
  #
709
- # TASK doc
725
+ # TASK rdoc
710
726
  #
711
727
 
712
- def exec_doc
713
- output = File.join('doc', PACKAGE, 'rdoc')
714
- title = (PACKAGE.capitalize + " API").strip
728
+ def exec_rdoc
729
+ output = File.join('doc', 'rdoc')
730
+ title = (PACKAGE_NAME.capitalize + " API").strip
715
731
  main = Dir.glob("README{,.txt}", File::FNM_CASEFOLD).first
716
732
  template = config.doctemplate || 'html'
717
733
 
@@ -744,57 +760,49 @@ module Setup
744
760
  end
745
761
  end
746
762
 
747
- #
748
- # TASK index
749
- #
750
- # TODO: Totally deprecate stadard ri support in favor of fastri.
763
+ # TASK ri
751
764
 
752
- def exec_index
753
- begin
754
- require 'fastri/version'
755
- fastri = true
756
- rescue LoadError
757
- fastri = false
765
+ def exec_ri
766
+ case config.installdirs
767
+ when 'std'
768
+ output = "--ri-system"
769
+ when 'site'
770
+ output = "--ri-site"
771
+ when 'home'
772
+ output = "--ri"
773
+ else
774
+ abort "bad config: sould not be possible -- installdirs = #{config.installdirs}"
758
775
  end
759
- if fastri
760
- if no_harm?
761
- $stderr.puts "fastri-server -b"
762
- else
763
- system "fastri-server -b"
764
- end
776
+
777
+ if File.exist?('.document')
778
+ files = File.read('.document').split("\n")
779
+ files.reject!{ |l| l =~ /^\s*[#]/ || l !~ /\S/ }
780
+ files.collect!{ |f| f.strip }
765
781
  else
766
- case config.installdirs
767
- when 'std'
768
- output = "--ri-system"
769
- when 'site'
770
- output = "--ri-site"
771
- when 'home'
772
- output = "--ri"
773
- else
774
- abort "bad config: sould not be possible -- installdirs = #{config.installdirs}"
775
- end
782
+ files = ["lib", "ext"]
783
+ end
776
784
 
777
- if File.exist?('.document')
778
- files = File.read('.document').split("\n")
779
- files.reject!{ |l| l =~ /^\s*[#]/ || l !~ /\S/ }
780
- files.collect!{ |f| f.strip }
781
- else
782
- files = ["lib", "ext"]
783
- end
785
+ opt = []
786
+ opt << "-U"
787
+ opt << output
788
+ opt << files
789
+ opt = opt.flatten
784
790
 
791
+ if no_harm?
792
+ puts "rdoc #{opt.join(' ').strip}"
793
+ else
794
+ # Generate in system location specified
795
+ #sh "rdoc #{opt.join(' ').strip}"
796
+ require 'rdoc/rdoc'
797
+ ::RDoc::RDoc.new.document(opt)
798
+
799
+ # Now in local directory
785
800
  opt = []
786
801
  opt << "-U"
787
- opt << output
802
+ opt << "--ri --op 'doc/ri'"
788
803
  opt << files
789
804
  opt = opt.flatten
790
-
791
- if no_harm?
792
- puts "rdoc #{opt.join(' ').strip}"
793
- else
794
- #sh "rdoc #{opt.join(' ').strip}"
795
- require 'rdoc/rdoc'
796
- ::RDoc::RDoc.new.document(opt)
797
- end
805
+ ::RDoc::RDoc.new.document(opt)
798
806
  end
799
807
  end
800
808
 
@@ -836,9 +844,11 @@ module Setup
836
844
  install_files targetfiles(), "#{config.mandir}/#{rel}", 0644
837
845
  end
838
846
 
847
+ # doc installs to directory named: "ruby-#{package}"
839
848
  def install_dir_doc(rel)
840
849
  return if config.without_doc?
841
- install_files targetfiles(), "#{config.docdir}/#{rel}", 0644
850
+ dir = "#{config.docdir}/ruby-#{PACKAGE_NAME}/#{rel}" # "#{config.docdir}/#{rel}"
851
+ install_files targetfiles(), dir, 0644
842
852
  end
843
853
 
844
854
  def install_files(list, dest, mode)
@@ -861,7 +871,7 @@ module Setup
861
871
  end
862
872
 
863
873
  def dllext
864
- RBCONFIG['DLEXT']
874
+ ConfigTable::RBCONFIG['DLEXT']
865
875
  end
866
876
 
867
877
  def targetfiles
@@ -994,7 +1004,7 @@ module Setup
994
1004
  alias distclean_dir_man noop
995
1005
 
996
1006
  def distclean_dir_doc(rel)
997
- if GENERATE_RDOCS
1007
+ if GENERATE_RDOC
998
1008
  rm_rf('rdoc') if File.directory?('rdoc')
999
1009
  end
1000
1010
  end
@@ -0,0 +1,109 @@
1
+ # Need the package name, and whether to generate documentation.
2
+ PACKAGE = File.read(Dir.glob('{.,meta/}unixname{,.txt}', File::FNM_CASEFOLD).first).strip
3
+ GENERATE_RDOCS = true # package developer may need to deactivate
4
+
5
+ require 'optparse'
6
+ require 'rbconfig'
7
+
8
+ class SetupError < StandardError; end
9
+
10
+ #
11
+
12
+ module Setup
13
+
14
+ #
15
+ # CLI runner
16
+ #
17
+
18
+ def self.run_cli(task)
19
+ opts = OptionParser.new
20
+
21
+ opts.banner = "Usage: #{File.basename($0)} [options]"
22
+
23
+ if task == 'config' or task == 'all'
24
+ opts.separator ""
25
+ opts.separator "Config options:"
26
+ Setup::ConfigTable::DESCRIPTIONS.each do |name, type, desc|
27
+ opts.on("--#{name} #{type.to_s.upcase}", desc) do |val|
28
+ ENV[name.to_s] = val.to_s
29
+ end
30
+ end
31
+ end
32
+
33
+ if task == 'install'
34
+ opts.separator ""
35
+ opts.separator "Install options:"
36
+
37
+ opts.on("--prefix PATH", "Installation prefix") do |val|
38
+ installer.install_prefix = val
39
+ end
40
+ end
41
+
42
+ if task == 'test'
43
+ opts.separator ""
44
+ opts.separator "Install options:"
45
+
46
+ opts.on("--runner TYPE", "Test runner (auto|console|gtk|gtk2|tk)") do |val|
47
+ installer.config.testrunner = val
48
+ end
49
+ end
50
+
51
+ # common options
52
+ opts.separator ""
53
+ opts.separator "General options:"
54
+
55
+ opts.on("-q", "--quiet", "Silence output") do |val|
56
+ installer.quiet = val
57
+ end
58
+
59
+ opts.on("--verbose", "Provide verbose output") do |val|
60
+ installer.verbose = val
61
+ end
62
+
63
+ opts.on("-n", "--no-write", "Do not write to disk") do |val|
64
+ installer.no_harm = !val
65
+ end
66
+
67
+ opts.on("--dryrun", "Same as --no-write") do |val|
68
+ installer.no_harm = val
69
+ end
70
+
71
+ # common options
72
+ opts.separator ""
73
+ opts.separator "Inform options:"
74
+
75
+ # Tail options (eg. commands in option form)
76
+ opts.on_tail("-h", "--help", "display this help information") do
77
+ puts Setup.help
78
+ exit
79
+ end
80
+
81
+ opts.on_tail("--version", "Show version") do
82
+ puts File.basename($0) + ' v' + Setup::Version.join('.')
83
+ exit
84
+ end
85
+
86
+ opts.on_tail("--copyright", "Show copyright") do
87
+ puts Setup::Copyright
88
+ exit
89
+ end
90
+
91
+ begin
92
+ opts.parse!(ARGV)
93
+ rescue OptionParser::InvalidOption
94
+ $stderr.puts $!.to_s.capitalize
95
+ exit 1
96
+ end
97
+
98
+ begin
99
+ installer.__send__("exec_#{task}")
100
+ rescue SetupError
101
+ raise if $DEBUG
102
+ $stderr.puts $!.message
103
+ $stderr.puts "Try 'ruby #{$0} --help' for detailed usage."
104
+ exit 1
105
+ end
106
+ end
107
+
108
+ end
109
+
@@ -0,0 +1,13 @@
1
+ require 'fileutils'
2
+
3
+ CLEAN = ['**/*.o', '**/*.bak']
4
+
5
+ def clean
6
+ fu = ARGV.include?('--dryrun') ? FileUtils::DryRun : FileUtils
7
+ CLEAN.each do |glob|
8
+ Dir[glob].each do |path|
9
+ fu.rm_rf(path)
10
+ end
11
+ end
12
+ end
13
+
@@ -0,0 +1,28 @@
1
+ module Setup
2
+
3
+ def self.compile
4
+ makefiles = Dir['ext/**/Makefile')
5
+ makefiles.each do |makefile|
6
+ cd File.dirname(extconf) do
7
+ system "make"
8
+ end
9
+ end
10
+ end
11
+
12
+ end
13
+
14
+
15
+ #
16
+ # Runners
17
+ #
18
+
19
+ if $0 == __FILE__
20
+
21
+ Setup::ConfigTable.run_cli(:compile)
22
+
23
+ elsif defined?(Rake)
24
+
25
+ Setup::ConfigTable.run_rake
26
+
27
+ end
28
+
@@ -0,0 +1,372 @@
1
+ #!/usr/bin/env ruby
2
+ # Setup.rb v3.5.0
3
+ # Copyright (c) 2008 Minero Aoki, Trans
4
+ #
5
+ # This program is free software.
6
+ # You can distribute/modify this program under the terms of
7
+ # the GNU LGPL, Lesser General Public License version 2.1.
8
+
9
+ require File.dirname(__FILE__) + "/common.rb"
10
+
11
+ # Typical installation procedure:
12
+ #
13
+ # $ ./setup.rb
14
+ #
15
+ # -- or --
16
+ #
17
+ # $ ./setup.rb config
18
+ # $ ./setup.rb setup
19
+ # $ ./setup.rb install
20
+ #
21
+ # @all@ and @install@ may require root privileges.
22
+ #
23
+ # This update only works with Ruby 1.6.3 and above.
24
+ #
25
+ # TODO: Update shebangs on install of binaries.
26
+ # TODO: Make cleaning more comprehensive (?)
27
+
28
+ module Setup
29
+
30
+ # ConfigTable stores platform information.
31
+
32
+ class ConfigTable
33
+
34
+ RBCONFIG = ::Config::CONFIG
35
+
36
+ CONFIGFILE = '.config'
37
+
38
+ DESCRIPTIONS = [
39
+ [:prefix , :path, 'path prefix of target environment'],
40
+ [:bindir , :path, 'directory for commands'],
41
+ [:libdir , :path, 'directory for libraries'],
42
+ [:datadir , :path, 'directory for shared data'],
43
+ [:mandir , :path, 'directory for man pages'],
44
+ [:docdir , :path, 'Directory for documentation'],
45
+ [:sysconfdir , :path, 'directory for system configuration files'],
46
+ [:localstatedir , :path, 'directory for local state data'],
47
+ [:libruby , :path, 'directory for ruby libraries'],
48
+ [:librubyver , :path, 'directory for standard ruby libraries'],
49
+ [:librubyverarch , :path, 'directory for standard ruby extensions'],
50
+ [:siteruby , :path, 'directory for version-independent aux ruby libraries'],
51
+ [:siterubyver , :path, 'directory for aux ruby libraries'],
52
+ [:siterubyverarch , :path, 'directory for aux ruby binaries'],
53
+ [:rbdir , :path, 'directory for ruby scripts'],
54
+ [:sodir , :path, 'directory for ruby extentions'],
55
+ [:rubypath , :prog, 'path to set to #! line'],
56
+ [:rubyprog , :prog, 'ruby program using for installation'],
57
+ [:makeprog , :prog, 'make program to compile ruby extentions'],
58
+ [:extconfopt , :name, 'options to pass-thru to extconf.rb'],
59
+ [:without_ext , :bool, 'do not compile/install ruby extentions'],
60
+ [:without_doc , :bool, 'do not generate html documentation'],
61
+ [:shebang , :pick, 'shebang line (#!) editing mode (all,ruby,never)'],
62
+ [:doctemplate , :pick, 'document template to use (html|xml)'],
63
+ [:testrunner , :pick, 'Runner to use for testing (auto|console|tk|gtk|gtk2)'],
64
+ [:installdirs , :pick, 'install location mode (std,site,home :: libruby,site_ruby,$HOME)']
65
+ ]
66
+
67
+ # List of configurable options.
68
+ OPTIONS = DESCRIPTIONS.collect{ |(k,t,v)| k.to_s }
69
+
70
+ # Pathname attribute. Pathnames are automatically expanded
71
+ # unless they start with '$', a path variable.
72
+ def self.attr_pathname(name)
73
+ class_eval %{
74
+ def #{name}
75
+ @#{name}.gsub(%r<\\$([^/]+)>){ self[$1] }
76
+ end
77
+ def #{name}=(path)
78
+ raise SetupError, "bad config: #{name.to_s.upcase} requires argument" unless path
79
+ @#{name} = (path[0,1] == '$' ? path : File.expand_path(path))
80
+ end
81
+ }
82
+ end
83
+
84
+ # List of pathnames. These are not expanded though.
85
+ def self.attr_pathlist(name)
86
+ class_eval %{
87
+ def #{name}
88
+ @#{name}
89
+ end
90
+ def #{name}=(pathlist)
91
+ case pathlist
92
+ when Array
93
+ @#{name} = pathlist
94
+ else
95
+ @#{name} = pathlist.to_s.split(/[:;,]/)
96
+ end
97
+ end
98
+ }
99
+ end
100
+
101
+ # Adds boolean support.
102
+ def self.attr_accessor(*names)
103
+ bools, attrs = names.partition{ |name| name.to_s =~ /\?$/ }
104
+ attr_boolean *bools
105
+ super *attrs
106
+ end
107
+
108
+ # Boolean attribute. Can be assigned true, false, nil, or
109
+ # a string matching yes|true|y|t or no|false|n|f.
110
+ def self.attr_boolean(*names)
111
+ names.each do |name|
112
+ name = name.to_s.chomp('?')
113
+ attr_reader name # MAYBE: Deprecate
114
+ code = %{
115
+ def #{name}?; @#{name}; end
116
+ def #{name}=(val)
117
+ case val
118
+ when true, false, nil
119
+ @#{name} = val
120
+ else
121
+ case val.to_s.downcase
122
+ when 'y', 'yes', 't', 'true'
123
+ @#{name} = true
124
+ when 'n', 'no', 'f', 'false'
125
+ @#{name} = false
126
+ else
127
+ raise SetupError, "bad config: use #{name.upcase}=(yes|no) [\#{val}]"
128
+ end
129
+ end
130
+ end
131
+ }
132
+ class_eval code
133
+ end
134
+ end
135
+
136
+ DESCRIPTIONS.each do |k,t,d|
137
+ case t
138
+ when :path
139
+ attr_pathname k
140
+ when :bool
141
+ attr_boolean k
142
+ else
143
+ attr_accessor k
144
+ end
145
+ end
146
+
147
+ # # provide verbosity (default is true)
148
+ # attr_accessor :verbose?
149
+
150
+ # # don't actually write files to system
151
+ # attr_accessor :no_harm?
152
+
153
+ # shebang has only three options.
154
+ def shebang=(val)
155
+ if %w(all ruby never).include?(val)
156
+ @shebang = val
157
+ else
158
+ raise SetupError, "bad config: use SHEBANG=(all|ruby|never) [#{val}]"
159
+ end
160
+ end
161
+
162
+ # installdirs has only three options; and it has side-effects.
163
+ def installdirs=(val)
164
+ @installdirs = val
165
+ case val.to_s
166
+ when 'std'
167
+ self.rbdir = '$librubyver'
168
+ self.sodir = '$librubyverarch'
169
+ when 'site'
170
+ self.rbdir = '$siterubyver'
171
+ self.sodir = '$siterubyverarch'
172
+ when 'home'
173
+ raise SetupError, 'HOME is not set.' unless ENV['HOME']
174
+ self.prefix = ENV['HOME']
175
+ self.rbdir = '$libdir/ruby'
176
+ self.sodir = '$libdir/ruby'
177
+ else
178
+ raise SetupError, "bad config: use INSTALLDIRS=(std|site|home|local) [#{val}]"
179
+ end
180
+ end
181
+
182
+ # New ConfigTable
183
+ def initialize(values=nil)
184
+ initialize_defaults
185
+ if values
186
+ values.each{ |k,v| __send__("#{k}=", v) }
187
+ end
188
+ yeild(self) if block_given?
189
+ load_config if File.file?(CONFIGFILE)
190
+ end
191
+
192
+ # Assign CONFIG defaults
193
+ #
194
+ # TODO: Does this handle 'nmake' on windows?
195
+ def initialize_defaults
196
+ prefix = RBCONFIG['prefix']
197
+
198
+ rubypath = File.join(RBCONFIG['bindir'], RBCONFIG['ruby_install_name'] + RBCONFIG['EXEEXT'])
199
+
200
+ major = RBCONFIG['MAJOR'].to_i
201
+ minor = RBCONFIG['MINOR'].to_i
202
+ teeny = RBCONFIG['TEENY'].to_i
203
+ version = "#{major}.#{minor}"
204
+
205
+ # ruby ver. >= 1.4.4?
206
+ newpath_p = ((major >= 2) or
207
+ ((major == 1) and
208
+ ((minor >= 5) or
209
+ ((minor == 4) and (teeny >= 4)))))
210
+
211
+ if RBCONFIG['rubylibdir']
212
+ # V > 1.6.3
213
+ libruby = "#{prefix}/lib/ruby"
214
+ librubyver = RBCONFIG['rubylibdir']
215
+ librubyverarch = RBCONFIG['archdir']
216
+ siteruby = RBCONFIG['sitedir']
217
+ siterubyver = RBCONFIG['sitelibdir']
218
+ siterubyverarch = RBCONFIG['sitearchdir']
219
+ elsif newpath_p
220
+ # 1.4.4 <= V <= 1.6.3
221
+ libruby = "#{prefix}/lib/ruby"
222
+ librubyver = "#{prefix}/lib/ruby/#{version}"
223
+ librubyverarch = "#{prefix}/lib/ruby/#{version}/#{c['arch']}"
224
+ siteruby = RBCONFIG['sitedir']
225
+ siterubyver = "$siteruby/#{version}"
226
+ siterubyverarch = "$siterubyver/#{RBCONFIG['arch']}"
227
+ else
228
+ # V < 1.4.4
229
+ libruby = "#{prefix}/lib/ruby"
230
+ librubyver = "#{prefix}/lib/ruby/#{version}"
231
+ librubyverarch = "#{prefix}/lib/ruby/#{version}/#{c['arch']}"
232
+ siteruby = "#{prefix}/lib/ruby/#{version}/site_ruby"
233
+ siterubyver = siteruby
234
+ siterubyverarch = "$siterubyver/#{RBCONFIG['arch']}"
235
+ end
236
+
237
+ if arg = RBCONFIG['configure_args'].split.detect {|arg| /--with-make-prog=/ =~ arg }
238
+ makeprog = arg.sub(/'/, '').split(/=/, 2)[1]
239
+ else
240
+ makeprog = 'make'
241
+ end
242
+
243
+ parameterize = lambda do |path|
244
+ val = RBCONFIG[path]
245
+ val.sub(/\A#{Regexp.quote(prefix)}/, '$prefix')
246
+ end
247
+
248
+ self.prefix = prefix
249
+ self.bindir = parameterize['bindir']
250
+ self.libdir = parameterize['libdir']
251
+ self.datadir = parameterize['datadir']
252
+ self.mandir = parameterize['mandir']
253
+ self.docdir = File.dirname(parameterize['docdir']) # b/c of trailing $(PACKAGE)
254
+ self.sysconfdir = parameterize['sysconfdir']
255
+ self.localstatedir = parameterize['localstatedir']
256
+ self.libruby = libruby
257
+ self.librubyver = librubyver
258
+ self.librubyverarch = librubyverarch
259
+ self.siteruby = siteruby
260
+ self.siterubyver = siterubyver
261
+ self.siterubyverarch = siterubyverarch
262
+ self.rbdir = '$siterubyver'
263
+ self.sodir = '$siterubyverarch'
264
+ self.rubypath = rubypath
265
+ self.rubyprog = rubypath
266
+ self.makeprog = makeprog
267
+ self.extconfopt = ''
268
+ self.shebang = 'ruby'
269
+ self.without_ext = 'no'
270
+ self.without_doc = 'yes'
271
+ self.doctemplate = 'html'
272
+ self.testrunner = 'auto'
273
+ self.installdirs = 'site'
274
+ end
275
+
276
+ # Get configuration from environment.
277
+ def env_config
278
+ OPTIONS.each do |name|
279
+ if value = ENV[name]
280
+ __send__("#{name}=",value)
281
+ end
282
+ end
283
+ end
284
+
285
+ # Load configuration.
286
+ def load_config
287
+ #if File.file?(CONFIGFILE)
288
+ begin
289
+ File.foreach(CONFIGFILE) do |line|
290
+ k, v = *line.split(/=/, 2)
291
+ __send__("#{k}=",v.strip) #self[k] = v.strip
292
+ end
293
+ rescue Errno::ENOENT
294
+ raise SetupError, $!.message + "\n#{File.basename($0)} config first"
295
+ end
296
+ #end
297
+ end
298
+
299
+ # Save configuration.
300
+ def save_config
301
+ File.open(CONFIGFILE, 'w') do |f|
302
+ OPTIONS.each do |name|
303
+ val = self[name]
304
+ f << "#{name}=#{val}\n"
305
+ end
306
+ end
307
+ end
308
+
309
+ def show
310
+ fmt = "%-20s %s\n"
311
+ OPTIONS.each do |name|
312
+ value = self[name]
313
+ reslv = __send__(name)
314
+ case reslv
315
+ when String
316
+ reslv = "(none)" if reslv.empty?
317
+ when false, nil
318
+ reslv = "no"
319
+ when true
320
+ reslv = "yes"
321
+ end
322
+ printf fmt, name, reslv
323
+ end
324
+ end
325
+
326
+ #
327
+
328
+ def extconfs
329
+ @extconfs ||= Dir['ext/**/extconf.rb']
330
+ end
331
+
332
+ def extensions
333
+ @extensions ||= extconfs.collect{ |f| File.dirname(f) }
334
+ end
335
+
336
+ def compiles?
337
+ !extensions.empty?
338
+ end
339
+
340
+ private
341
+
342
+ # Get unresloved attribute.
343
+ def [](name)
344
+ instance_variable_get("@#{name}")
345
+ end
346
+
347
+ # Set attribute.
348
+ def []=(name, value)
349
+ instance_variable_set("@#{name}", value)
350
+ end
351
+
352
+ # Resolved attribute. (for paths)
353
+ #def resolve(name)
354
+ # self[name].gsub(%r<\\$([^/]+)>){ self[$1] }
355
+ #end
356
+
357
+ end
358
+
359
+ end
360
+
361
+
362
+
363
+ #
364
+ # Runners
365
+ #
366
+
367
+ if $0 == __FILE__
368
+ Setup::ConfigTable.run_cli
369
+ elsif defined?(Rake)
370
+ Setup::ConfigTable.run_rake
371
+ end
372
+