mpipe 0.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.
@@ -0,0 +1,36 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+
5
+ # get version
6
+ open("ext/mpipe/mpipe.c") do |f|
7
+ f.each_line do |l|
8
+ if /MPIPE_VERSION "([\d.]+)"/ =~ l
9
+ VERSION = $1
10
+ break
11
+ end
12
+ end
13
+ end
14
+
15
+ Gem::Specification.new do |spec|
16
+ spec.name = "mpipe"
17
+ spec.version = VERSION
18
+ spec.authors = ["Masahiro TANAKA"]
19
+ spec.email = ["masa16.tanaka@gmail.com"]
20
+ spec.description = %q{MPipe - IO.pipe emulation over MPI.}
21
+ spec.summary = %q{MPipe - IO.pipe emulation over MPI}
22
+ spec.homepage = "https://github.com/masa16/mpipe"
23
+ spec.license = "MIT"
24
+
25
+ spec.files = `git ls-files -z`.split("\x0").reject do |f|
26
+ f.match(%r{^(test|spec|features)/})
27
+ end
28
+ spec.bindir = "bin"
29
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
30
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
31
+ spec.require_paths = ["lib"]
32
+ spec.extensions = %w[ext/mpipe/extconf.rb]
33
+
34
+ spec.add_development_dependency "bundler", "~> 1.14"
35
+ spec.add_development_dependency "rake", "~> 10.0"
36
+ end
@@ -0,0 +1,28 @@
1
+ require_relative "../ext/mpipe"
2
+
3
+ puts "buffer_size = %d" % MPipe.buffer_size
4
+ MPipe.buffer_size = 2**10
5
+ puts "buffer_size = %d" % MPipe.buffer_size
6
+
7
+ MPipe.init
8
+ rank = MPipe::Comm.rank
9
+ size = MPipe::Comm.size
10
+ puts "size=%d rank=%d pid=%d" % [size, rank, Process.pid]
11
+
12
+ # MPipe.buffer_size = 2**13
13
+ p MPipe.new(0).object_id == MPipe.new(0).object_id
14
+
15
+ if rank == 0
16
+
17
+ (1..size-1).each do |i|
18
+ p MPipe.new(i).read
19
+ end
20
+
21
+ else
22
+
23
+ sleep rank
24
+ message = "Hello from #{rank}"
25
+ MPipe.new(0).write(message)
26
+ puts "message sent from #{rank}"
27
+
28
+ end
@@ -0,0 +1,31 @@
1
+ require_relative "../ext/mpipe"
2
+
3
+ MPipe.init
4
+
5
+ printf "size=%d rank=%d pid=%d\n", MPipe::Comm.size, MPipe::Comm.rank, Process.pid
6
+
7
+ rank = MPipe::Comm.rank
8
+ size = MPipe::Comm.size
9
+
10
+ if rank == 0
11
+
12
+ pipes = (1..size-1).map{|rank| MPipe.new(rank)}
13
+
14
+ while !pipes.empty?
15
+ rsel, = MPipe.select(pipes)
16
+ rsel.each do |r|
17
+ p s=r.read_nonblock
18
+ if /end/ =~ s
19
+ pipes.delete(r)
20
+ end
21
+ end
22
+ end
23
+
24
+ else
25
+
26
+ sleep size-rank
27
+ message = "Hello from #{rank}"
28
+ MPipe.new(0).write(message)
29
+ MPipe.new(0).write("end")
30
+
31
+ end
@@ -0,0 +1,28 @@
1
+ require_relative "../ext/mpipe"
2
+
3
+ puts "buffer_size = %d" % MPipe.buffer_size
4
+ MPipe.buffer_size = 2**13
5
+ puts "buffer_size = %d" % MPipe.buffer_size
6
+
7
+ MPipe.init
8
+ rank = MPipe::Comm.rank
9
+ size = MPipe::Comm.size
10
+ puts "size=%d rank=%d pid=%d" % [size, rank, Process.pid]
11
+
12
+ # MPipe.buffer_size = 2**13
13
+ p MPipe.abort(0)
14
+
15
+ if rank == 0
16
+
17
+ (1..size-1).each do |i|
18
+ p MPipe.new(i).read
19
+ end
20
+
21
+ else
22
+
23
+ sleep rank
24
+ message = "Hello from #{rank}"
25
+ MPipe.new(0).write(message)
26
+ puts "message sent from #{rank}"
27
+
28
+ end
@@ -0,0 +1,33 @@
1
+ require_relative "../ext/mpipe"
2
+
3
+ MPipe.init
4
+ rank = MPipe::Comm.rank
5
+ size = MPipe::Comm.size
6
+ puts "size=%d rank=%d pid=%d" % [size,rank,Process.pid]
7
+
8
+ def _read(io)
9
+ io.read_nonblock
10
+ rescue IO::WaitReadable
11
+ MPipe.select([io])
12
+ retry
13
+ end
14
+
15
+ if rank == 0
16
+
17
+ pipes = (1..size-1).map{|rank| MPipe.new(rank)}
18
+
19
+ pipes.each do |x|
20
+ while !(s = _read(x))
21
+ puts "waiting"
22
+ $stdout.flush
23
+ end
24
+ p s
25
+ end
26
+
27
+ else
28
+
29
+ sleep rank
30
+ message = "Hello from #{rank}"
31
+ MPipe.new(0).write(message)
32
+
33
+ end
@@ -0,0 +1,28 @@
1
+ require_relative "../ext/mpipe"
2
+
3
+ MPipe.init
4
+ rank = MPipe::Comm.rank
5
+ size = MPipe::Comm.size
6
+ puts "size=%d rank=%d pid=%d" % [size,rank,Process.pid]
7
+
8
+ if rank == 0
9
+
10
+ pipes = (1..size-1).map{|rank| MPipe.new(rank)}
11
+ p pipes
12
+
13
+ while !pipes.empty?
14
+ rsel, = MPipe.select(pipes)
15
+ rsel.each do |r|
16
+ #p r.read_nonblock(6,"")
17
+ p s = r.read_nonblock()
18
+ pipes.delete(r) if /end/ =~ s
19
+ end
20
+ end
21
+
22
+ else
23
+
24
+ sleep size-rank
25
+ message = "Hello from #{rank} - "*500+"end"
26
+ MPipe.new(0).write_nonblock(message)
27
+
28
+ end
@@ -0,0 +1,23 @@
1
+ require_relative "../ext/mpipe"
2
+
3
+ MPipe.init
4
+ rank = MPipe::Comm.rank
5
+ size = MPipe::Comm.size
6
+ puts "size=%d rank=%d pid=%d" % [size,rank,Process.pid]
7
+
8
+ if rank == 0
9
+
10
+ pipes = (1..size-1).map{|rank| MPipe.new(rank)}
11
+
12
+ pipes.each do |r|
13
+ p r.read(6,"")
14
+ p r.read
15
+ end
16
+
17
+ else
18
+
19
+ sleep rank
20
+ message = "Hello from #{rank}"
21
+ MPipe.new(0).write(message)
22
+
23
+ end
@@ -0,0 +1,1295 @@
1
+ #!/usr/bin/env ruby
2
+ # Setup.rb v5.1.0
3
+ #
4
+ # This is a stand-alone bundle of the setup.rb application.
5
+ # You can place it in your projects script/ directory, or
6
+ # call it 'setup.rb' and place it in your project's
7
+ # root directory (just like old times).
8
+ #
9
+ # NOTE: As of version 5.1.0 this bundled rendition is also
10
+ # being used for the bin/setup.rb exe. Rather than the previous:
11
+ #
12
+ # require 'setup/command'
13
+ # Setup::Command.run
14
+ #
15
+ # By doing so, +rvm+ should be able to use it across all rubies
16
+ # without issue and without needing to install it for each.
17
+ require 'yaml'
18
+ module Setup
19
+ VERSION = '5.2.0' #:erb: VERSION = '<%= version %>'
20
+ end
21
+ class << File #:nodoc: all
22
+ unless respond_to?(:read) # Ruby 1.6 and less
23
+ def read(fname)
24
+ open(fname){ |f| return f.read }
25
+ end
26
+ end
27
+ def dir?(path)
28
+ directory?((path[-1,1] == '/') ? path : path + '/')
29
+ end
30
+ end
31
+ unless Errno.const_defined?(:ENOTEMPTY) # Windows?
32
+ module Errno #:nodoc:
33
+ class ENOTEMPTY #:nodoc:
34
+ end
35
+ end
36
+ end
37
+ module Setup
38
+ META_EXTENSION_DIR = '.setup'
39
+ FILETYPES = %w( bin lib ext data etc man doc )
40
+ INSTALL_RECORD = 'SetupReceipt'
41
+ CONFIG_FILE = 'SetupConfig'
42
+ end
43
+ module Setup
44
+ class Project
45
+ ROOT_MARKER = '{.index,setup.rb,.setup,lib/}'
46
+ def initialize
47
+ @dotindex_file = find('.index')
48
+ @dotindex = YAML.load_file(@dotindex_file) if @dotindex_file
49
+ @name = nil
50
+ @version = nil
51
+ @loadpath = ['lib']
52
+ if @dotindex
53
+ @name = @dotindex['name']
54
+ @version = @dotindex['version']
55
+ @loadpath = (@dotindex['paths'] || {})['load']
56
+ else
57
+ if file = find('.setup/name')
58
+ @name = File.read(file).strip
59
+ end
60
+ if file = find('.setup/version')
61
+ @version = File.read(file).strip
62
+ end
63
+ if file = find('.setup/loadpath')
64
+ @loadpath = File.read(file).strip
65
+ end
66
+ end
67
+ end
68
+ attr :dotindex
69
+ attr :name
70
+ attr :version
71
+ attr :loadpath
72
+ alias load_path loadpath
73
+ def rootdir
74
+ @rootdir ||= (
75
+ root = Dir.glob(File.join(Dir.pwd, ROOT_MARKER), File::FNM_CASEFOLD).first
76
+ if !root
77
+ raise Error, "not a project directory"
78
+ else
79
+ Dir.pwd
80
+ end
81
+ )
82
+ end
83
+ def extconfs
84
+ @extconfs ||= Dir['ext/**/extconf.rb']
85
+ end
86
+ def extensions
87
+ @extensions ||= extconfs.collect{ |f| File.dirname(f) }
88
+ end
89
+ def compiles?
90
+ !extensions.empty?
91
+ end
92
+ def yardopts
93
+ Dir.glob(File.join(rootdir, '.yardopts')).first
94
+ end
95
+ def document
96
+ Dir.glob(File.join(rootdir, '.document')).first
97
+ end
98
+ def find(glob, flags=0)
99
+ case flags
100
+ when :casefold
101
+ flags = File::FNM_CASEFOLD
102
+ else
103
+ flags = flags.to_i
104
+ end
105
+ Dir.glob(File.join(rootdir, glob), flags).first
106
+ end
107
+ end
108
+ end
109
+ module Setup
110
+ class Session
111
+ attr :options
112
+ def initialize(options={})
113
+ @options = options
114
+ self.io ||= StringIO.new # log instead ?
115
+ end
116
+ def io
117
+ @options[:io]
118
+ end
119
+ def io=(anyio)
120
+ @options[:io] = anyio
121
+ end
122
+ def trace?; @options[:trace]; end
123
+ def trace=(val)
124
+ @options[:trace] = val
125
+ end
126
+ def trial?; @options[:trial]; end
127
+ alias_method :dryrun?, :trial?
128
+ def trial=(val)
129
+ @options[:trial] = val
130
+ end
131
+ alias_method :dryrun=, :trial=
132
+ def quiet?; @options[:quiet]; end
133
+ def quiet=(val)
134
+ @options[:quiet] = val
135
+ end
136
+ def force?; @options[:force]; end
137
+ def force=(val)
138
+ @options[:force] = val
139
+ end
140
+ def compile?
141
+ configuration.compile? && project.compiles?
142
+ end
143
+ def all
144
+ config
145
+ compile
146
+ if configuration.test?
147
+ ok = test
148
+ exit 1 unless ok
149
+ end
150
+ install
151
+ end
152
+ def config
153
+ log_header('Preconfig')
154
+ if configuration.save_config
155
+ io.print "#{CONFIG_FILE} was saved. " unless quiet?
156
+ else
157
+ io.print "#{CONFIG_FILE} is current. " unless quiet?
158
+ end
159
+ io.puts "Edit to customize configuration." unless quiet?
160
+ puts configuration if trace? && !quiet?
161
+ end
162
+ def compile
163
+ if compile?
164
+ log_header('Compile')
165
+ compiler.configure
166
+ compiler.compile
167
+ end
168
+ end
169
+ alias_method :make, :compile
170
+ alias_method :setup, :make
171
+ def install
172
+ log_header('Install')
173
+ installer.install
174
+ end
175
+ def test
176
+ return true unless tester.testable?
177
+ log_header('Test')
178
+ tester.test
179
+ end
180
+ def clean
181
+ log_header('Clean')
182
+ compiler.clean
183
+ end
184
+ def distclean
185
+ log_header('Distclean')
186
+ compiler.distclean
187
+ end
188
+ def uninstall
189
+ if !File.exist?(INSTALL_RECORD)
190
+ io.puts "Nothing is installed."
191
+ return
192
+ end
193
+ log_header('Uninstall')
194
+ uninstaller.uninstall
195
+ io.puts('Ok.')
196
+ end
197
+ def show
198
+ puts configuration
199
+ end
200
+ def project
201
+ @project ||= Project.new
202
+ end
203
+ def configuration
204
+ @configuration ||= Configuration.new
205
+ end
206
+ def compiler
207
+ @compiler ||= Compiler.new(project, configuration, options)
208
+ end
209
+ def installer
210
+ @installer ||= Installer.new(project, configuration, options)
211
+ end
212
+ def tester
213
+ @tester ||= Tester.new(project, configuration, options)
214
+ end
215
+ def uninstaller
216
+ @uninstaller ||= Uninstaller.new(project, configuration, options)
217
+ end
218
+ def log_header(phase)
219
+ return if quiet?
220
+ if trial?
221
+ str = "#{phase.upcase} (trail run)"
222
+ else
223
+ str = "#{phase.upcase}"
224
+ end
225
+ line = "- " * 35
226
+ line[0..str.size+3] = str
227
+ io.puts("\n- - #{line}\n\n")
228
+ end
229
+ end
230
+ end
231
+ module Setup
232
+ class Base
233
+ attr :project
234
+ attr :config
235
+ attr_accessor :trial
236
+ attr_accessor :trace
237
+ attr_accessor :quiet
238
+ attr_accessor :force
239
+ attr_accessor :io
240
+ def initialize(project, configuration, options={})
241
+ @project = project
242
+ @config = configuration
243
+ initialize_hooks
244
+ options.each do |k,v|
245
+ __send__("#{k}=", v) if respond_to?("#{k}=")
246
+ end
247
+ end
248
+ def initialize_hooks
249
+ file = META_EXTENSION_DIR + "/#{self.class.name.downcase}.rb"
250
+ if File.exist?(file)
251
+ script = File.read(file)
252
+ (class << self; self; end).class_eval(script)
253
+ end
254
+ end
255
+ def trial? ; @trial ; end
256
+ def trace? ; @trace ; end
257
+ def quiet? ; @quiet ; end
258
+ def force? ; @force ; end
259
+ def rootdir
260
+ project.rootdir
261
+ end
262
+ def bash(*args)
263
+ $stderr.puts args.join(' ') if trace?
264
+ system(*args) or raise RuntimeError, "system(#{args.map{|a| a.inspect }.join(' ')}) failed"
265
+ end
266
+ alias_method :command, :bash
267
+ def ruby(*args)
268
+ bash(config.rubyprog, *args)
269
+ end
270
+ def trace_off #:yield:
271
+ begin
272
+ save, @trace = trace?, false
273
+ yield
274
+ ensure
275
+ @trace = save
276
+ end
277
+ end
278
+ def rm_f(path)
279
+ io.puts "rm -f #{path}" if trace? or trial?
280
+ return if trial?
281
+ force_remove_file(path)
282
+ end
283
+ def force_remove_file(path)
284
+ begin
285
+ remove_file(path)
286
+ rescue
287
+ end
288
+ end
289
+ def remove_file(path)
290
+ File.chmod 0777, path
291
+ File.unlink(path)
292
+ end
293
+ def rmdir(path)
294
+ io.puts "rmdir #{path}" if trace? or trial?
295
+ return if trial?
296
+ Dir.rmdir(path)
297
+ end
298
+ end
299
+ class Error < StandardError
300
+ end
301
+ end
302
+ module Setup
303
+ class Compiler < Base
304
+ def compiles?
305
+ !extdirs.empty?
306
+ end
307
+ def configure
308
+ extdirs.each do |dir|
309
+ Dir.chdir(dir) do
310
+ if File.exist?('extconf.rb') && !FileUtils.uptodate?('Makefile', ['extconf.rb'])
311
+ ruby("extconf.rb")
312
+ end
313
+ end
314
+ end
315
+ end
316
+ def compile
317
+ extdirs.each do |dir|
318
+ Dir.chdir(dir) do
319
+ make
320
+ end
321
+ end
322
+ end
323
+ def clean
324
+ extdirs.each do |dir|
325
+ Dir.chdir(dir) do
326
+ make('clean')
327
+ end
328
+ end
329
+ end
330
+ def distclean
331
+ extdirs.each do |dir|
332
+ Dir.chdir(dir) do
333
+ make('distclean')
334
+ end
335
+ end
336
+ end
337
+ def extdirs
338
+ Dir['ext/**/*/{MANIFEST,extconf.rb}'].map do |f|
339
+ File.dirname(f)
340
+ end.uniq
341
+ end
342
+ def make(task=nil)
343
+ return unless File.exist?('Makefile')
344
+ bash(*[config.makeprog, task].compact)
345
+ end
346
+ end
347
+ end
348
+ require 'rbconfig'
349
+ require 'fileutils'
350
+ require 'erb'
351
+ require 'yaml'
352
+ require 'shellwords'
353
+ module Setup
354
+ class Configuration
355
+ RBCONFIG = ::RbConfig::CONFIG
356
+ META_CONFIG_FILE = META_EXTENSION_DIR + '/metaconfig.rb'
357
+ def self.options
358
+ @@options ||= []
359
+ end
360
+ def self.option(name, *args) #type, description)
361
+ options << [name.to_s, *args] #type, description]
362
+ attr_accessor(name)
363
+ end
364
+ option :prefix , :path, 'path prefix of target environment'
365
+ option :bindir , :path, 'directory for commands'
366
+ option :libdir , :path, 'directory for libraries'
367
+ option :datadir , :path, 'directory for shared data'
368
+ option :mandir , :path, 'directory for man pages'
369
+ option :docdir , :path, 'directory for documentation'
370
+ option :rbdir , :path, 'directory for ruby scripts'
371
+ option :sodir , :path, 'directory for ruby extentions'
372
+ option :sysconfdir , :path, 'directory for system configuration files'
373
+ option :localstatedir , :path, 'directory for local state data'
374
+ option :libruby , :path, 'directory for ruby libraries'
375
+ option :librubyver , :path, 'directory for standard ruby libraries'
376
+ option :librubyverarch , :path, 'directory for standard ruby extensions'
377
+ option :siteruby , :path, 'directory for version-independent aux ruby libraries'
378
+ option :siterubyver , :path, 'directory for aux ruby libraries'
379
+ option :siterubyverarch , :path, 'directory for aux ruby binaries'
380
+ option :rubypath , :prog, 'path to set to #! line'
381
+ option :rubyprog , :prog, 'ruby program used for installation'
382
+ option :makeprog , :prog, 'make program to compile ruby extentions'
383
+ option :extconfopt , :opts, 'options to pass-thru to extconf.rb'
384
+ option :shebang , :pick, 'shebang line (#!) editing mode (all,ruby,never)'
385
+ option :no_test, :t , :bool, 'run pre-installation tests'
386
+ option :no_doc , :bool, 'install doc/ directory'
387
+ option :no_ext , :bool, 'compile/install ruby extentions'
388
+ option :install_prefix , :path, 'install to alternate root location'
389
+ option :root , :path, 'install to alternate root location'
390
+ option :installdirs , :pick, 'install location mode (site,std,home)' #, local)
391
+ option :type , :pick, 'install location mode (site,std,home)'
392
+ ::RbConfig::CONFIG.each do |key,val|
393
+ next if key == "configure_args"
394
+ name = key.to_s.downcase
395
+ define_method(name){ val }
396
+ end
397
+ config_args = Shellwords.shellwords(::RbConfig::CONFIG["configure_args"])
398
+ config_args.each do |ent|
399
+ if ent.index("=")
400
+ key, val = *ent.split("=")
401
+ else
402
+ key, val = ent, true
403
+ end
404
+ name = key.downcase
405
+ name = name.sub(/^--/,'')
406
+ name = name.gsub(/-/,'_')
407
+ define_method(name){ val }
408
+ end
409
+ def options
410
+ self.class.options
411
+ end
412
+ def initialize(values={})
413
+ initialize_metaconfig
414
+ initialize_defaults
415
+ initialize_environment
416
+ initialize_configfile unless values[:reset]
417
+ values.each{ |k,v| __send__("#{k}=", v) }
418
+ yield(self) if block_given?
419
+ end
420
+ def initialize_metaconfig
421
+ if File.exist?(META_CONFIG_FILE)
422
+ script = File.read(META_CONFIG_FILE)
423
+ (class << self; self; end).class_eval(script)
424
+ end
425
+ end
426
+ def initialize_defaults
427
+ self.type = 'site'
428
+ self.no_ri = true
429
+ self.no_test = true
430
+ self.no_doc = true
431
+ self.no_ext = false
432
+ end
433
+ def initialize_environment
434
+ options.each do |name, *args|
435
+ if value = ENV["RUBYSETUP_#{name.to_s.upcase}"]
436
+ __send__("#{name}=", value)
437
+ end
438
+ end
439
+ end
440
+ def initialize_configfile
441
+ if exist?
442
+ erb = ERB.new(File.read(CONFIG_FILE))
443
+ txt = erb.result(binding)
444
+ dat = YAML.load(txt)
445
+ dat.each do |k, v|
446
+ next if 'type' == k
447
+ next if 'installdirs' == k
448
+ k = k.gsub('-','_')
449
+ __send__("#{k}=", v)
450
+ end
451
+ if dat['type']
452
+ self.type = dat['type']
453
+ end
454
+ if dat['installdirs']
455
+ self.installdirs = dat['installdirs']
456
+ end
457
+ end
458
+ end
459
+ attr_accessor :reset
460
+ def base_bindir
461
+ @base_bindir ||= subprefix('bindir')
462
+ end
463
+ def base_libdir
464
+ @base_libdir ||= subprefix('libdir')
465
+ end
466
+ def base_datadir
467
+ @base_datadir ||= subprefix('datadir')
468
+ end
469
+ def base_mandir
470
+ @base_mandir ||= subprefix('mandir')
471
+ end
472
+ def base_docdir
473
+ @base_docdir || File.dirname(subprefix('docdir'))
474
+ end
475
+ def base_rubylibdir
476
+ @rubylibdir ||= subprefix('rubylibdir')
477
+ end
478
+ def base_rubyarchdir
479
+ @base_rubyarchdir ||= subprefix('archdir')
480
+ end
481
+ def base_sysconfdir
482
+ @base_sysconfdir ||= subprefix('sysconfdir')
483
+ end
484
+ def base_localstatedir
485
+ @base_localstatedir ||= subprefix('localstatedir')
486
+ end
487
+ def type
488
+ @type ||= 'site'
489
+ end
490
+ def type=(val)
491
+ @type = val
492
+ case val.to_s
493
+ when 'std', 'ruby'
494
+ @rbdir = librubyver #'$librubyver'
495
+ @sodir = librubyverarch #'$librubyverarch'
496
+ when 'site'
497
+ @rbdir = siterubyver #'$siterubyver'
498
+ @sodir = siterubyverarch #'$siterubyverarch'
499
+ when 'home'
500
+ self.prefix = File.join(home, '.local') # TODO: Use XDG
501
+ @rbdir = nil #'$libdir/ruby'
502
+ @sodir = nil #'$libdir/ruby'
503
+ else
504
+ raise Error, "bad config: use type=(std|site|home) [#{val}]"
505
+ end
506
+ end
507
+ alias_method :installdirs, :type
508
+ alias_method :installdirs=, :type=
509
+ alias_method :install_prefix, :root
510
+ alias_method :install_prefix=, :root=
511
+ def prefix
512
+ @prefix ||= RBCONFIG['prefix']
513
+ end
514
+ def prefix=(path)
515
+ @prefix = pathname(path)
516
+ end
517
+ def libruby
518
+ @libruby ||= RBCONFIG['prefix'] + "/lib/ruby"
519
+ end
520
+ def libruby=(path)
521
+ path = pathname(path)
522
+ @librubyver = librubyver.sub(libruby, path)
523
+ @librubyverarch = librubyverarch.sub(libruby, path)
524
+ @libruby = path
525
+ end
526
+ def librubyver
527
+ @librubyver ||= RBCONFIG['rubylibdir']
528
+ end
529
+ def librubyver=(path)
530
+ @librubyver = pathname(path)
531
+ end
532
+ def librubyverarch
533
+ @librubyverarch ||= RBCONFIG['archdir']
534
+ end
535
+ def librubyverarch=(path)
536
+ @librubyverarch = pathname(path)
537
+ end
538
+ def siteruby
539
+ @siteruby ||= RBCONFIG['sitedir']
540
+ end
541
+ def siteruby=(path)
542
+ path = pathname(path)
543
+ @siterubyver = siterubyver.sub(siteruby, path)
544
+ @siterubyverarch = siterubyverarch.sub(siteruby, path)
545
+ @siteruby = path
546
+ end
547
+ def siterubyver
548
+ @siterubyver ||= RBCONFIG['sitelibdir']
549
+ end
550
+ def siterubyver=(path)
551
+ @siterubyver = pathname(path)
552
+ end
553
+ def siterubyverarch
554
+ @siterubyverarch ||= RBCONFIG['sitearchdir']
555
+ end
556
+ def siterubyverarch=(path)
557
+ @siterubyverarch = pathname(path)
558
+ end
559
+ def bindir
560
+ @bindir || File.join(prefix, base_bindir)
561
+ end
562
+ def bindir=(path)
563
+ @bindir = pathname(path)
564
+ end
565
+ def libdir
566
+ @libdir || File.join(prefix, base_libdir)
567
+ end
568
+ def libdir=(path)
569
+ @libdir = pathname(path)
570
+ end
571
+ def datadir
572
+ @datadir || File.join(prefix, base_datadir)
573
+ end
574
+ def datadir=(path)
575
+ @datadir = pathname(path)
576
+ end
577
+ def mandir
578
+ @mandir || File.join(prefix, base_mandir)
579
+ end
580
+ def mandir=(path)
581
+ @mandir = pathname(path)
582
+ end
583
+ def docdir
584
+ @docdir || File.join(prefix, base_docdir)
585
+ end
586
+ def docdir=(path)
587
+ @docdir = pathname(path)
588
+ end
589
+ def rbdir
590
+ @rbdir || File.join(prefix, base_rubylibdir)
591
+ end
592
+ def sodir
593
+ @sodir || File.join(prefix, base_rubyarchdir)
594
+ end
595
+ def sysconfdir
596
+ @sysconfdir ||= base_sysconfdir
597
+ end
598
+ def sysconfdir=(path)
599
+ @sysconfdir = pathname(path)
600
+ end
601
+ def localstatedir
602
+ @localstatedir ||= base_localstatedir
603
+ end
604
+ def localstatedir=(path)
605
+ @localstatedir = pathname(path)
606
+ end
607
+ def rubypath
608
+ @rubypath ||= File.join(RBCONFIG['bindir'], RBCONFIG['ruby_install_name'] + RBCONFIG['EXEEXT'])
609
+ end
610
+ def rubypath=(path)
611
+ @rubypath = pathname(path)
612
+ end
613
+ def rubyprog
614
+ @rubyprog || rubypath
615
+ end
616
+ def rubyprog=(command)
617
+ @rubyprog = command
618
+ end
619
+ def makeprog
620
+ @makeprog ||= (
621
+ if arg = RBCONFIG['configure_args'].split.detect {|arg| /--with-make-prog=/ =~ arg }
622
+ arg.sub(/'/, '').split(/=/, 2)[1]
623
+ else
624
+ 'make'
625
+ end
626
+ )
627
+ end
628
+ def makeprog=(command)
629
+ @makeprog = command
630
+ end
631
+ def extconfopt
632
+ @extconfopt ||= ''
633
+ end
634
+ def extconfopt=(string)
635
+ @extconfopt = string
636
+ end
637
+ def shebang
638
+ @shebang ||= 'ruby'
639
+ end
640
+ def shebang=(val)
641
+ if %w(all ruby never).include?(val)
642
+ @shebang = val
643
+ else
644
+ raise Error, "bad config: use SHEBANG=(all|ruby|never) [#{val}]"
645
+ end
646
+ end
647
+ def no_ext
648
+ @no_ext
649
+ end
650
+ def no_ext=(val)
651
+ @no_ext = boolean(val)
652
+ end
653
+ def no_test
654
+ @no_test
655
+ end
656
+ def no_test=(val)
657
+ @no_test = boolean(val)
658
+ end
659
+ def no_doc
660
+ @no_doc
661
+ end
662
+ def no_doc=(val)
663
+ @no_doc = boolean(val)
664
+ end
665
+ def no_ri
666
+ @no_ri
667
+ end
668
+ def no_ri=(val)
669
+ @no_ri = boolean(val)
670
+ end
671
+ def compile?
672
+ !no_ext
673
+ end
674
+ def test?
675
+ !no_test
676
+ end
677
+ def doc?
678
+ !no_doc
679
+ end
680
+ def to_h
681
+ h = {}
682
+ options.each do |name, *args|
683
+ h[name.to_s] = __send__(name)
684
+ end
685
+ h
686
+ end
687
+ def to_s
688
+ to_yaml.sub(/\A---\s*\n/,'')
689
+ end
690
+ def to_yaml(*args)
691
+ to_h.to_yaml(*args)
692
+ end
693
+ def save_config
694
+ out = to_yaml
695
+ if not File.exist?(File.dirname(CONFIG_FILE))
696
+ FileUtils.mkdir_p(File.dirname(CONFIG_FILE))
697
+ end
698
+ if File.exist?(CONFIG_FILE)
699
+ txt = File.read(CONFIG_FILE)
700
+ return nil if txt == out
701
+ end
702
+ File.open(CONFIG_FILE, 'w'){ |f| f << out }
703
+ true
704
+ end
705
+ def exist?
706
+ File.exist?(CONFIG_FILE)
707
+ end
708
+ private
709
+ def pathname(path)
710
+ path.gsub(%r<\\$([^/]+)>){ self[$1] }
711
+ end
712
+ def boolean(val, name=nil)
713
+ case val
714
+ when true, false, nil
715
+ val
716
+ else
717
+ case val.to_s.downcase
718
+ when 'y', 'yes', 't', 'true'
719
+ true
720
+ when 'n', 'no', 'f', 'false'
721
+ false
722
+ else
723
+ raise Error, "bad config: use --#{name}=(yes|no) [\#{val}]"
724
+ end
725
+ end
726
+ end
727
+ def subprefix(path, with='')
728
+ val = RBCONFIG[path]
729
+ raise "Unknown path -- #{path}" if val.nil?
730
+ prefix = Regexp.quote(RBCONFIG['prefix'])
731
+ val.sub(/\A#{prefix}/, with)
732
+ end
733
+ def home
734
+ ENV['HOME'] || raise(Error, 'HOME is not set.')
735
+ end
736
+ end #class ConfigTable
737
+ end #module Setup
738
+ =begin
739
+ def inintialize_metaconfig
740
+ path = Dir.glob(METACONFIG_FILE).first
741
+ if path && File.file?(path)
742
+ MetaConfigEnvironment.new(self).instance_eval(File.read(path), path)
743
+ end
744
+ end
745
+ class MetaConfigEnvironment
746
+ def initialize(config) #, installer)
747
+ @config = config
748
+ end
749
+ def config_names
750
+ @config.descriptions.collect{ |n, t, d| n.to_s }
751
+ end
752
+ def config?(name)
753
+ @config.descriptions.find do |sym, type, desc|
754
+ sym.to_s == name.to_s
755
+ end
756
+ end
757
+ def bool_config?(name)
758
+ @config.descriptions.find do |sym, type, desc|
759
+ sym.to_s == name.to_s && type == :bool
760
+ end
761
+ end
762
+ def path_config?(name)
763
+ @config.descriptions.find do |sym, type, desc|
764
+ sym.to_s == name.to_s && type == :path
765
+ end
766
+ end
767
+ def value_config?(name)
768
+ @config.descriptions.find do |sym, type, desc|
769
+ sym.to_s == name.to_s && type != :prog
770
+ end
771
+ end
772
+ def add_config(name, default, desc)
773
+ @config.descriptions << [name.to_sym, nil, desc]
774
+ end
775
+ def add_bool_config(name, default, desc)
776
+ @config.descriptions << [name.to_sym, :bool, desc]
777
+ end
778
+ def add_path_config(name, default, desc)
779
+ @config.descriptions << [name.to_sym, :path, desc]
780
+ end
781
+ def set_config_default(name, default)
782
+ @config[name] = default
783
+ end
784
+ def remove_config(name)
785
+ item = @config.descriptions.find do |sym, type, desc|
786
+ sym.to_s == name.to_s
787
+ end
788
+ index = @config.descriptions.index(item)
789
+ @config.descriptions.delete(index)
790
+ end
791
+ end
792
+ =end
793
+ module Setup
794
+ class Installer < Base
795
+ def install_prefix
796
+ config.install_prefix
797
+ end
798
+ def install
799
+ Dir.chdir(rootdir) do
800
+ install_bin
801
+ install_ext
802
+ install_lib
803
+ install_data
804
+ install_man
805
+ install_doc
806
+ install_etc
807
+ prune_install_record
808
+ end
809
+ end
810
+ def install_bin
811
+ return unless directory?('bin')
812
+ report_transfer('bin', config.bindir)
813
+ files = files('bin')
814
+ install_files('bin', files, config.bindir, 0755)
815
+ end
816
+ def install_ext
817
+ return unless directory?('ext')
818
+ report_transfer('ext', config.sodir)
819
+ files = files('ext')
820
+ files = select_dllext(files)
821
+ files.each do |file|
822
+ name = File.join(File.dirname(File.dirname(file)), File.basename(file))
823
+ dest = destination(config.sodir, name)
824
+ install_file('ext', file, dest, 0555, install_prefix)
825
+ end
826
+ end
827
+ def install_lib
828
+ return unless directory?('lib')
829
+ report_transfer('lib', config.rbdir)
830
+ files = files('lib')
831
+ install_files('lib', files, config.rbdir, 0644)
832
+ end
833
+ def install_data
834
+ return unless directory?('data')
835
+ report_transfer('data', config.datadir)
836
+ files = files('data')
837
+ install_files('data', files, config.datadir, 0644)
838
+ end
839
+ def install_etc
840
+ return unless directory?('etc')
841
+ report_transfer('etc', config.sysconfdir)
842
+ files = files('etc')
843
+ install_files('etc', files, config.sysconfdir, 0644)
844
+ end
845
+ def install_man
846
+ return unless directory?('man')
847
+ report_transfer('man', config.mandir)
848
+ files = files('man')
849
+ install_files('man', files, config.mandir, 0644)
850
+ end
851
+ def install_doc
852
+ return unless config.doc?
853
+ return unless directory?('doc')
854
+ return unless project.name
855
+ dir = File.join(config.docdir, "ruby-#{project.name}")
856
+ report_transfer('doc', dir)
857
+ files = files('doc')
858
+ install_files('doc', files, dir, 0644)
859
+ end
860
+ private
861
+ def report_transfer(source, directory)
862
+ unless quiet?
863
+ if install_prefix
864
+ out = File.join(install_prefix, directory)
865
+ else
866
+ out = directory
867
+ end
868
+ io.puts "* #{source} -> #{out}"
869
+ end
870
+ end
871
+ def directory?(path)
872
+ File.directory?(path)
873
+ end
874
+ def files(dir)
875
+ files = Dir["#{dir}/**/*"]
876
+ files = files.select{ |f| File.file?(f) }
877
+ files = files.map{ |f| f.sub("#{dir}/", '') }
878
+ files
879
+ end
880
+ def select_dllext(files)
881
+ ents = files.select do |file|
882
+ File.extname(file) == ".#{dllext}"
883
+ end
884
+ if ents.empty? && !files.empty?
885
+ raise Error, "ruby extention not compiled: 'setup.rb compile' first"
886
+ end
887
+ ents
888
+ end
889
+ def dllext
890
+ config.dlext
891
+ end
892
+ def install_files(dir, list, dest, mode)
893
+ list.each do |fname|
894
+ rdest = destination(dest, fname)
895
+ install_file(dir, fname, rdest, mode, install_prefix)
896
+ end
897
+ end
898
+ def install_file(dir, from, dest, mode, prefix=nil)
899
+ mkdir_p(File.dirname(dest))
900
+ if trace? or trial?
901
+ io.puts "install #{dir}/#{from} #{dest}"
902
+ end
903
+ return if trial?
904
+ str = binread(File.join(dir, from))
905
+ if diff?(str, dest)
906
+ trace_off {
907
+ rm_f(dest) if File.exist?(dest)
908
+ }
909
+ File.open(dest, 'wb'){ |f| f.write(str) }
910
+ File.chmod(mode, dest)
911
+ end
912
+ record_installation(dest) # record file as installed
913
+ end
914
+ def mkdir_p(dirname) #, prefix=nil)
915
+ return if File.directory?(dirname)
916
+ io.puts "mkdir -p #{dirname}" if trace? or trial?
917
+ return if trial?
918
+ dirs = File.expand_path(dirname).split(%r<(?=/)>)
919
+ if /\A[a-z]:\z/i =~ dirs[0]
920
+ disk = dirs.shift
921
+ dirs[0] = disk + dirs[0]
922
+ end
923
+ dirs.each_index do |idx|
924
+ path = dirs[0..idx].join('')
925
+ unless File.dir?(path)
926
+ Dir.mkdir(path)
927
+ end
928
+ record_installation(path) # record directories made
929
+ end
930
+ end
931
+ def record_installation(path)
932
+ File.open(install_record, 'a') do |f|
933
+ f.puts(path)
934
+ end
935
+ end
936
+ def prune_install_record
937
+ entries = File.read(install_record).split("\n")
938
+ entries.uniq!
939
+ File.open(install_record, 'w') do |f|
940
+ f << entries.join("\n")
941
+ f << "\n"
942
+ end
943
+ end
944
+ def install_record
945
+ @install_record ||= (
946
+ file = INSTALL_RECORD
947
+ dir = File.dirname(file)
948
+ unless File.directory?(dir)
949
+ FileUtils.mkdir_p(dir)
950
+ end
951
+ file
952
+ )
953
+ end
954
+ def destination(dir, file)
955
+ dest = install_prefix ? File.join(install_prefix, File.expand_path(dir)) : dir
956
+ dest = File.join(dest, file) #if File.dir?(dest)
957
+ dest = File.expand_path(dest)
958
+ dest
959
+ end
960
+ def diff?(new_content, path)
961
+ return true unless File.exist?(path)
962
+ new_content != binread(path)
963
+ end
964
+ def binread(fname)
965
+ File.open(fname, 'rb') do |f|
966
+ return f.read
967
+ end
968
+ end
969
+ def install_shebang(files, dir)
970
+ files.each do |file|
971
+ path = File.join(dir, File.basename(file))
972
+ update_shebang_line(path)
973
+ end
974
+ end
975
+ def update_shebang_line(path)
976
+ return if trial?
977
+ return if config.shebang == 'never'
978
+ old = Shebang.load(path)
979
+ if old
980
+ if old.args.size > 1
981
+ $stderr.puts "warning: #{path}"
982
+ $stderr.puts "Shebang line has too many args."
983
+ $stderr.puts "It is not portable and your program may not work."
984
+ end
985
+ new = new_shebang(old)
986
+ return if new.to_s == old.to_s
987
+ else
988
+ return unless config.shebang == 'all'
989
+ new = Shebang.new(config.rubypath)
990
+ end
991
+ $stderr.puts "updating shebang: #{File.basename(path)}" if trace?
992
+ open_atomic_writer(path) do |output|
993
+ File.open(path, 'rb') do |f|
994
+ f.gets if old # discard
995
+ output.puts new.to_s
996
+ output.print f.read
997
+ end
998
+ end
999
+ end
1000
+ def new_shebang(old)
1001
+ if /\Aruby/ =~ File.basename(old.cmd)
1002
+ Shebang.new(config.rubypath, old.args)
1003
+ elsif File.basename(old.cmd) == 'env' and old.args.first == 'ruby'
1004
+ Shebang.new(config.rubypath, old.args[1..-1])
1005
+ else
1006
+ return old unless config.shebang == 'all'
1007
+ Shebang.new(config.rubypath)
1008
+ end
1009
+ end
1010
+ def open_atomic_writer(path, &block)
1011
+ tmpfile = File.basename(path) + '.tmp'
1012
+ begin
1013
+ File.open(tmpfile, 'wb', &block)
1014
+ File.rename tmpfile, File.basename(path)
1015
+ ensure
1016
+ File.unlink tmpfile if File.exist?(tmpfile)
1017
+ end
1018
+ end
1019
+ class Shebang
1020
+ def Shebang.load(path)
1021
+ line = nil
1022
+ File.open(path) {|f|
1023
+ line = f.gets
1024
+ }
1025
+ return nil unless /\A#!/ =~ line
1026
+ parse(line)
1027
+ end
1028
+ def Shebang.parse(line)
1029
+ cmd, *args = *line.strip.sub(/\A\#!/, '').split(' ')
1030
+ new(cmd, args)
1031
+ end
1032
+ def initialize(cmd, args = [])
1033
+ @cmd = cmd
1034
+ @args = args
1035
+ end
1036
+ attr_reader :cmd
1037
+ attr_reader :args
1038
+ def to_s
1039
+ "#! #{@cmd}" + (@args.empty? ? '' : " #{@args.join(' ')}")
1040
+ end
1041
+ end
1042
+ end
1043
+ end
1044
+ module Setup
1045
+ class Tester < Base
1046
+ RUBYSCRIPT = META_EXTENSION_DIR + '/test.rb'
1047
+ SHELLSCRIPT = META_EXTENSION_DIR + '/test.sh'
1048
+ DEPRECATED_RUBYSCRIPT = META_EXTENSION_DIR + '/testrc.rb'
1049
+ def testable?
1050
+ if File.exist?(DEPRECATED_RUBYSCRIPT)
1051
+ warn "Must use `.setup/test.rb' instead or `.setup/testrc.rb' to support testing."
1052
+ end
1053
+ return false if config.no_test
1054
+ return true if File.exist?(RUBYSCRIPT)
1055
+ return true if File.exist?(SHELLSCRIPT)
1056
+ false
1057
+ end
1058
+ def test
1059
+ return true unless testable?
1060
+ if File.exist?(RUBYSCRIPT)
1061
+ test_rubyscript
1062
+ elsif File.exist?(SHELLSCRIPT)
1063
+ test_shellscript
1064
+ else
1065
+ true
1066
+ end
1067
+ end
1068
+ def test_shellscript
1069
+ bash(SHELLSCRIPT)
1070
+ end
1071
+ def test_rubyscript
1072
+ ruby(RUBYSCRIPT)
1073
+ end
1074
+ end
1075
+ end
1076
+ module Setup
1077
+ class Uninstaller < Base
1078
+ def uninstall
1079
+ return unless File.exist?(INSTALL_RECORD)
1080
+ files = []
1081
+ dirs = []
1082
+ paths.each do |path|
1083
+ dirs << path if File.dir?(path)
1084
+ files << path if File.file?(path)
1085
+ end
1086
+ if dirs.empty? && files.empty?
1087
+ io.outs "Nothing to remove."
1088
+ return
1089
+ end
1090
+ files.sort!{ |a,b| b.size <=> a.size }
1091
+ dirs.sort!{ |a,b| b.size <=> a.size }
1092
+ if !force? && !trial?
1093
+ puts (files + dirs).collect{ |f| "#{f}" }.join("\n")
1094
+ puts
1095
+ puts "Must use --force option to remove these files and directories that become empty."
1096
+ return
1097
+ end
1098
+ files.each do |file|
1099
+ rm_f(file)
1100
+ end
1101
+ dirs.each do |dir|
1102
+ entries = Dir.entries(dir)
1103
+ entries.delete('.')
1104
+ entries.delete('..')
1105
+ rmdir(dir) if entries.empty?
1106
+ end
1107
+ rm_f(INSTALL_RECORD)
1108
+ end
1109
+ private
1110
+ def paths
1111
+ @paths ||= (
1112
+ lines = File.read(INSTALL_RECORD).split(/\s*\n/)
1113
+ lines = lines.map{ |line| line.strip }
1114
+ lines = lines.uniq
1115
+ lines = lines.reject{ |line| line.empty? } # skip blank lines
1116
+ lines = lines.reject{ |line| line[0,1] == '#' } # skip blank lines
1117
+ lines
1118
+ )
1119
+ end
1120
+ end
1121
+ end
1122
+ require 'optparse'
1123
+ module Setup
1124
+ class Command
1125
+ def self.run(*argv)
1126
+ new.run(*argv)
1127
+ end
1128
+ def self.tasks
1129
+ @tasks ||= {}
1130
+ end
1131
+ def self.order
1132
+ @order ||= []
1133
+ end
1134
+ def self.task(name, description)
1135
+ tasks[name] = description
1136
+ order << name
1137
+ end
1138
+ task 'show' , "show current configuration"
1139
+ task 'all' , "config, compile and install"
1140
+ task 'config' , "save/customize configuration settings"
1141
+ task 'compile' , "compile ruby extentions"
1142
+ task 'test' , "run test suite"
1143
+ task 'install' , "install project files"
1144
+ task 'clean' , "does `make clean' for each extention"
1145
+ task 'distclean', "does `make distclean' for each extention"
1146
+ task 'uninstall', "uninstall previously installed files"
1147
+ def run(*argv)
1148
+ ARGV.replace(argv) unless argv.empty?
1149
+ task = ARGV.find{ |a| a !~ /^[-]/ }
1150
+ task = 'all' unless task
1151
+ unless task_names.include?(task)
1152
+ $stderr.puts "Not a valid task -- #{task}"
1153
+ exit 1
1154
+ end
1155
+ parser = OptionParser.new
1156
+ options = {}
1157
+ parser.banner = "Usage: #{File.basename($0)} [TASK] [OPTIONS]"
1158
+ optparse_header(parser, options)
1159
+ case task
1160
+ when 'config'
1161
+ optparse_config(parser, options)
1162
+ when 'compile'
1163
+ optparse_compile(parser, options)
1164
+ when 'install'
1165
+ optparse_install(parser, options)
1166
+ when 'all'
1167
+ optparse_all(parser, options)
1168
+ end
1169
+ optparse_common(parser, options)
1170
+ begin
1171
+ parser.parse!(ARGV)
1172
+ rescue OptionParser::InvalidOption
1173
+ $stderr.puts $!.to_s.capitalize
1174
+ exit 1
1175
+ end
1176
+ rootdir = session.project.rootdir
1177
+ print_header
1178
+ begin
1179
+ $stderr.puts "(#{RUBY_ENGINE} #{RUBY_VERSION} #{RUBY_PLATFORM})"
1180
+ rescue
1181
+ $stderr.puts "(#{RUBY_VERSION} #{RUBY_PLATFORM})"
1182
+ end
1183
+ begin
1184
+ session.__send__(task)
1185
+ rescue Error => err
1186
+ raise err if $DEBUG
1187
+ $stderr.puts $!.message
1188
+ $stderr.puts "Try 'setup.rb --help' for detailed usage."
1189
+ abort $!.message #exit 1
1190
+ end
1191
+ puts unless session.quiet?
1192
+ end
1193
+ def session
1194
+ @session ||= Session.new(:io=>$stdout)
1195
+ end
1196
+ def configuration
1197
+ @configuration ||= session.configuration
1198
+ end
1199
+ def optparse_header(parser, options)
1200
+ parser.banner = "USAGE: #{File.basename($0)} [command] [options]"
1201
+ end
1202
+ def optparse_all(parser, options)
1203
+ optparse_config(parser, options)
1204
+ optparse_compile(parser, options)
1205
+ optparse_install(parser, options) # TODO: why was this remarked out ?
1206
+ end
1207
+ def optparse_config(parser, options)
1208
+ parser.separator ""
1209
+ parser.separator "Configuration options:"
1210
+ configuration.options.each do |args|
1211
+ args = args.dup
1212
+ desc = args.pop
1213
+ type = args.pop
1214
+ name, shortcut = *args
1215
+ optname = name.to_s.gsub('_', '-')
1216
+ case type
1217
+ when :bool
1218
+ if optname.index('no-') == 0
1219
+ optname = "[no-]" + optname.sub(/^no-/, '')
1220
+ opts = shortcut ? ["-#{shortcut}", "--#{optname}", desc] : ["--#{optname}", desc]
1221
+ parser.on(*opts) do |val|
1222
+ configuration.__send__("#{name}=", !val)
1223
+ end
1224
+ else
1225
+ optname = "[no-]" + optname.sub(/^no-/, '')
1226
+ opts = shortcut ? ["-#{shortcut}", "--#{optname}", desc] : ["--#{optname}", desc]
1227
+ parser.on(*opts) do |val|
1228
+ configuration.__send__("#{name}=", val)
1229
+ end
1230
+ end
1231
+ else
1232
+ opts = shortcut ? ["-#{shortcut}", "--#{optname} #{type.to_s.upcase}", desc] :
1233
+ ["--#{optname} #{type.to_s.upcase}", desc]
1234
+ parser.on(*opts) do |val|
1235
+ configuration.__send__("#{name}=", val)
1236
+ end
1237
+ end
1238
+ end
1239
+ end
1240
+ def optparse_compile(parser, options)
1241
+ end
1242
+ def optparse_install(parser, options)
1243
+ parser.separator ''
1244
+ parser.separator 'Install options:'
1245
+ parser.on('--prefix PATH', 'install to alternate root location') do |val|
1246
+ configuration.install_prefix = val
1247
+ end
1248
+ parser.on('--type TYPE', "install location mode (site,std,home)") do |val|
1249
+ configuration.type = val
1250
+ end
1251
+ parser.on('-t', '--[no-]test', "run pre-installation tests") do |bool|
1252
+ configuration.test = bool
1253
+ end
1254
+ end
1255
+ def optparse_common(parser, options)
1256
+ parser.separator ""
1257
+ parser.separator "General options:"
1258
+ parser.on("-q", "--quiet", "Suppress output") do
1259
+ session.quiet = true
1260
+ end
1261
+ parser.on("-f", "--force", "Force operation") do
1262
+ session.force = true
1263
+ end
1264
+ parser.on("--trace", "--verbose", "Watch execution") do |val|
1265
+ session.trace = true
1266
+ end
1267
+ parser.on("--trial", "--no-harm", "Do not write to disk") do |val|
1268
+ session.trial = true
1269
+ end
1270
+ parser.on("--debug", "Turn on debug mode") do |val|
1271
+ $DEBUG = true
1272
+ end
1273
+ parser.separator ""
1274
+ parser.separator "Inform options:"
1275
+ parser.on_tail("-h", "--help", "display this help information") do
1276
+ puts parser
1277
+ exit
1278
+ end
1279
+ parser.on_tail("--version", "-v", "Show version") do
1280
+ puts File.basename($0) + ' v' + Setup::VERSION #Version.join('.')
1281
+ exit
1282
+ end
1283
+ parser.on_tail("--copyright", "Show copyright") do
1284
+ puts Setup::COPYRIGHT #opyright
1285
+ exit
1286
+ end
1287
+ end
1288
+ def task_names
1289
+ self.class.tasks.keys
1290
+ end
1291
+ def print_header
1292
+ end
1293
+ end
1294
+ end
1295
+ Setup::Command.run