reap 9.3.1 → 9.3.3

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/CHANGES CHANGED
@@ -1,7 +1,7 @@
1
- === 9.3.0 // 2008-02-18
1
+ === 9.3.2 // 2008-02-18
2
2
 
3
- * Create "Uber" Rakefile for end-users to use to install projects.
4
- * The Rakfile is based on parts of setup.rb, and will be increasingly rakified over time.
3
+ * Renamed reap-stamp to reap-version.
4
+ * Using new setup.rb (3.5.0) which links to the Rakefile.
5
5
 
6
6
  === 9.1.2 // 2008-02-04
7
7
 
data/MANIFEST CHANGED
@@ -10,6 +10,7 @@ test/unit/lib/reap/extensions/test_array.rb
10
10
  NOTES
11
11
  CHANGES
12
12
  README
13
+ setup.rb
13
14
  meta
14
15
  meta/project.yaml
15
16
  meta/unixname
@@ -52,6 +53,7 @@ lib/reap/project/make.rb
52
53
  lib/reap/project/log.rb
53
54
  lib/reap/project/test.rb
54
55
  lib/reap/project/site.rb
56
+ lib/reap/project/version.rb
55
57
  lib/reap/project/rubyforge.rb
56
58
  lib/reap/project/html.rb
57
59
  lib/reap/project/stats.rb
@@ -60,7 +62,6 @@ lib/reap/project/scaffold.rb
60
62
  lib/reap/project/clean.rb
61
63
  lib/reap/project/publish.rb
62
64
  lib/reap/project/spec.rb
63
- lib/reap/project/stamp.rb
64
65
  lib/reap/project/svn.rb
65
66
  lib/reap/project/scm.rb
66
67
  lib/reap/project/package.rb
@@ -81,6 +82,7 @@ data/reap/base/test/template.rb
81
82
  data/reap/base/NOTES
82
83
  data/reap/base/CHANGES
83
84
  data/reap/base/README.erb
85
+ data/reap/base/setup.rb
84
86
  data/reap/base/meta
85
87
  data/reap/base/meta/unixname.erb
86
88
  data/reap/base/lib
@@ -99,6 +101,7 @@ bin/reap-log
99
101
  bin/reap-test-cross
100
102
  bin/reap-check-syntax
101
103
  bin/reap-make-static
104
+ bin/reap-version
102
105
  bin/reap-make-distclean
103
106
  bin/reap-clobber
104
107
  bin/reap-install-gem
@@ -113,7 +116,6 @@ bin/reap-rollout
113
116
  bin/reap-spec
114
117
  bin/reap-prepare
115
118
  bin/reap-test-load
116
- bin/reap-stamp
117
119
  bin/reap-announce
118
120
  bin/reap-test
119
121
  bin/reap-clean
data/Rakefile CHANGED
@@ -1,1496 +1,2 @@
1
- #!/usr/bin/env ruby
2
- require 'optparse'
3
- require 'rbconfig'
4
-
5
- # TODO: Is this the best way to do this? Is there any other way?
6
- PACKAGE = (
7
- if file = Dir['{.,meta/}unixname{,.txt}'].first
8
- File.read(file).strip
9
- else
10
- abort "Requires package unix-name. Edit .unixname or meta/unixname."
11
- end
12
- )
13
- GENERATE_DOCS = true # TODO: maybe just check if it already exists instead?
14
-
15
- # UberTask defines all the tasks one needs for the typical end-user
16
- # to configure, compile, test and install a package to their system.
17
-
18
- class UberTask
19
-
20
- attr_accessor :package
21
- attr_accessor :gendocs
22
-
23
- attr :config
24
-
25
- #
26
- def initialize(package_name, generate_docs=true) #:yield:
27
- @package = package_name
28
- @gendocs = generate_docs
29
- @config = Configure.new
30
- yield[self] if block_given?
31
- define
32
- end
33
-
34
- #
35
- def define
36
- # Default task will compile and test.
37
-
38
- task :default => [:setup, :test]
39
-
40
- #
41
- # TASK config
42
- #
43
-
44
- desc "Configure for your system."
45
- task :config => [:config_load] do
46
- config.quiet = Rake.application.options.silent
47
- config.exec_config
48
- end
49
-
50
- if File.exist?(Configure::FILENAME)
51
- desc "Reconfigure for your system."
52
- task :reconfig do
53
- config.quiet = Rake.application.options.silent
54
- config.exec_config
55
- end
56
- end
57
-
58
- #
59
-
60
- task :config_load do
61
- if File.file?('.config')
62
- config.load
63
- else
64
- abort "Run rake config first."
65
- end
66
- end
67
-
68
- #
69
- # TASK show
70
- #
71
-
72
- desc "Display current configuraiton."
73
- task :show do
74
- config.show
75
- end
76
-
77
- #
78
- # TASK clean & clobber
79
- #
80
-
81
- require 'rake/clean'
82
-
83
- CLOBBER.include(Configure::FILENAME)
84
- CLOBBER.include(Installer::MANIFEST)
85
- CLOBBER.include(File.join('doc', PACKAGE, 'rdoc')) if GENERATE_DOCS
86
-
87
- task :clean => [:makeclean]
88
- task :clobber => [:distclean]
89
-
90
- task :makeclean do
91
- config.extensions.each do |dir|
92
- Dir.chdir(dir) do
93
- config.make 'clean' if File.file?('Makefile')
94
- end
95
- end
96
- end
97
-
98
- task :distclean do
99
- config.extensions.each do |dir|
100
- Dir.chdir(dir) do
101
- config.make 'distclean' if File.file?('Makefile')
102
- end
103
- end
104
- end
105
-
106
- #
107
- # TASK all
108
- #
109
-
110
- if File.exist?('.config')
111
- desc "Setup, test, document and install."
112
- task :all => [:setup, :test, :doc, :index, :install]
113
- else
114
- # shortcut
115
- desc "Configure, setup, test, document and install."
116
- task :all => [:config, :setup, :test, :doc, :install]
117
- end
118
-
119
- #
120
- # TASK setup
121
- #
122
-
123
- # TODO: No shebang until it works at install time and doesn't overwrite the repo scripts.
124
-
125
- desc "Compile extensions." # update shebangs
126
- task :setup => [:config_load, :extconf, :make] #, :shebang]
127
-
128
- task :extconf => [:config_load] do
129
- config.extensions.each do |dir|
130
- next if File.file?(File.join(dir, 'Makefile'))
131
- Dir.chdir(dir) do
132
- config.ruby('extconf.rb', config.configopt)
133
- end
134
- end
135
- end
136
-
137
- task :make => [:config_load] do
138
- config.extensions.each do |dir|
139
- Dir.chdir(dir) do
140
- config.make
141
- end
142
- end
143
- end
144
-
145
- task :shebang => [:config_load, :installer] do
146
- Dir.chdir('bin') do
147
- executables = Dir['*'].select{ |f| File.file?(f) }
148
- executables.each do |file|
149
- INSTALLER.update_shebang_line(file)
150
- end
151
- end
152
- end
153
-
154
- #
155
- # TASK test
156
- #
157
-
158
- # You can provide a test/suite.rb file to be run if
159
- # by the testrb command, if you special testing requirements.
160
-
161
- desc "Run unit tests."
162
- task :test => [:config_load, :setup] do
163
- runner = config.testrunner
164
- # build testrb options
165
- opt = []
166
- opt << " -v" if verbose?
167
- opt << " --runner #{runner}"
168
- if File.file?('test/suite.rb')
169
- notests = false
170
- opt << "test/suite.rb"
171
- else
172
- notests = Dir["test/**/*.rb"].empty?
173
- lib = ["lib"] + config.extensions.collect{ |d| File.dirname(d) }
174
- opt << "-I" + lib.join(':')
175
- opt << Dir["test/**/{test,tc}*.rb"]
176
- end
177
- opt = opt.flatten.join(' ').strip
178
- # run tests
179
- if notests
180
- $stderr.puts 'No tests.' #if verbose?
181
- else
182
- cmd = "testrb #{opt}"
183
- $stderr.puts cmd if verbose?
184
- system cmd #config.ruby "-S tesrb", opt
185
- end
186
- end
187
-
188
- #
189
- # TASK doc
190
- #
191
-
192
- # If a .document file is available, it will be
193
- # used to compile the list of toplevel files
194
- # to document. (For some reason it doesn't use
195
- # the .document file on it's own.)
196
- #
197
- # Note that this places the rdoc in doc/name/rdoc,
198
- # So that they are subsequently installed to your
199
- # system by the installer. To prevent this use
200
- # the @without_doc@ config option.
201
-
202
- if GENERATE_DOCS
203
- desc "Generate html docs."
204
- task :doc => [:config_load] do
205
- output = File.join('doc', PACKAGE, 'rdoc')
206
- title = (PACKAGE.capitalize + " API").strip
207
- main = Dir.glob("README{,.txt}", File::FNM_CASEFOLD).first
208
- template = config.rdoctemplate || 'html'
209
-
210
- opt = []
211
- opt << "-U"
212
- opt << "-S"
213
- opt << "--op=#{output}"
214
- opt << "--template=#{template}"
215
- opt << "--title=#{title}"
216
- opt << "--main=#{main}" if main
217
-
218
- if File.exist?('.document')
219
- files = File.read('.document').split("\n")
220
- files.reject!{ |l| l =~ /^\s*[#]/ || l !~ /\S/ }
221
- files.collect!{ |f| f.strip }
222
- opt << files
223
- else
224
- opt << main if main
225
- opt << ["lib", "ext"]
226
- end
227
-
228
- opt = opt.flatten
229
-
230
- if no_harm?
231
- puts "rdoc #{opt.join(' ').strip}"
232
- else
233
- #sh "rdoc {opt.join(' ').strip}"
234
- require 'rdoc/rdoc'
235
- ::RDoc::RDoc.new.document(opt)
236
- end
237
- end
238
- else
239
- task :doc do
240
- end
241
- end
242
-
243
- #
244
- # TASK index
245
- #
246
-
247
- # This task generates and installs the ri docs to
248
- # the designated installdirs-based location.
249
- #
250
- # It is unfortunate that this isn't more like rdocing.
251
- # In that we can't first generate them, then install them.
252
- # We have to do it all at once. We may be able to fix this
253
- # later, but it requires special action by the installer,
254
- # so it will have to wait.
255
-
256
- desc "Generate and install index docs."
257
- task :index => [:config_load] do
258
- case config.installdirs
259
- when 'std'
260
- output = "--ri-system"
261
- when 'site'
262
- output = "--ri-site"
263
- when 'home'
264
- output = "--ri"
265
- else
266
- abort "bad config: sould not be possible -- installdirs = #{config.installdirs}"
267
- end
268
-
269
- opt = []
270
-
271
- if File.exist?('.document')
272
- files = File.read('.document').split("\n")
273
- files.reject!{ |l| l =~ /^\s*[#]/ || l !~ /\S/ }
274
- files.collect!{ |f| f.strip }
275
- opt << files
276
- else
277
- opt << ["lib", "ext"]
278
- end
279
-
280
- opt << "-U"
281
- opt << output
282
- opt << files
283
- opt = opt.flatten
284
-
285
- if no_harm?
286
- puts "rdoc #{opt.join(' ').strip}"
287
- else
288
- #sh "rdoc #{opt.join(' ').strip}"
289
- require 'rdoc/rdoc'
290
- ::RDoc::RDoc.new.document(opt)
291
- end
292
- end
293
-
294
- #
295
- # TASK install & uninstall
296
- #
297
-
298
- # Install uses the installation procedures developed by Minero Aoki
299
- # for setup.rb. Over time it would be nice to "rakeify" these. Every
300
- # file installed is listed in the install manifest (.installedfiles).
301
- #
302
- # The uninstall task simply reads the install manifest, and removes
303
- # the files listed there from your system. Note, when you use the
304
- # clobber task, this file is removed. So be sure not to clobber,
305
- # if you pan to uninstall!
306
- #
307
- # TODO: Maybe the install manifest should never be clobber, expect
308
- # after an uninstall?
309
-
310
- desc "Install package files."
311
- task :install => [:config_load, :setup, :installer] do
312
- @installer.exec_install
313
- unless config.without_index?
314
- Rake::Task[:index].invoke
315
- end
316
- end
317
-
318
- if Installer.uninstallable?
319
- desc "Remove previously installed files."
320
- task :uninstall => [:confg_load, :installer] do
321
- @installer.exec_uninstall
322
- end
323
- end
324
-
325
- task :installer do
326
- @installer = Installer.new(config)
327
- @installer.verbose = env('verbose')
328
- @installer.no_harm = env('noharm')
329
- end
330
-
331
- #
332
- # TASK help
333
- #
334
-
335
- # Yea, we all need help some times ;)
336
-
337
- desc "Display config help information."
338
- task :help do
339
- puts Configure::HELP
340
- end
341
- end
342
-
343
- # Get environament variables.
344
-
345
- def env(*keys)
346
- key = keys.find{ |k| ENV[k.to_s] || ENV[k.to_s.downcase] || ENV[k.to_s.upcase] }
347
- ENV[key] if key
348
- end
349
-
350
- def verbose?
351
- env('verbose')
352
- end
353
-
354
- def no_harm?
355
- env('noharm','nowrite')
356
- end
357
-
358
- end
359
-
360
- # Configure class is used to generate the .config file
361
- # contining the settings used for installing a package.
362
- # These settings can be altered by the user if required
363
- # for their particular system, either via the command line
364
- # or environment variables.
365
-
366
- class Configure
367
-
368
- Version = [1,0,0]
369
- Copyright = "Copyright (c) 2008 Trans"
370
-
371
- Error = Class.new(StandardError)
372
-
373
- RBCONFIG = ::Config::CONFIG
374
- FILENAME = '.config'
375
-
376
- DESCRIPTIONS = [
377
- [:prefix , 'Path prefix of target environment'],
378
- [:bindir , 'Directory for commands'],
379
- [:libdir , 'Directory for libraries'],
380
- [:datadir , 'Directory for shared data'],
381
- [:mandir , 'Directory for man pages'],
382
- [:docdir , 'Directory for documentation'],
383
- [:sysconfdir , 'Directory for system configuration files'],
384
- [:localstatedir , 'Directory for local state data'],
385
- [:libruby , 'Directory for ruby libraries'],
386
- [:librubyver , 'Directory for standard ruby libraries'],
387
- [:librubyverarch , 'Directory for standard ruby extensions'],
388
- [:siteruby , 'Directory for version-independent aux ruby libraries'],
389
- [:siterubyver , 'Directory for aux ruby libraries'],
390
- [:siterubyverarch , 'Directory for aux ruby binaries'],
391
- [:rbdir , 'Directory for ruby scripts'],
392
- [:sodir , 'Directory for ruby extentions'],
393
- [:rubypath , 'Path to set to #! line'],
394
- [:rubyprog , 'Ruby program using for installation'],
395
- [:makeprog , 'Make program to compile ruby extentions'],
396
- [:without_ext , 'Do not compile/install ruby extentions'],
397
- [:without_doc , 'Do not install docs'],
398
- [:without_index , 'Do not generate ri docs'],
399
- [:shebang , 'Shebang line (#!) editing mode (all,ruby,never)'],
400
- [:installdirs , 'Install location mode (std,site,home)'],
401
- [:testrunner , 'Runner to use for testing (console|tk|gtk|gtk2)'],
402
- [:rdoctemplate , 'Document template to use (html)']
403
- ]
404
-
405
- # List of configurable options.
406
- OPTIONS = DESCRIPTIONS.collect{ |(k,v)| k.to_s }
407
-
408
- # Pathname attribute. Pathnames are automatically expanded
409
- # unless they start with '$', a path variable.
410
- def self.attr_pathname(name)
411
- class_eval %{
412
- def #{name}
413
- @#{name}.gsub(%r<\\$([^/]+)>){ self[$1] }
414
- end
415
- def #{name}=(path)
416
- raise Error, "bad config: #{name.to_s.upcase} requires argument" unless path
417
- @#{name} = (path[0,1] == '$' ? path : File.expand_path(path))
418
- end
419
- }
420
- end
421
-
422
- # List of pathnames. These are not expanded though.
423
- def self.attr_pathlist(name)
424
- class_eval %{
425
- def #{name}
426
- @#{name}
427
- end
428
- def #{name}=(pathlist)
429
- case pathlist
430
- when Array
431
- @#{name} = pathlist
432
- else
433
- @#{name} = pathlist.to_s.split(/[:;,]/)
434
- end
435
- end
436
- }
437
- end
438
-
439
- # Adds boolean support.
440
- def self.attr_accessor(*names)
441
- bools, attrs = names.partition{ |name| name.to_s =~ /\?$/ }
442
- attr_boolean *bools
443
- super *attrs
444
- end
445
-
446
- # Boolean attribute. Can be assigned true, false, nil, or
447
- # a string matching yes|true|y|t or no|false|n|f.
448
- def self.attr_boolean(*names)
449
- names.each do |name|
450
- name = name.to_s.chomp('?')
451
- attr_reader name # MAYBE: Deprecate
452
- code = %{
453
- def #{name}?; @#{name}; end
454
- def #{name}=(val)
455
- case val
456
- when true, false, nil
457
- @#{name} = val
458
- else
459
- case val.to_s.downcase
460
- when 'y', 'yes', 't', 'true'
461
- @#{name} = true
462
- when 'n', 'no', 'f', 'false'
463
- @#{name} = false
464
- else
465
- raise Error, "bad config: use #{name.upcase}=(yes|no) [\#{val}]"
466
- end
467
- end
468
- end
469
- }
470
- class_eval code
471
- end
472
- end
473
-
474
- # path prefix of target environment
475
- attr_pathname :prefix
476
-
477
- # directory for commands
478
- attr_pathname :bindir
479
-
480
- #directory for libraries
481
- attr_pathname :libdir
482
-
483
- # directory for shared data
484
- attr_pathname :datadir
485
-
486
- # directory for man pages
487
- attr_pathname :mandir
488
-
489
- # directory for documentation
490
- attr_pathname :docdir
491
-
492
- # directory for system configuration files
493
- attr_pathname :sysconfdir
494
-
495
- # directory for local state data
496
- attr_pathname :localstatedir
497
-
498
- # directory for ruby libraries
499
- attr_pathname :libruby
500
-
501
- # directory for standard ruby libraries
502
- attr_pathname :librubyver
503
-
504
- # directory for standard ruby extensions
505
- attr_pathname :librubyverarch
506
-
507
- # directory for version-independent aux ruby libraries
508
- attr_pathname :siteruby
509
-
510
- # directory for aux ruby libraries
511
- attr_pathname :siterubyver
512
-
513
- # directory for aux ruby binaries
514
- attr_pathname :siterubyverarch
515
-
516
- # directory for ruby scripts
517
- attr_pathname :rbdir
518
-
519
- # directory for ruby extentions
520
- attr_pathname :sodir
521
-
522
- # path to set to #! line
523
- attr_accessor :rubypath
524
-
525
- # ruby program using for installation
526
- attr_accessor :rubyprog
527
-
528
- # program to compile ruby extentions
529
- attr_accessor :makeprog
530
-
531
- # shebang line (#!) editing mode (all,ruby,never)', 'all/ruby/never
532
- attr_accessor :shebang
533
-
534
- # install location mode (std: libruby, site: site_ruby, home: $HOME)
535
- attr_accessor :installdirs
536
-
537
- # options to pass to extconfig.rb
538
- attr_accessor :configopt
539
-
540
- # do not compile/install ruby extentions
541
- attr_accessor :without_ext?
542
-
543
- # do not compile/install ruby extentions
544
- attr_accessor :without_doc?
545
-
546
- # do not compile/install ruby extentions
547
- attr_accessor :without_index?
548
-
549
- # document template to use [html]
550
- attr_accessor :rdoctemplate
551
-
552
- # runner to use for testing (console|tk|gtk|gtk2)
553
- attr_accessor :testrunner
554
-
555
- # Run silently.
556
- attr_accessor :quiet?
557
-
558
- # shebang has only three options.
559
- def shebang=(val)
560
- if %w(all ruby never).include?(val)
561
- @shebang = val
562
- else
563
- raise Error, "bad config: use SHEBANG=(all|ruby|never) [#{val}]"
564
- end
565
- end
566
-
567
- # installdirs has only three options; and it has side-effects.
568
- def installdirs=(val)
569
- @installdirs = val
570
- case val.to_s
571
- when 'std'
572
- self.rbdir = '$librubyver'
573
- self.sodir = '$librubyverarch'
574
- when 'site'
575
- self.rbdir = '$siterubyver'
576
- self.sodir = '$siterubyverarch'
577
- when 'home'
578
- raise Error, 'HOME is not set.' unless ENV['HOME']
579
- self.prefix = ENV['HOME']
580
- self.rbdir = '$libdir/ruby'
581
- self.sodir = '$libdir/ruby'
582
- else
583
- raise Error, "bad config: use INSTALLDIRS=(std|site|home|local) [#{val}]"
584
- end
585
- end
586
-
587
- # Get configuration from environment.
588
- def getenv
589
- OPTIONS.each do |name|
590
- if value = ENV[name] || ENV[name.upcase]
591
- __send__("#{name}=",value)
592
- end
593
- end
594
- end
595
-
596
- # Load configuration.
597
- def load
598
- #if File.file?(FILENAME)
599
- begin
600
- File.foreach(FILENAME) do |line|
601
- k, v = *line.split(/=/, 2)
602
- __send__("#{k}=",v.strip) #self[k] = v.strip
603
- end
604
- rescue Errno::ENOENT
605
- raise Error, $!.message + "\n#{File.basename($0)} config first"
606
- end
607
- #end
608
- end
609
-
610
- # Save configuration.
611
- def save
612
- File.open(FILENAME, 'w') do |f|
613
- OPTIONS.each do |name|
614
- val = self[name]
615
- case val
616
- when Array
617
- f << "#{name}=#{val.join(';')}\n"
618
- else
619
- f << "#{name}=#{val}\n"
620
- end
621
- end
622
- end
623
- end
624
-
625
- def show
626
- fmt = "%-20s %s\n"
627
- OPTIONS.each do |name|
628
- value = self[name]
629
- printf fmt, name, __send__(name) if value
630
- end
631
- printf fmt, 'VERBOSE', verbose? ? 'yes' : 'no'
632
- printf fmt, 'NOHARM', no_harm? ? 'yes' : 'no'
633
- end
634
-
635
- # Get unresloved attribute.
636
- def [](name)
637
- instance_variable_get("@#{name}")
638
- end
639
-
640
- # Set attribute.
641
- def []=(name, value)
642
- instance_variable_set("@#{name}", value)
643
- end
644
-
645
- # Resolved attribute. (for paths)
646
- #def resolve(name)
647
- # self[name].gsub(%r<\\$([^/]+)>){ self[$1] }
648
- #end
649
-
650
- # New ConfigTable
651
- def initialize(values=nil)
652
- initialize_defaults
653
- if values
654
- values.each{ |k,v| __send__("#{k}=", v) }
655
- end
656
- yeild(self) if block_given?
657
- end
658
-
659
- # Assign CONFIG defaults
660
- #
661
- # TODO: Does this handle 'nmake' on windows?
662
-
663
- def initialize_defaults
664
- prefix = RBCONFIG['prefix']
665
-
666
- rubypath = File.join(RBCONFIG['bindir'], RBCONFIG['ruby_install_name'] + RBCONFIG['EXEEXT'])
667
-
668
- # V > 1.6.3
669
- libruby = "#{prefix}/lib/ruby"
670
- librubyver = RBCONFIG['rubylibdir']
671
- librubyverarch = RBCONFIG['archdir']
672
- siteruby = RBCONFIG['sitedir']
673
- siterubyver = RBCONFIG['sitelibdir']
674
- siterubyverarch = RBCONFIG['sitearchdir']
675
-
676
- if arg = RBCONFIG['configure_args'].split.detect {|arg| /--with-make-prog=/ =~ arg }
677
- makeprog = arg.sub(/'/, '').split(/=/, 2)[1]
678
- else
679
- makeprog = 'make'
680
- end
681
-
682
- parameterize = lambda do |path|
683
- val = RBCONFIG[path]
684
- val.sub(/\A#{Regexp.quote(prefix)}/, '$prefix')
685
- end
686
-
687
- self.prefix = prefix
688
- self.bindir = parameterize['bindir']
689
- self.libdir = parameterize['libdir']
690
- self.datadir = parameterize['datadir']
691
- self.mandir = parameterize['mandir']
692
- self.docdir = File.dirname(parameterize['docdir']) # b/c of trailing $(PACKAGE)
693
- self.sysconfdir = parameterize['sysconfdir']
694
- self.localstatedir = parameterize['localstatedir']
695
- self.libruby = libruby
696
- self.librubyver = librubyver
697
- self.librubyverarch = librubyverarch
698
- self.siteruby = siteruby
699
- self.siterubyver = siterubyver
700
- self.siterubyverarch = siterubyverarch
701
- self.rbdir = '$siterubyver'
702
- self.sodir = '$siterubyverarch'
703
- self.rubypath = rubypath
704
- self.rubyprog = rubypath
705
- self.makeprog = makeprog
706
- self.shebang = 'ruby'
707
- self.without_ext = 'no'
708
- self.without_doc = 'no'
709
- self.without_index = 'no'
710
- self.installdirs = 'site'
711
- self.rdoctemplate = 'html'
712
- self.testrunner = 'console'
713
- self.configopt = ''
714
- end
715
-
716
- def show
717
- fmt = "%-20s %s\n"
718
- OPTIONS.each do |name|
719
- value = self[name]
720
- printf fmt, name, __send__(name)
721
- end
722
- end
723
-
724
- #
725
- def exec_config
726
- getenv
727
- save
728
- #create_makefiles if compiles?
729
- create_rakefile
730
- show unless quiet?
731
- puts "Configuration saved."
732
- end
733
-
734
- def extconfs
735
- @extconfs ||= Dir['ext/**/extconf.rb']
736
- end
737
-
738
- def extensions
739
- @extensions ||= extconfs.collect{ |f| File.dirname(f) }
740
- end
741
-
742
- def compiles?
743
- !extensions.empty?
744
- end
745
-
746
- #def create_makefiles
747
- # extensions.each do |dir|
748
- # Dir.chdir(dir) do
749
- # ruby('extconf.rb', configopt)
750
- # end
751
- # end
752
- #end
753
-
754
- # Create rakefile, if it doesn't exist.
755
- def create_rakefile
756
- unless Dir['[Rr]akefile{,.rb}'].first
757
- File.open('Rakefile', 'w') do |f|
758
- f << DATA.read
759
- end
760
- end
761
- end
762
-
763
- def ruby(*args)
764
- command rubyprog, *args
765
- end
766
-
767
- def make(task = nil)
768
- command(*[makeprog, task].compact)
769
- end
770
-
771
- def command(*args)
772
- $stderr.puts args.join(' ') if $DEBUG
773
- system(*args) or raise RuntimeError, "system(#{args.map{|a| a.inspect }.join(' ')}) failed"
774
- end
775
-
776
- # Help output.
777
-
778
- HELP = <<-END
779
- The Uber Rakefile v#{Version.join('.')}
780
-
781
- Usage:
782
-
783
- #{File.basename($0)} [options]
784
-
785
- The Uber Rakefile is designed to install a Ruby package. It does this by breaking
786
- the steps involved down into individual rake tasks. This gives the installer the
787
- opportunity to adjust installation settings as required for a particular
788
- platform. A typical installation procedure is:
789
-
790
- $ rake config
791
- $ rake setup
792
- $ rake install
793
-
794
- If you are certain of the default configuration settings (which are usually correct),
795
- you can use the simple shortcut:
796
-
797
- $ rake all
798
-
799
- See rake -T for all available tasks.
800
-
801
- Below is the list of options available for the config task.
802
-
803
- Configuration options:
804
- END
805
-
806
- fmt = " %-20s %s\n"
807
- DESCRIPTIONS.each do |name, desc|
808
- HELP << fmt % ["#{name}", desc]
809
- end
810
-
811
- HELP << <<-END
812
-
813
- Other options:
814
- verbose Provide extra ouput
815
- nowrite Do not write to disk.
816
- noharm Same as nowrite.
817
-
818
- Installdirs options correspond to: libruby, site_ruby and $HOME repsectively.
819
-
820
- END
821
-
822
- # Other options:
823
- # -q --quiet Run silently
824
- # -h --help Display this help information
825
- # --version Show version
826
- # --copyright Show copyright
827
- #
828
- # END
829
-
830
- HELP.gsub!(/^\ \ /,'')
831
-
832
- # CLI runner. This uses OptionParser to parse
833
- # command line arguments. (May chnage to GetoptLong).
834
-
835
- def self.start_cli
836
- config = new
837
-
838
- opts = OptionParser.new
839
-
840
- DESCRIPTIONS.each do |name, desc|
841
- opts.on("--#{name}", desc) do |val|
842
- ENV[name.upcase] = val
843
- end
844
- end
845
-
846
- # Tail options (eg. commands in option form)
847
-
848
- opts.on("-q", "--quiet", "Run silently") do |val|
849
- config.quiet = true
850
- end
851
-
852
- opts.on_tail("-h", "--help", "Display help information") do
853
- puts HELP
854
- exit
855
- end
856
-
857
- opts.on_tail("--version", "Show version") do
858
- puts File.basename($0) + ' v' + Setup::Version.join('.')
859
- exit
860
- end
861
-
862
- opts.on_tail("--copyright", "Show copyright") do
863
- puts Setup::Copyright
864
- exit
865
- end
866
-
867
- begin
868
- opts.parse!(ARGV)
869
- rescue OptionParser::InvalidOption
870
- $stderr.puts $!.capitalize
871
- exit 1
872
- end
873
-
874
- begin
875
- config.exec_config
876
- rescue Configure::Error
877
- raise if $DEBUG
878
- $stderr.puts $!.message
879
- $stderr.puts "Try 'ruby #{$0} --help' for detailed usage."
880
- exit 1
881
- end
882
- end
883
-
884
- end
885
-
886
- # Command line run
887
- if __FILE__ == $0
888
- Configure.start_cli
889
- end
890
-
891
- #
892
- #
893
- #
894
-
895
- class Installer
896
-
897
- MANIFEST = '.installedfiles'
898
-
899
- FILETYPES = %w( bin lib ext data conf man doc )
900
-
901
- # Has this been installed previously?
902
- def self.uninstallable?
903
- File.exist?(MANIFEST)
904
- end
905
-
906
- # Configuration
907
- attr :config
908
-
909
- attr_writer :no_harm
910
- attr_writer :verbose
911
-
912
- attr_accessor :install_prefix
913
-
914
- # New Installer.
915
- def initialize(config) #:yield:
916
- srcroot = '.'
917
- objroot = '.'
918
-
919
- @config = config
920
-
921
- @srcdir = File.expand_path(srcroot)
922
- @objdir = File.expand_path(objroot)
923
- @currdir = '.'
924
-
925
- @verbose = false
926
-
927
- #self.verbose = ENV['VERBOSE'] if ENV['VERBOSE']
928
- #self.no_harm = ENV['NO_HARM'] if ENV['NO_HARM']
929
-
930
- yield(self) if block_given?
931
- end
932
-
933
- def inspect
934
- "#<#{self.class} #{File.basename(@srcdir)}>"
935
- end
936
-
937
- # Do not write to disk.
938
- def no_harm? ; @no_harm; end
939
-
940
- # Verbose output?
941
- def verbose? ; @verbose || @no_harm; end
942
-
943
- # Yes, very very verbose output.
944
- def very_verbose? ; @very_verbose; end
945
-
946
- def verbose_off #:yield:
947
- begin
948
- save, @verbose = verbose?, false
949
- yield
950
- ensure
951
- @verbose = save
952
- end
953
- end
954
-
955
- # Are we running an installation?
956
- def installation?; @installation; end
957
- def installation!; @installation = true; end
958
-
959
- #
960
- # Hook Script API bases
961
- #
962
-
963
- def srcdir_root
964
- @srcdir
965
- end
966
-
967
- def objdir_root
968
- @objdir
969
- end
970
-
971
- def relpath
972
- @currdir
973
- end
974
-
975
- # Used as a null traversal.
976
- def noop(rel) ; end
977
-
978
- def update_shebang_line(path)
979
- return if no_harm?
980
- return if config.shebang == 'never'
981
- old = Shebang.load(path)
982
- if old
983
- if old.args.size > 1
984
- $stderr.puts "warning: #{path}"
985
- $stderr.puts "Shebang line has too many args."
986
- $stderr.puts "It is not portable and your program may not work."
987
- end
988
- new = new_shebang(old)
989
- return if new.to_s == old.to_s
990
- else
991
- return unless config.shebang == 'all'
992
- new = Shebang.new(config.rubypath)
993
- end
994
- $stderr.puts "updating shebang: #{File.basename(path)}" if verbose?
995
- open_atomic_writer(path) {|output|
996
- File.open(path, 'rb') {|f|
997
- f.gets if old # discard
998
- output.puts new.to_s
999
- output.print f.read
1000
- }
1001
- }
1002
- end
1003
-
1004
- def new_shebang(old)
1005
- if /\Aruby/ =~ File.basename(old.cmd)
1006
- Shebang.new(config.rubypath, old.args)
1007
- elsif File.basename(old.cmd) == 'env' and old.args.first == 'ruby'
1008
- Shebang.new(config.rubypath, old.args[1..-1])
1009
- else
1010
- return old unless config.shebang == 'all'
1011
- Shebang.new(config.rubypath)
1012
- end
1013
- end
1014
-
1015
- def open_atomic_writer(path, &block)
1016
- tmpfile = File.basename(path) + '.tmp'
1017
- begin
1018
- File.open(tmpfile, 'wb', &block)
1019
- File.rename tmpfile, File.basename(path)
1020
- ensure
1021
- File.unlink tmpfile if File.exist?(tmpfile)
1022
- end
1023
- end
1024
-
1025
- class Shebang
1026
- def Shebang.load(path)
1027
- line = nil
1028
- File.open(path) {|f|
1029
- line = f.gets
1030
- }
1031
- return nil unless /\A#!/ =~ line
1032
- parse(line)
1033
- end
1034
-
1035
- def Shebang.parse(line)
1036
- cmd, *args = *line.strip.sub(/\A\#!/, '').split(' ')
1037
- new(cmd, args)
1038
- end
1039
-
1040
- def initialize(cmd, args = [])
1041
- @cmd = cmd
1042
- @args = args
1043
- end
1044
-
1045
- attr_reader :cmd
1046
- attr_reader :args
1047
-
1048
- def to_s
1049
- "#! #{@cmd}" + (@args.empty? ? '' : " #{@args.join(' ')}")
1050
- end
1051
- end
1052
-
1053
- #
1054
- # TASK install
1055
- #
1056
-
1057
- def exec_install
1058
- installation! # mark that we are installing
1059
- #rm_f MANIFEST # we'll append rather then delete
1060
- exec_task_traverse 'install'
1061
- end
1062
-
1063
- def install_dir_bin(rel)
1064
- install_files targetfiles(), "#{config.bindir}/#{rel}", 0755
1065
- end
1066
-
1067
- def install_dir_lib(rel)
1068
- install_files libfiles(), "#{config.rbdir}/#{rel}", 0644
1069
- end
1070
-
1071
- def install_dir_ext(rel)
1072
- return unless extdir?(curr_srcdir())
1073
- install_files rubyextentions('.'),
1074
- "#{config.sodir}/#{File.dirname(rel)}", 0555
1075
- end
1076
-
1077
- def install_dir_data(rel)
1078
- install_files targetfiles(), "#{config.datadir}/#{rel}", 0644
1079
- end
1080
-
1081
- def install_dir_doc(rel)
1082
- return if config.without_doc?
1083
- install_files targetfiles(), "#{config.docdir}/#{rel}", 0644
1084
- end
1085
-
1086
- def install_dir_conf(rel)
1087
- # FIXME: should not remove current config files
1088
- # (rename previous file to .old/.org)
1089
- install_files targetfiles(), "#{config.sysconfdir}/#{rel}", 0644
1090
- end
1091
-
1092
- def install_dir_man(rel)
1093
- install_files targetfiles(), "#{config.mandir}/#{rel}", 0644
1094
- end
1095
-
1096
- def install_files(list, dest, mode)
1097
- mkdir_p dest, install_prefix
1098
- list.each do |fname|
1099
- install fname, dest, mode, install_prefix
1100
- end
1101
- end
1102
-
1103
- def libfiles
1104
- glob_reject(%w(*.y *.output), targetfiles())
1105
- end
1106
-
1107
- def rubyextentions(dir)
1108
- ents = glob_select("*.#{dllext}", targetfiles())
1109
- if ents.empty?
1110
- setup_rb_error "no ruby extention exists: 'ruby #{$0} setup' first"
1111
- end
1112
- ents
1113
- end
1114
-
1115
- def dllext
1116
- RBCONFIG['DLEXT']
1117
- end
1118
-
1119
- def targetfiles
1120
- mapdir(existfiles() - hookfiles())
1121
- end
1122
-
1123
- def mapdir(ents)
1124
- ents.map {|ent|
1125
- if File.exist?(ent)
1126
- then ent # objdir
1127
- else "#{curr_srcdir()}/#{ent}" # srcdir
1128
- end
1129
- }
1130
- end
1131
-
1132
- # picked up many entries from cvs-1.11.1/src/ignore.c
1133
- JUNK_FILES = %w(
1134
- core RCSLOG tags TAGS .make.state
1135
- .nse_depinfo #* .#* cvslog.* ,* .del-* *.olb
1136
- *~ *.old *.bak *.BAK *.orig *.rej _$* *$
1137
-
1138
- *.org *.in .*
1139
- )
1140
-
1141
- def existfiles
1142
- glob_reject(JUNK_FILES, (files_of(curr_srcdir()) | files_of('.')))
1143
- end
1144
-
1145
- def hookfiles
1146
- %w( pre-%s post-%s pre-%s.rb post-%s.rb ).map {|fmt|
1147
- %w( config setup install clean ).map {|t| sprintf(fmt, t) }
1148
- }.flatten
1149
- end
1150
-
1151
- def glob_select(pat, ents)
1152
- re = globs2re([pat])
1153
- ents.select {|ent| re =~ ent }
1154
- end
1155
-
1156
- def glob_reject(pats, ents)
1157
- re = globs2re(pats)
1158
- ents.reject {|ent| re =~ ent }
1159
- end
1160
-
1161
- GLOB2REGEX = {
1162
- '.' => '\.',
1163
- '$' => '\$',
1164
- '#' => '\#',
1165
- '*' => '.*'
1166
- }
1167
-
1168
- def globs2re(pats)
1169
- /\A(?:#{
1170
- pats.map {|pat| pat.gsub(/[\.\$\#\*]/) {|ch| GLOB2REGEX[ch] } }.join('|')
1171
- })\z/
1172
- end
1173
-
1174
- #
1175
- # TASK uninstall
1176
- #
1177
-
1178
- def exec_uninstall
1179
- files = File.read(MANIFEST).split("\n")
1180
- files.each do |file|
1181
- next if /^\#/ =~ file # skip comments
1182
- rm_f(file) if File.exist?(file)
1183
- end
1184
- end
1185
-
1186
- #
1187
- # Traversing
1188
- #
1189
-
1190
- #
1191
- def exec_task_traverse(task)
1192
- run_hook "pre-#{task}"
1193
- FILETYPES.each do |type|
1194
- if type == 'ext' and config.without_ext == 'yes'
1195
- $stderr.puts 'skipping ext/* by user option' if verbose?
1196
- next
1197
- end
1198
- traverse task, type, "#{task}_dir_#{type}"
1199
- end
1200
- run_hook "post-#{task}"
1201
- end
1202
-
1203
- #
1204
- def traverse(task, rel, mid)
1205
- dive_into(rel) {
1206
- run_hook "pre-#{task}"
1207
- __send__ mid, rel.sub(%r[\A.*?(?:/|\z)], '')
1208
- directories_of(curr_srcdir()).each do |d|
1209
- traverse task, "#{rel}/#{d}", mid
1210
- end
1211
- run_hook "post-#{task}"
1212
- }
1213
- end
1214
-
1215
- #
1216
- def dive_into(rel)
1217
- return unless File.dir?("#{@srcdir}/#{rel}")
1218
-
1219
- dir = File.basename(rel)
1220
- Dir.mkdir dir unless File.dir?(dir)
1221
- prevdir = Dir.pwd
1222
- Dir.chdir dir
1223
- $stderr.puts '---> ' + rel if very_verbose?
1224
- @currdir = rel
1225
- yield
1226
- Dir.chdir prevdir
1227
- $stderr.puts '<--- ' + rel if very_verbose?
1228
- @currdir = File.dirname(rel)
1229
- end
1230
-
1231
- #
1232
- def run_hook(id)
1233
- path = [ "#{curr_srcdir()}/#{id}",
1234
- "#{curr_srcdir()}/#{id}.rb" ].detect {|cand| File.file?(cand) }
1235
- return unless path
1236
- begin
1237
- instance_eval File.read(path), path, 1
1238
- rescue
1239
- raise if $DEBUG
1240
- setup_rb_error "hook #{path} failed:\n" + $!.message
1241
- end
1242
- end
1243
-
1244
- # File Operations
1245
- #
1246
- # These use: #verbose? and #no_harm?
1247
-
1248
- def binread(fname)
1249
- File.open(fname, 'rb'){ |f|
1250
- return f.read
1251
- }
1252
- end
1253
-
1254
- def mkdir_p(dirname, prefix = nil)
1255
- dirname = prefix + File.expand_path(dirname) if prefix
1256
- $stderr.puts "mkdir -p #{dirname}" if verbose?
1257
- return if no_harm?
1258
-
1259
- # Does not check '/', it's too abnormal.
1260
- dirs = File.expand_path(dirname).split(%r<(?=/)>)
1261
- if /\A[a-z]:\z/i =~ dirs[0]
1262
- disk = dirs.shift
1263
- dirs[0] = disk + dirs[0]
1264
- end
1265
- dirs.each_index do |idx|
1266
- path = dirs[0..idx].join('')
1267
- Dir.mkdir path unless File.dir?(path)
1268
- end
1269
- end
1270
-
1271
- def rm_f(path)
1272
- $stderr.puts "rm -f #{path}" if verbose?
1273
- return if no_harm?
1274
- force_remove_file path
1275
- end
1276
-
1277
- def rm_rf(path)
1278
- $stderr.puts "rm -rf #{path}" if verbose?
1279
- return if no_harm?
1280
- remove_tree path
1281
- end
1282
-
1283
- def remove_tree(path)
1284
- if File.symlink?(path)
1285
- remove_file path
1286
- elsif File.dir?(path)
1287
- remove_tree0 path
1288
- else
1289
- force_remove_file path
1290
- end
1291
- end
1292
-
1293
- def remove_tree0(path)
1294
- Dir.foreach(path) do |ent|
1295
- next if ent == '.'
1296
- next if ent == '..'
1297
- entpath = "#{path}/#{ent}"
1298
- if File.symlink?(entpath)
1299
- remove_file entpath
1300
- elsif File.dir?(entpath)
1301
- remove_tree0 entpath
1302
- else
1303
- force_remove_file entpath
1304
- end
1305
- end
1306
- begin
1307
- Dir.rmdir path
1308
- rescue Errno::ENOTEMPTY
1309
- # directory may not be empty
1310
- end
1311
- end
1312
-
1313
- def move_file(src, dest)
1314
- force_remove_file dest
1315
- begin
1316
- File.rename src, dest
1317
- rescue
1318
- File.open(dest, 'wb') {|f|
1319
- f.write binread(src)
1320
- }
1321
- File.chmod File.stat(src).mode, dest
1322
- File.unlink src
1323
- end
1324
- end
1325
-
1326
- def force_remove_file(path)
1327
- begin
1328
- remove_file path
1329
- rescue
1330
- end
1331
- end
1332
-
1333
- def remove_file(path)
1334
- File.chmod 0777, path
1335
- File.unlink path
1336
- end
1337
-
1338
- def install(from, dest, mode, prefix = nil)
1339
- $stderr.puts "install #{from} #{dest}" if verbose?
1340
- return if no_harm?
1341
-
1342
- realdest = prefix ? prefix + File.expand_path(dest) : dest
1343
- realdest = File.join(realdest, File.basename(from)) if File.dir?(realdest)
1344
- str = binread(from)
1345
- if diff?(str, realdest)
1346
- verbose_off {
1347
- rm_f realdest if File.exist?(realdest)
1348
- }
1349
- File.open(realdest, 'wb') {|f|
1350
- f.write str
1351
- }
1352
- File.chmod mode, realdest
1353
-
1354
- File.open("#{objdir_root()}/#{MANIFEST}", 'a') {|f|
1355
- if prefix
1356
- f.puts realdest.sub(prefix, '')
1357
- else
1358
- f.puts realdest
1359
- end
1360
- }
1361
- end
1362
- end
1363
-
1364
- def diff?(new_content, path)
1365
- return true unless File.exist?(path)
1366
- new_content != binread(path)
1367
- end
1368
-
1369
- def command(*args)
1370
- $stderr.puts args.join(' ') if verbose?
1371
- system(*args) or raise RuntimeError,
1372
- "system(#{args.map{|a| a.inspect }.join(' ')}) failed"
1373
- end
1374
-
1375
- def ruby(*args)
1376
- command config.rubyprog, *args
1377
- end
1378
-
1379
- def make(task = nil)
1380
- command(*[config.makeprog, task].compact)
1381
- end
1382
-
1383
- def extdir?(dir)
1384
- File.exist?("#{dir}/MANIFEST") or File.exist?("#{dir}/extconf.rb")
1385
- end
1386
-
1387
- def files_of(dir)
1388
- Dir.open(dir) {|d|
1389
- return d.select {|ent| File.file?("#{dir}/#{ent}") }
1390
- }
1391
- end
1392
-
1393
- DIR_REJECT = %w( . .. CVS SCCS RCS CVS.adm .svn )
1394
-
1395
- def directories_of(dir)
1396
- Dir.open(dir) {|d|
1397
- return d.select {|ent| File.dir?("#{dir}/#{ent}") } - DIR_REJECT
1398
- }
1399
- end
1400
-
1401
- #
1402
- # Hook Script API
1403
- #
1404
- # These require: #srcdir_root, #objdir_root, #relpath
1405
- #
1406
-
1407
- #
1408
- def get_config(key)
1409
- config.__send__(key)
1410
- end
1411
-
1412
- # obsolete: use metaconfig to change configuration
1413
- # TODO: what to do with?
1414
- def set_config(key, val)
1415
- config[key] = val
1416
- end
1417
-
1418
- #
1419
- # srcdir/objdir (works only in the package directory)
1420
- #
1421
-
1422
- def curr_srcdir
1423
- "#{srcdir_root()}/#{relpath()}"
1424
- end
1425
-
1426
- def curr_objdir
1427
- "#{objdir_root()}/#{relpath()}"
1428
- end
1429
-
1430
- def srcfile(path)
1431
- "#{curr_srcdir()}/#{path}"
1432
- end
1433
-
1434
- def srcexist?(path)
1435
- File.exist?(srcfile(path))
1436
- end
1437
-
1438
- def srcdirectory?(path)
1439
- File.dir?(srcfile(path))
1440
- end
1441
-
1442
- def srcfile?(path)
1443
- File.file?(srcfile(path))
1444
- end
1445
-
1446
- def srcentries(path = '.')
1447
- Dir.open("#{curr_srcdir()}/#{path}") {|d|
1448
- return d.to_a - %w(. ..)
1449
- }
1450
- end
1451
-
1452
- def srcfiles(path = '.')
1453
- srcentries(path).select {|fname|
1454
- File.file?(File.join(curr_srcdir(), path, fname))
1455
- }
1456
- end
1457
-
1458
- def srcdirectories(path = '.')
1459
- srcentries(path).select {|fname|
1460
- File.dir?(File.join(curr_srcdir(), path, fname))
1461
- }
1462
- end
1463
-
1464
- end
1465
-
1466
- #
1467
- # Ruby extensions
1468
- #
1469
-
1470
- unless File.respond_to?(:read) # Ruby 1.6 and less
1471
- def File.read(fname)
1472
- open(fname) {|f|
1473
- return f.read
1474
- }
1475
- end
1476
- end
1477
-
1478
- unless Errno.const_defined?(:ENOTEMPTY) # Windows?
1479
- module Errno
1480
- class ENOTEMPTY
1481
- # We do not raise this exception, implementation is not needed.
1482
- end
1483
- end
1484
- end
1485
-
1486
- # for corrupted Windows' stat(2)
1487
- def File.dir?(path)
1488
- File.directory?((path[-1,1] == '/') ? path : path + '/')
1489
- end
1490
-
1491
- #
1492
- # The End
1493
- #
1494
-
1495
- UberTask.new(PACKAGE, GENERATE_DOCS)
1
+ require File.join(File.dirname(__FILE__), "setup.rb")
1496
2