scout 2.0.4 → 2.0.5
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/AUTHORS +4 -0
- data/{History.txt → CHANGELOG} +7 -3
- data/COPYING +340 -0
- data/INSTALL +18 -0
- data/{License.txt → LICENSE} +1 -2
- data/{README.txt → README} +21 -21
- data/Rakefile +158 -4
- data/TODO +6 -0
- data/lib/scout.rb +4 -1
- data/lib/scout/command.rb +1 -1
- data/lib/scout/server.rb +1 -1
- data/setup.rb +574 -799
- data/test/scout_test.rb +91 -0
- metadata +36 -57
- data/Manifest.txt +0 -33
- data/PostInstall.txt +0 -7
- data/config/hoe.rb +0 -73
- data/config/requirements.rb +0 -15
- data/lib/scout/version.rb +0 -9
- data/script/console +0 -10
- data/script/destroy +0 -14
- data/script/generate +0 -14
- data/script/txt2html +0 -82
- data/tasks/deployment.rake +0 -34
- data/tasks/environment.rake +0 -7
- data/tasks/website.rake +0 -17
- data/test/test_helper.rb +0 -2
- data/test/test_scout.rb +0 -11
- data/website/index.html +0 -138
- data/website/index.txt +0 -81
- data/website/javascripts/rounded_corners_lite.inc.js +0 -285
- data/website/stylesheets/screen.css +0 -138
- data/website/template.html.erb +0 -48
data/Rakefile
CHANGED
@@ -1,4 +1,158 @@
|
|
1
|
-
require
|
2
|
-
require
|
3
|
-
|
4
|
-
|
1
|
+
require "rake/rdoctask"
|
2
|
+
require "rake/testtask"
|
3
|
+
require "rake/gempackagetask"
|
4
|
+
require "rake/contrib/rubyforgepublisher"
|
5
|
+
require "net/ssh"
|
6
|
+
|
7
|
+
require "rubygems"
|
8
|
+
require "rubyforge"
|
9
|
+
|
10
|
+
dir = File.dirname(__FILE__)
|
11
|
+
lib = File.join(dir, "lib", "scout.rb")
|
12
|
+
version = File.read(lib)[/^\s*VERSION\s*=\s*(['"])(\d\.\d\.\d)\1/, 2]
|
13
|
+
history = File.read("CHANGELOG").split(/^(===.*)/)
|
14
|
+
changes ||= history[0..2].join.strip
|
15
|
+
|
16
|
+
need_tar = true
|
17
|
+
need_zip = true
|
18
|
+
|
19
|
+
task :default => [:test]
|
20
|
+
|
21
|
+
Rake::TestTask.new do |test|
|
22
|
+
test.libs << "test"
|
23
|
+
test.test_files = [ "test/scout_test.rb" ]
|
24
|
+
test.verbose = true
|
25
|
+
end
|
26
|
+
|
27
|
+
Rake::RDocTask.new do |rdoc|
|
28
|
+
rdoc.main = "README"
|
29
|
+
rdoc.rdoc_dir = "doc/html"
|
30
|
+
rdoc.title = "Scout Client Documentation"
|
31
|
+
rdoc.rdoc_files.include( "README", "INSTALL",
|
32
|
+
"TODO", "CHANGELOG",
|
33
|
+
"AUTHORS", "COPYING",
|
34
|
+
"LICENSE", "lib/" )
|
35
|
+
end
|
36
|
+
|
37
|
+
spec = Gem::Specification.new do |spec|
|
38
|
+
spec.name = "scout"
|
39
|
+
spec.version = version
|
40
|
+
|
41
|
+
spec.platform = Gem::Platform::RUBY
|
42
|
+
spec.summary = "Scout makes monitoring and reporting on your web applications as flexible and simple as possible."
|
43
|
+
|
44
|
+
# TODO: test suite
|
45
|
+
# spec.test_suite_file = "test/ts_all.rb"
|
46
|
+
spec.files = Dir.glob("{lib,test,examples}/**/*.rb").
|
47
|
+
reject { |item| item.include?(".svn") } +
|
48
|
+
Dir.glob("{test,examples}/**/*.csv").
|
49
|
+
reject { |item| item.include?(".svn") } +
|
50
|
+
["Rakefile", "setup.rb"]
|
51
|
+
spec.executables = ["scout"]
|
52
|
+
|
53
|
+
spec.has_rdoc = true
|
54
|
+
spec.extra_rdoc_files = %w[ AUTHORS COPYING README INSTALL TODO CHANGELOG
|
55
|
+
LICENSE ]
|
56
|
+
spec.rdoc_options << "--title" << "Scout Client Documentation" <<
|
57
|
+
"--main" << "README"
|
58
|
+
|
59
|
+
spec.require_path = "lib"
|
60
|
+
|
61
|
+
spec.add_dependency "elif"
|
62
|
+
# spec.add_dependency "hpricot", "=0.6"
|
63
|
+
|
64
|
+
spec.author = "Highgroove Studios"
|
65
|
+
spec.email = "scout@highgroove.com"
|
66
|
+
spec.rubyforge_project = "scout"
|
67
|
+
spec.homepage = "http://scoutapp.com"
|
68
|
+
spec.description = <<END_DESC
|
69
|
+
Scout makes monitoring and reporting on your web applications as flexible and simple as possible.
|
70
|
+
|
71
|
+
Scout is a product of Highgroove Studios.
|
72
|
+
END_DESC
|
73
|
+
end
|
74
|
+
|
75
|
+
Rake::GemPackageTask.new(spec) do |pkg|
|
76
|
+
pkg.need_zip = need_tar
|
77
|
+
pkg.need_tar = need_zip
|
78
|
+
end
|
79
|
+
|
80
|
+
desc "Publishes to Scout Gem Server and Rubyforge"
|
81
|
+
task :publish => [:package, :publish_scout, :publish_rubyforge]
|
82
|
+
|
83
|
+
desc "Publish Gem to Scout Gem Server"
|
84
|
+
task :publish_scout => [:package] do
|
85
|
+
|
86
|
+
puts "Publishing on Scout Server"
|
87
|
+
sh "scp -r pkg/*.gem " +
|
88
|
+
"deploy@gems.scoutapp.com:/var/www/gems/gems"
|
89
|
+
ssh = Net::SSH.start('gems.scoutapp.com','deploy')
|
90
|
+
ssh_shell = ssh.shell.sync
|
91
|
+
ssh_out = ssh_shell.send_command "/usr/bin/gem generate_index -d /var/www/gems"
|
92
|
+
puts "Published, and updated gem server." if ssh_out.stdout.empty? && !ssh_out.stderr
|
93
|
+
end
|
94
|
+
|
95
|
+
desc "Publishes Gem to Rubyforge"
|
96
|
+
task :publish_rubyforge => [:package] do
|
97
|
+
pkg = "pkg/#{spec.name}-#{version}"
|
98
|
+
|
99
|
+
if $DEBUG then
|
100
|
+
puts "release_id = rf.add_release #{spec.rubyforge_project.inspect}, #{spec.name.inspect}, #{spec.version.inspect}, \"#{pkg}.tgz\""
|
101
|
+
puts "rf.add_file #{spec.rubyforge_project.inspect}, #{spec.name.inspect}, release_id, \"#{pkg}.gem\""
|
102
|
+
end
|
103
|
+
|
104
|
+
puts "Publishing on RubyForge"
|
105
|
+
rf = RubyForge.new
|
106
|
+
rf.configure
|
107
|
+
puts "Logging in"
|
108
|
+
puts rf.inspect
|
109
|
+
rf.login
|
110
|
+
|
111
|
+
c = rf.userconfig
|
112
|
+
c["release_notes"] = spec.description if spec.description
|
113
|
+
c["release_changes"] = changes if changes
|
114
|
+
c["preformatted"] = true
|
115
|
+
|
116
|
+
files = [(need_tar ? "#{pkg}.tgz" : nil),
|
117
|
+
(need_zip ? "#{pkg}.zip" : nil),
|
118
|
+
"#{pkg}.gem"].compact
|
119
|
+
|
120
|
+
puts "Releasing #{spec.name} v. #{version}"
|
121
|
+
rf.add_release spec.rubyforge_project, spec.name, version, *files
|
122
|
+
end
|
123
|
+
|
124
|
+
desc "Upload current documentation to Scout Gem Server and RubyForge"
|
125
|
+
task :upload_docs => [:rdoc] do
|
126
|
+
sh "scp -r doc/html/* " +
|
127
|
+
"deploy@gems.scoutapp.com:/var/www/gems/docs"
|
128
|
+
|
129
|
+
config = YAML.load(File.read(File.expand_path("~/.rubyforge/user-config.yml")))
|
130
|
+
host = "#{config["username"]}@rubyforge.org"
|
131
|
+
|
132
|
+
remote_dir = "/var/www/gforge-projects/#{spec.rubyforge_project}"
|
133
|
+
local_dir = 'doc/html'
|
134
|
+
|
135
|
+
sh %{rsync -av --delete #{local_dir}/ #{host}:#{remote_dir}}
|
136
|
+
end
|
137
|
+
|
138
|
+
desc "Publish Beta Gem to Scout Gem Server"
|
139
|
+
task :publish_beta_scout => [:package] do
|
140
|
+
|
141
|
+
puts "Publishing on Scout Server"
|
142
|
+
sh "scp -r pkg/*.gem " +
|
143
|
+
"deploy@gems.scoutapp.com:/var/www/beta-gems/gems"
|
144
|
+
ssh = Net::SSH.start('gems.scoutapp.com','deploy')
|
145
|
+
ssh_shell = ssh.shell.sync
|
146
|
+
ssh_out = ssh_shell.send_command "/usr/bin/gem generate_index -d /var/www/beta-gems"
|
147
|
+
puts "Published, and updated gem server." if ssh_out.stdout.empty? && !ssh_out.stderr
|
148
|
+
|
149
|
+
sh "scp -r doc/html/* " +
|
150
|
+
"deploy@gems.scoutapp.com:/var/www/beta-gems/docs"
|
151
|
+
|
152
|
+
end
|
153
|
+
|
154
|
+
|
155
|
+
desc "Add new files to Subersion"
|
156
|
+
task :svn_add do
|
157
|
+
system "svn status | grep '^\?' | sed -e 's/? *//' | sed -e 's/ /\ /g' | xargs svn add"
|
158
|
+
end
|
data/TODO
ADDED
data/lib/scout.rb
CHANGED
data/lib/scout/command.rb
CHANGED
data/lib/scout/server.rb
CHANGED
@@ -248,7 +248,7 @@ module Scout
|
|
248
248
|
|
249
249
|
def urlify(url_name, options = Hash.new)
|
250
250
|
return unless @server
|
251
|
-
options.merge!(:client_version => Scout::VERSION
|
251
|
+
options.merge!(:client_version => Scout::VERSION)
|
252
252
|
URI.join( @server,
|
253
253
|
URLS[url_name].
|
254
254
|
gsub(/\bCLIENT_KEY\b/, @client_key).
|
data/setup.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
#
|
2
2
|
# setup.rb
|
3
3
|
#
|
4
|
-
# Copyright (c) 2000-
|
4
|
+
# Copyright (c) 2000-2004 Minero Aoki
|
5
5
|
#
|
6
6
|
# This program is free software.
|
7
7
|
# You can distribute/modify this program under the terms of
|
@@ -22,68 +22,176 @@ unless File.respond_to?(:read) # Ruby 1.6
|
|
22
22
|
end
|
23
23
|
end
|
24
24
|
|
25
|
-
unless Errno.const_defined?(:ENOTEMPTY) # Windows?
|
26
|
-
module Errno
|
27
|
-
class ENOTEMPTY
|
28
|
-
# We do not raise this exception, implementation is not needed.
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
25
|
def File.binread(fname)
|
34
26
|
open(fname, 'rb') {|f|
|
35
27
|
return f.read
|
36
28
|
}
|
37
29
|
end
|
38
30
|
|
39
|
-
# for corrupted
|
31
|
+
# for corrupted windows stat(2)
|
40
32
|
def File.dir?(path)
|
41
33
|
File.directory?((path[-1,1] == '/') ? path : path + '/')
|
42
34
|
end
|
43
35
|
|
44
36
|
|
45
|
-
class
|
37
|
+
class SetupError < StandardError; end
|
46
38
|
|
47
|
-
|
39
|
+
def setup_rb_error(msg)
|
40
|
+
raise SetupError, msg
|
41
|
+
end
|
48
42
|
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
43
|
+
#
|
44
|
+
# Config
|
45
|
+
#
|
46
|
+
|
47
|
+
if arg = ARGV.detect {|arg| /\A--rbconfig=/ =~ arg }
|
48
|
+
ARGV.delete(arg)
|
49
|
+
require arg.split(/=/, 2)[1]
|
50
|
+
$".push 'rbconfig.rb'
|
51
|
+
else
|
52
|
+
require 'rbconfig'
|
53
|
+
end
|
54
|
+
|
55
|
+
def multipackage_install?
|
56
|
+
FileTest.directory?(File.dirname($0) + '/packages')
|
57
|
+
end
|
58
|
+
|
59
|
+
|
60
|
+
class ConfigItem
|
61
|
+
def initialize(name, template, default, desc)
|
62
|
+
@name = name.freeze
|
63
|
+
@template = template
|
64
|
+
@value = default
|
65
|
+
@default = default.dup.freeze
|
66
|
+
@description = desc
|
58
67
|
end
|
59
68
|
|
60
|
-
|
61
|
-
|
69
|
+
attr_reader :name
|
70
|
+
attr_reader :description
|
62
71
|
|
63
|
-
|
72
|
+
attr_accessor :default
|
73
|
+
alias help_default default
|
64
74
|
|
65
|
-
def
|
66
|
-
@
|
75
|
+
def help_opt
|
76
|
+
"--#{@name}=#{@template}"
|
67
77
|
end
|
68
78
|
|
69
|
-
|
79
|
+
def value
|
80
|
+
@value
|
81
|
+
end
|
70
82
|
|
71
|
-
def
|
72
|
-
@
|
83
|
+
def eval(table)
|
84
|
+
@value.gsub(%r<\$([^/]+)>) { table[$1] }
|
73
85
|
end
|
74
86
|
|
75
|
-
def
|
76
|
-
|
87
|
+
def set(val)
|
88
|
+
@value = check(val)
|
77
89
|
end
|
78
90
|
|
79
|
-
|
80
|
-
|
91
|
+
private
|
92
|
+
|
93
|
+
def check(val)
|
94
|
+
setup_rb_error "config: --#{name} requires argument" unless val
|
95
|
+
val
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
class BoolItem < ConfigItem
|
100
|
+
def config_type
|
101
|
+
'bool'
|
81
102
|
end
|
82
103
|
|
83
|
-
def
|
84
|
-
@
|
104
|
+
def help_opt
|
105
|
+
"--#{@name}"
|
85
106
|
end
|
86
107
|
|
108
|
+
private
|
109
|
+
|
110
|
+
def check(val)
|
111
|
+
return 'yes' unless val
|
112
|
+
unless /\A(y(es)?|n(o)?|t(rue)?|f(alse))\z/i =~ val
|
113
|
+
setup_rb_error "config: --#{@name} accepts only yes/no for argument"
|
114
|
+
end
|
115
|
+
(/\Ay(es)?|\At(rue)/i =~ value) ? 'yes' : 'no'
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
class PathItem < ConfigItem
|
120
|
+
def config_type
|
121
|
+
'path'
|
122
|
+
end
|
123
|
+
|
124
|
+
private
|
125
|
+
|
126
|
+
def check(path)
|
127
|
+
setup_rb_error "config: --#{@name} requires argument" unless path
|
128
|
+
path[0,1] == '$' ? path : File.expand_path(path)
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
class ProgramItem < ConfigItem
|
133
|
+
def config_type
|
134
|
+
'program'
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
class SelectItem < ConfigItem
|
139
|
+
def initialize(name, template, default, desc)
|
140
|
+
super
|
141
|
+
@ok = template.split('/')
|
142
|
+
end
|
143
|
+
|
144
|
+
def config_type
|
145
|
+
'select'
|
146
|
+
end
|
147
|
+
|
148
|
+
private
|
149
|
+
|
150
|
+
def check(val)
|
151
|
+
unless @ok.include?(val.strip)
|
152
|
+
setup_rb_error "config: use --#{@name}=#{@template} (#{val})"
|
153
|
+
end
|
154
|
+
val.strip
|
155
|
+
end
|
156
|
+
end
|
157
|
+
|
158
|
+
class PackageSelectionItem < ConfigItem
|
159
|
+
def initialize(name, template, default, help_default, desc)
|
160
|
+
super name, template, default, desc
|
161
|
+
@help_default = help_default
|
162
|
+
end
|
163
|
+
|
164
|
+
attr_reader :help_default
|
165
|
+
|
166
|
+
def config_type
|
167
|
+
'package'
|
168
|
+
end
|
169
|
+
|
170
|
+
private
|
171
|
+
|
172
|
+
def check(val)
|
173
|
+
unless File.dir?("packages/#{val}")
|
174
|
+
setup_rb_error "config: no such package: #{val}"
|
175
|
+
end
|
176
|
+
val
|
177
|
+
end
|
178
|
+
end
|
179
|
+
|
180
|
+
class ConfigTable_class
|
181
|
+
|
182
|
+
def initialize(items)
|
183
|
+
@items = items
|
184
|
+
@table = {}
|
185
|
+
items.each do |i|
|
186
|
+
@table[i.name] = i
|
187
|
+
end
|
188
|
+
ALIASES.each do |ali, name|
|
189
|
+
@table[ali] = @table[name]
|
190
|
+
end
|
191
|
+
end
|
192
|
+
|
193
|
+
include Enumerable
|
194
|
+
|
87
195
|
def each(&block)
|
88
196
|
@items.each(&block)
|
89
197
|
end
|
@@ -93,7 +201,7 @@ class ConfigTable
|
|
93
201
|
end
|
94
202
|
|
95
203
|
def lookup(name)
|
96
|
-
@table[name] or
|
204
|
+
@table[name] or raise ArgumentError, "no such config item: #{name}"
|
97
205
|
end
|
98
206
|
|
99
207
|
def add(item)
|
@@ -108,24 +216,24 @@ class ConfigTable
|
|
108
216
|
item
|
109
217
|
end
|
110
218
|
|
111
|
-
def
|
112
|
-
|
113
|
-
MetaConfigEnvironment.new(self, inst).instance_eval File.read(path), path
|
114
|
-
end
|
219
|
+
def new
|
220
|
+
dup()
|
115
221
|
end
|
116
222
|
|
117
223
|
def savefile
|
118
224
|
'.config'
|
119
225
|
end
|
120
226
|
|
121
|
-
def
|
227
|
+
def load
|
122
228
|
begin
|
229
|
+
t = dup()
|
123
230
|
File.foreach(savefile()) do |line|
|
124
231
|
k, v = *line.split(/=/, 2)
|
125
|
-
|
232
|
+
t[k] = v.strip
|
126
233
|
end
|
234
|
+
t
|
127
235
|
rescue Errno::ENOENT
|
128
|
-
setup_rb_error $!.message + "
|
236
|
+
setup_rb_error $!.message + "#{File.basename($0)} config first"
|
129
237
|
end
|
130
238
|
end
|
131
239
|
|
@@ -133,151 +241,117 @@ class ConfigTable
|
|
133
241
|
@items.each {|i| i.value }
|
134
242
|
File.open(savefile(), 'w') {|f|
|
135
243
|
@items.each do |i|
|
136
|
-
f.printf "%s=%s\n", i.name, i.value if i.value
|
244
|
+
f.printf "%s=%s\n", i.name, i.value if i.value
|
137
245
|
end
|
138
246
|
}
|
139
247
|
end
|
140
248
|
|
141
|
-
def
|
142
|
-
|
143
|
-
add ent
|
144
|
-
end
|
249
|
+
def [](key)
|
250
|
+
lookup(key).eval(self)
|
145
251
|
end
|
146
252
|
|
147
|
-
def
|
148
|
-
|
149
|
-
|
150
|
-
rubypath = File.join(c['bindir'], c['ruby_install_name'] + c['EXEEXT'])
|
151
|
-
|
152
|
-
major = c['MAJOR'].to_i
|
153
|
-
minor = c['MINOR'].to_i
|
154
|
-
teeny = c['TEENY'].to_i
|
155
|
-
version = "#{major}.#{minor}"
|
156
|
-
|
157
|
-
# ruby ver. >= 1.4.4?
|
158
|
-
newpath_p = ((major >= 2) or
|
159
|
-
((major == 1) and
|
160
|
-
((minor >= 5) or
|
161
|
-
((minor == 4) and (teeny >= 4)))))
|
162
|
-
|
163
|
-
if c['rubylibdir']
|
164
|
-
# V > 1.6.3
|
165
|
-
libruby = "#{c['prefix']}/lib/ruby"
|
166
|
-
librubyver = c['rubylibdir']
|
167
|
-
librubyverarch = c['archdir']
|
168
|
-
siteruby = c['sitedir']
|
169
|
-
siterubyver = c['sitelibdir']
|
170
|
-
siterubyverarch = c['sitearchdir']
|
171
|
-
elsif newpath_p
|
172
|
-
# 1.4.4 <= V <= 1.6.3
|
173
|
-
libruby = "#{c['prefix']}/lib/ruby"
|
174
|
-
librubyver = "#{c['prefix']}/lib/ruby/#{version}"
|
175
|
-
librubyverarch = "#{c['prefix']}/lib/ruby/#{version}/#{c['arch']}"
|
176
|
-
siteruby = c['sitedir']
|
177
|
-
siterubyver = "$siteruby/#{version}"
|
178
|
-
siterubyverarch = "$siterubyver/#{c['arch']}"
|
179
|
-
else
|
180
|
-
# V < 1.4.4
|
181
|
-
libruby = "#{c['prefix']}/lib/ruby"
|
182
|
-
librubyver = "#{c['prefix']}/lib/ruby/#{version}"
|
183
|
-
librubyverarch = "#{c['prefix']}/lib/ruby/#{version}/#{c['arch']}"
|
184
|
-
siteruby = "#{c['prefix']}/lib/ruby/#{version}/site_ruby"
|
185
|
-
siterubyver = siteruby
|
186
|
-
siterubyverarch = "$siterubyver/#{c['arch']}"
|
187
|
-
end
|
188
|
-
parameterize = lambda {|path|
|
189
|
-
path.sub(/\A#{Regexp.quote(c['prefix'])}/, '$prefix')
|
190
|
-
}
|
191
|
-
|
192
|
-
if arg = c['configure_args'].split.detect {|arg| /--with-make-prog=/ =~ arg }
|
193
|
-
makeprog = arg.sub(/'/, '').split(/=/, 2)[1]
|
194
|
-
else
|
195
|
-
makeprog = 'make'
|
196
|
-
end
|
197
|
-
|
198
|
-
[
|
199
|
-
ExecItem.new('installdirs', 'std/site/home',
|
200
|
-
'std: install under libruby; site: install under site_ruby; home: install under $HOME')\
|
201
|
-
{|val, table|
|
202
|
-
case val
|
203
|
-
when 'std'
|
204
|
-
table['rbdir'] = '$librubyver'
|
205
|
-
table['sodir'] = '$librubyverarch'
|
206
|
-
when 'site'
|
207
|
-
table['rbdir'] = '$siterubyver'
|
208
|
-
table['sodir'] = '$siterubyverarch'
|
209
|
-
when 'home'
|
210
|
-
setup_rb_error '$HOME was not set' unless ENV['HOME']
|
211
|
-
table['prefix'] = ENV['HOME']
|
212
|
-
table['rbdir'] = '$libdir/ruby'
|
213
|
-
table['sodir'] = '$libdir/ruby'
|
214
|
-
end
|
215
|
-
},
|
216
|
-
PathItem.new('prefix', 'path', c['prefix'],
|
217
|
-
'path prefix of target environment'),
|
218
|
-
PathItem.new('bindir', 'path', parameterize.call(c['bindir']),
|
219
|
-
'the directory for commands'),
|
220
|
-
PathItem.new('libdir', 'path', parameterize.call(c['libdir']),
|
221
|
-
'the directory for libraries'),
|
222
|
-
PathItem.new('datadir', 'path', parameterize.call(c['datadir']),
|
223
|
-
'the directory for shared data'),
|
224
|
-
PathItem.new('mandir', 'path', parameterize.call(c['mandir']),
|
225
|
-
'the directory for man pages'),
|
226
|
-
PathItem.new('sysconfdir', 'path', parameterize.call(c['sysconfdir']),
|
227
|
-
'the directory for system configuration files'),
|
228
|
-
PathItem.new('localstatedir', 'path', parameterize.call(c['localstatedir']),
|
229
|
-
'the directory for local state data'),
|
230
|
-
PathItem.new('libruby', 'path', libruby,
|
231
|
-
'the directory for ruby libraries'),
|
232
|
-
PathItem.new('librubyver', 'path', librubyver,
|
233
|
-
'the directory for standard ruby libraries'),
|
234
|
-
PathItem.new('librubyverarch', 'path', librubyverarch,
|
235
|
-
'the directory for standard ruby extensions'),
|
236
|
-
PathItem.new('siteruby', 'path', siteruby,
|
237
|
-
'the directory for version-independent aux ruby libraries'),
|
238
|
-
PathItem.new('siterubyver', 'path', siterubyver,
|
239
|
-
'the directory for aux ruby libraries'),
|
240
|
-
PathItem.new('siterubyverarch', 'path', siterubyverarch,
|
241
|
-
'the directory for aux ruby binaries'),
|
242
|
-
PathItem.new('rbdir', 'path', '$siterubyver',
|
243
|
-
'the directory for ruby scripts'),
|
244
|
-
PathItem.new('sodir', 'path', '$siterubyverarch',
|
245
|
-
'the directory for ruby extentions'),
|
246
|
-
PathItem.new('rubypath', 'path', rubypath,
|
247
|
-
'the path to set to #! line'),
|
248
|
-
ProgramItem.new('rubyprog', 'name', rubypath,
|
249
|
-
'the ruby program using for installation'),
|
250
|
-
ProgramItem.new('makeprog', 'name', makeprog,
|
251
|
-
'the make program to compile ruby extentions'),
|
252
|
-
SelectItem.new('shebang', 'all/ruby/never', 'ruby',
|
253
|
-
'shebang line (#!) editing mode'),
|
254
|
-
BoolItem.new('without-ext', 'yes/no', 'no',
|
255
|
-
'does not compile/install ruby extentions')
|
256
|
-
]
|
257
|
-
end
|
258
|
-
private :standard_entries
|
259
|
-
|
260
|
-
def load_multipackage_entries
|
261
|
-
multipackage_entries().each do |ent|
|
262
|
-
add ent
|
263
|
-
end
|
253
|
+
def []=(key, val)
|
254
|
+
lookup(key).set val
|
264
255
|
end
|
265
256
|
|
266
|
-
|
267
|
-
[
|
268
|
-
PackageSelectionItem.new('with', 'name,name...', '', 'ALL',
|
269
|
-
'package names that you want to install'),
|
270
|
-
PackageSelectionItem.new('without', 'name,name...', '', 'NONE',
|
271
|
-
'package names that you do not want to install')
|
272
|
-
]
|
273
|
-
end
|
274
|
-
private :multipackage_entries
|
257
|
+
end
|
275
258
|
|
259
|
+
c = ::Config::CONFIG
|
260
|
+
|
261
|
+
rubypath = c['bindir'] + '/' + c['ruby_install_name']
|
262
|
+
|
263
|
+
major = c['MAJOR'].to_i
|
264
|
+
minor = c['MINOR'].to_i
|
265
|
+
teeny = c['TEENY'].to_i
|
266
|
+
version = "#{major}.#{minor}"
|
267
|
+
|
268
|
+
# ruby ver. >= 1.4.4?
|
269
|
+
newpath_p = ((major >= 2) or
|
270
|
+
((major == 1) and
|
271
|
+
((minor >= 5) or
|
272
|
+
((minor == 4) and (teeny >= 4)))))
|
273
|
+
|
274
|
+
if c['rubylibdir']
|
275
|
+
# V < 1.6.3
|
276
|
+
_stdruby = c['rubylibdir']
|
277
|
+
_siteruby = c['sitedir']
|
278
|
+
_siterubyver = c['sitelibdir']
|
279
|
+
_siterubyverarch = c['sitearchdir']
|
280
|
+
elsif newpath_p
|
281
|
+
# 1.4.4 <= V <= 1.6.3
|
282
|
+
_stdruby = "$prefix/lib/ruby/#{version}"
|
283
|
+
_siteruby = c['sitedir']
|
284
|
+
_siterubyver = "$siteruby/#{version}"
|
285
|
+
_siterubyverarch = "$siterubyver/#{c['arch']}"
|
286
|
+
else
|
287
|
+
# V < 1.4.4
|
288
|
+
_stdruby = "$prefix/lib/ruby/#{version}"
|
289
|
+
_siteruby = "$prefix/lib/ruby/#{version}/site_ruby"
|
290
|
+
_siterubyver = _siteruby
|
291
|
+
_siterubyverarch = "$siterubyver/#{c['arch']}"
|
292
|
+
end
|
293
|
+
libdir = '-* dummy libdir *-'
|
294
|
+
stdruby = '-* dummy rubylibdir *-'
|
295
|
+
siteruby = '-* dummy site_ruby *-'
|
296
|
+
siterubyver = '-* dummy site_ruby version *-'
|
297
|
+
parameterize = lambda {|path|
|
298
|
+
path.sub(/\A#{Regexp.quote(c['prefix'])}/, '$prefix')\
|
299
|
+
.sub(/\A#{Regexp.quote(libdir)}/, '$libdir')\
|
300
|
+
.sub(/\A#{Regexp.quote(stdruby)}/, '$stdruby')\
|
301
|
+
.sub(/\A#{Regexp.quote(siteruby)}/, '$siteruby')\
|
302
|
+
.sub(/\A#{Regexp.quote(siterubyver)}/, '$siterubyver')
|
303
|
+
}
|
304
|
+
libdir = parameterize.call(c['libdir'])
|
305
|
+
stdruby = parameterize.call(_stdruby)
|
306
|
+
siteruby = parameterize.call(_siteruby)
|
307
|
+
siterubyver = parameterize.call(_siterubyver)
|
308
|
+
siterubyverarch = parameterize.call(_siterubyverarch)
|
309
|
+
|
310
|
+
if arg = c['configure_args'].split.detect {|arg| /--with-make-prog=/ =~ arg }
|
311
|
+
makeprog = arg.sub(/'/, '').split(/=/, 2)[1]
|
312
|
+
else
|
313
|
+
makeprog = 'make'
|
314
|
+
end
|
315
|
+
|
316
|
+
common_conf = [
|
317
|
+
PathItem.new('prefix', 'path', c['prefix'],
|
318
|
+
'path prefix of target environment'),
|
319
|
+
PathItem.new('bindir', 'path', parameterize.call(c['bindir']),
|
320
|
+
'the directory for commands'),
|
321
|
+
PathItem.new('libdir', 'path', libdir,
|
322
|
+
'the directory for libraries'),
|
323
|
+
PathItem.new('datadir', 'path', parameterize.call(c['datadir']),
|
324
|
+
'the directory for shared data'),
|
325
|
+
PathItem.new('mandir', 'path', parameterize.call(c['mandir']),
|
326
|
+
'the directory for man pages'),
|
327
|
+
PathItem.new('sysconfdir', 'path', parameterize.call(c['sysconfdir']),
|
328
|
+
'the directory for man pages'),
|
329
|
+
PathItem.new('stdruby', 'path', stdruby,
|
330
|
+
'the directory for standard ruby libraries'),
|
331
|
+
PathItem.new('siteruby', 'path', siteruby,
|
332
|
+
'the directory for version-independent aux ruby libraries'),
|
333
|
+
PathItem.new('siterubyver', 'path', siterubyver,
|
334
|
+
'the directory for aux ruby libraries'),
|
335
|
+
PathItem.new('siterubyverarch', 'path', siterubyverarch,
|
336
|
+
'the directory for aux ruby binaries'),
|
337
|
+
PathItem.new('rbdir', 'path', '$siterubyver',
|
338
|
+
'the directory for ruby scripts'),
|
339
|
+
PathItem.new('sodir', 'path', '$siterubyverarch',
|
340
|
+
'the directory for ruby extentions'),
|
341
|
+
PathItem.new('rubypath', 'path', rubypath,
|
342
|
+
'the path to set to #! line'),
|
343
|
+
ProgramItem.new('rubyprog', 'name', rubypath,
|
344
|
+
'the ruby program using for installation'),
|
345
|
+
ProgramItem.new('makeprog', 'name', makeprog,
|
346
|
+
'the make program to compile ruby extentions'),
|
347
|
+
SelectItem.new('shebang', 'all/ruby/never', 'ruby',
|
348
|
+
'shebang line (#!) editing mode'),
|
349
|
+
BoolItem.new('without-ext', 'yes/no', 'no',
|
350
|
+
'does not compile/install ruby extentions')
|
351
|
+
]
|
352
|
+
class ConfigTable_class # open again
|
276
353
|
ALIASES = {
|
277
|
-
'std-ruby' => '
|
278
|
-
'stdruby' => 'librubyver',
|
279
|
-
'rubylibdir' => 'librubyver',
|
280
|
-
'archdir' => 'librubyverarch',
|
354
|
+
'std-ruby' => 'stdruby',
|
281
355
|
'site-ruby-common' => 'siteruby', # For backward compatibility
|
282
356
|
'site-ruby' => 'siterubyver', # For backward compatibility
|
283
357
|
'bin-dir' => 'bindir',
|
@@ -291,248 +365,78 @@ class ConfigTable
|
|
291
365
|
'make-prog' => 'makeprog',
|
292
366
|
'make' => 'makeprog'
|
293
367
|
}
|
368
|
+
end
|
369
|
+
multipackage_conf = [
|
370
|
+
PackageSelectionItem.new('with', 'name,name...', '', 'ALL',
|
371
|
+
'package names that you want to install'),
|
372
|
+
PackageSelectionItem.new('without', 'name,name...', '', 'NONE',
|
373
|
+
'package names that you do not want to install')
|
374
|
+
]
|
375
|
+
if multipackage_install?
|
376
|
+
ConfigTable = ConfigTable_class.new(common_conf + multipackage_conf)
|
377
|
+
else
|
378
|
+
ConfigTable = ConfigTable_class.new(common_conf)
|
379
|
+
end
|
294
380
|
|
295
|
-
def fixup
|
296
|
-
ALIASES.each do |ali, name|
|
297
|
-
@table[ali] = @table[name]
|
298
|
-
end
|
299
|
-
@items.freeze
|
300
|
-
@table.freeze
|
301
|
-
@options_re = /\A--(#{@table.keys.join('|')})(?:=(.*))?\z/
|
302
|
-
end
|
303
381
|
|
304
|
-
|
305
|
-
m = @options_re.match(opt) or setup_rb_error "config: unknown option #{opt}"
|
306
|
-
m.to_a[1,2]
|
307
|
-
end
|
382
|
+
module MetaConfigAPI
|
308
383
|
|
309
|
-
def
|
310
|
-
|
384
|
+
def eval_file_ifexist(fname)
|
385
|
+
instance_eval File.read(fname), fname, 1 if File.file?(fname)
|
311
386
|
end
|
312
387
|
|
313
|
-
def
|
314
|
-
|
388
|
+
def config_names
|
389
|
+
ConfigTable.map {|i| i.name }
|
315
390
|
end
|
316
391
|
|
317
|
-
|
318
|
-
|
319
|
-
@name = name.freeze
|
320
|
-
@template = template
|
321
|
-
@value = default
|
322
|
-
@default = default
|
323
|
-
@description = desc
|
324
|
-
end
|
325
|
-
|
326
|
-
attr_reader :name
|
327
|
-
attr_reader :description
|
328
|
-
|
329
|
-
attr_accessor :default
|
330
|
-
alias help_default default
|
331
|
-
|
332
|
-
def help_opt
|
333
|
-
"--#{@name}=#{@template}"
|
334
|
-
end
|
335
|
-
|
336
|
-
def value?
|
337
|
-
true
|
338
|
-
end
|
339
|
-
|
340
|
-
def value
|
341
|
-
@value
|
342
|
-
end
|
343
|
-
|
344
|
-
def resolve(table)
|
345
|
-
@value.gsub(%r<\$([^/]+)>) { table[$1] }
|
346
|
-
end
|
347
|
-
|
348
|
-
def set(val)
|
349
|
-
@value = check(val)
|
350
|
-
end
|
351
|
-
|
352
|
-
private
|
353
|
-
|
354
|
-
def check(val)
|
355
|
-
setup_rb_error "config: --#{name} requires argument" unless val
|
356
|
-
val
|
357
|
-
end
|
392
|
+
def config?(name)
|
393
|
+
ConfigTable.key?(name)
|
358
394
|
end
|
359
395
|
|
360
|
-
|
361
|
-
|
362
|
-
'bool'
|
363
|
-
end
|
364
|
-
|
365
|
-
def help_opt
|
366
|
-
"--#{@name}"
|
367
|
-
end
|
368
|
-
|
369
|
-
private
|
370
|
-
|
371
|
-
def check(val)
|
372
|
-
return 'yes' unless val
|
373
|
-
case val
|
374
|
-
when /\Ay(es)?\z/i, /\At(rue)?\z/i then 'yes'
|
375
|
-
when /\An(o)?\z/i, /\Af(alse)\z/i then 'no'
|
376
|
-
else
|
377
|
-
setup_rb_error "config: --#{@name} accepts only yes/no for argument"
|
378
|
-
end
|
379
|
-
end
|
396
|
+
def bool_config?(name)
|
397
|
+
ConfigTable.lookup(name).config_type == 'bool'
|
380
398
|
end
|
381
399
|
|
382
|
-
|
383
|
-
|
384
|
-
'path'
|
385
|
-
end
|
386
|
-
|
387
|
-
private
|
388
|
-
|
389
|
-
def check(path)
|
390
|
-
setup_rb_error "config: --#{@name} requires argument" unless path
|
391
|
-
path[0,1] == '$' ? path : File.expand_path(path)
|
392
|
-
end
|
400
|
+
def path_config?(name)
|
401
|
+
ConfigTable.lookup(name).config_type == 'path'
|
393
402
|
end
|
394
403
|
|
395
|
-
|
396
|
-
|
397
|
-
|
404
|
+
def value_config?(name)
|
405
|
+
case ConfigTable.lookup(name).config_type
|
406
|
+
when 'bool', 'path'
|
407
|
+
true
|
408
|
+
else
|
409
|
+
false
|
398
410
|
end
|
399
411
|
end
|
400
412
|
|
401
|
-
|
402
|
-
|
403
|
-
super
|
404
|
-
@ok = selection.split('/')
|
405
|
-
end
|
406
|
-
|
407
|
-
def config_type
|
408
|
-
'select'
|
409
|
-
end
|
410
|
-
|
411
|
-
private
|
412
|
-
|
413
|
-
def check(val)
|
414
|
-
unless @ok.include?(val.strip)
|
415
|
-
setup_rb_error "config: use --#{@name}=#{@template} (#{val})"
|
416
|
-
end
|
417
|
-
val.strip
|
418
|
-
end
|
413
|
+
def add_config(item)
|
414
|
+
ConfigTable.add item
|
419
415
|
end
|
420
416
|
|
421
|
-
|
422
|
-
|
423
|
-
super name, selection, nil, desc
|
424
|
-
@ok = selection.split('/')
|
425
|
-
@action = block
|
426
|
-
end
|
427
|
-
|
428
|
-
def config_type
|
429
|
-
'exec'
|
430
|
-
end
|
431
|
-
|
432
|
-
def value?
|
433
|
-
false
|
434
|
-
end
|
435
|
-
|
436
|
-
def resolve(table)
|
437
|
-
setup_rb_error "$#{name()} wrongly used as option value"
|
438
|
-
end
|
439
|
-
|
440
|
-
undef set
|
441
|
-
|
442
|
-
def evaluate(val, table)
|
443
|
-
v = val.strip.downcase
|
444
|
-
unless @ok.include?(v)
|
445
|
-
setup_rb_error "invalid option --#{@name}=#{val} (use #{@template})"
|
446
|
-
end
|
447
|
-
@action.call v, table
|
448
|
-
end
|
417
|
+
def add_bool_config(name, default, desc)
|
418
|
+
ConfigTable.add BoolItem.new(name, 'yes/no', default ? 'yes' : 'no', desc)
|
449
419
|
end
|
450
420
|
|
451
|
-
|
452
|
-
|
453
|
-
super name, template, default, desc
|
454
|
-
@help_default = help_default
|
455
|
-
end
|
456
|
-
|
457
|
-
attr_reader :help_default
|
458
|
-
|
459
|
-
def config_type
|
460
|
-
'package'
|
461
|
-
end
|
462
|
-
|
463
|
-
private
|
464
|
-
|
465
|
-
def check(val)
|
466
|
-
unless File.dir?("packages/#{val}")
|
467
|
-
setup_rb_error "config: no such package: #{val}"
|
468
|
-
end
|
469
|
-
val
|
470
|
-
end
|
421
|
+
def add_path_config(name, default, desc)
|
422
|
+
ConfigTable.add PathItem.new(name, 'path', default, desc)
|
471
423
|
end
|
472
424
|
|
473
|
-
|
474
|
-
|
475
|
-
|
476
|
-
@installer = installer
|
477
|
-
end
|
478
|
-
|
479
|
-
def config_names
|
480
|
-
@config.names
|
481
|
-
end
|
482
|
-
|
483
|
-
def config?(name)
|
484
|
-
@config.key?(name)
|
485
|
-
end
|
486
|
-
|
487
|
-
def bool_config?(name)
|
488
|
-
@config.lookup(name).config_type == 'bool'
|
489
|
-
end
|
490
|
-
|
491
|
-
def path_config?(name)
|
492
|
-
@config.lookup(name).config_type == 'path'
|
493
|
-
end
|
494
|
-
|
495
|
-
def value_config?(name)
|
496
|
-
@config.lookup(name).config_type != 'exec'
|
497
|
-
end
|
498
|
-
|
499
|
-
def add_config(item)
|
500
|
-
@config.add item
|
501
|
-
end
|
502
|
-
|
503
|
-
def add_bool_config(name, default, desc)
|
504
|
-
@config.add BoolItem.new(name, 'yes/no', default ? 'yes' : 'no', desc)
|
505
|
-
end
|
506
|
-
|
507
|
-
def add_path_config(name, default, desc)
|
508
|
-
@config.add PathItem.new(name, 'path', default, desc)
|
509
|
-
end
|
510
|
-
|
511
|
-
def set_config_default(name, default)
|
512
|
-
@config.lookup(name).default = default
|
513
|
-
end
|
514
|
-
|
515
|
-
def remove_config(name)
|
516
|
-
@config.remove(name)
|
517
|
-
end
|
518
|
-
|
519
|
-
# For only multipackage
|
520
|
-
def packages
|
521
|
-
raise '[setup.rb fatal] multi-package metaconfig API packages() called for single-package; contact application package vendor' unless @installer
|
522
|
-
@installer.packages
|
523
|
-
end
|
425
|
+
def set_config_default(name, default)
|
426
|
+
ConfigTable.lookup(name).default = default
|
427
|
+
end
|
524
428
|
|
525
|
-
|
526
|
-
|
527
|
-
raise '[setup.rb fatal] multi-package metaconfig API declare_packages() called for single-package; contact application package vendor' unless @installer
|
528
|
-
@installer.packages = list
|
529
|
-
end
|
429
|
+
def remove_config(name)
|
430
|
+
ConfigTable.remove(name)
|
530
431
|
end
|
531
432
|
|
532
|
-
end
|
433
|
+
end
|
434
|
+
|
533
435
|
|
436
|
+
#
|
437
|
+
# File Operations
|
438
|
+
#
|
534
439
|
|
535
|
-
# This module requires: #verbose?, #no_harm?
|
536
440
|
module FileOperations
|
537
441
|
|
538
442
|
def mkdir_p(dirname, prefix = nil)
|
@@ -540,7 +444,7 @@ module FileOperations
|
|
540
444
|
$stderr.puts "mkdir -p #{dirname}" if verbose?
|
541
445
|
return if no_harm?
|
542
446
|
|
543
|
-
#
|
447
|
+
# does not check '/'... it's too abnormal case
|
544
448
|
dirs = File.expand_path(dirname).split(%r<(?=/)>)
|
545
449
|
if /\A[a-z]:\z/i =~ dirs[0]
|
546
450
|
disk = dirs.shift
|
@@ -552,73 +456,49 @@ module FileOperations
|
|
552
456
|
end
|
553
457
|
end
|
554
458
|
|
555
|
-
def rm_f(
|
556
|
-
$stderr.puts "rm -f #{
|
557
|
-
return if no_harm?
|
558
|
-
force_remove_file path
|
559
|
-
end
|
560
|
-
|
561
|
-
def rm_rf(path)
|
562
|
-
$stderr.puts "rm -rf #{path}" if verbose?
|
459
|
+
def rm_f(fname)
|
460
|
+
$stderr.puts "rm -f #{fname}" if verbose?
|
563
461
|
return if no_harm?
|
564
|
-
remove_tree path
|
565
|
-
end
|
566
462
|
|
567
|
-
|
568
|
-
|
569
|
-
|
570
|
-
elsif File.dir?(path)
|
571
|
-
remove_tree0 path
|
572
|
-
else
|
573
|
-
force_remove_file path
|
463
|
+
if File.exist?(fname) or File.symlink?(fname)
|
464
|
+
File.chmod 0777, fname
|
465
|
+
File.unlink fname
|
574
466
|
end
|
575
467
|
end
|
576
468
|
|
577
|
-
def
|
578
|
-
|
579
|
-
|
580
|
-
|
581
|
-
|
582
|
-
|
583
|
-
|
584
|
-
|
585
|
-
|
469
|
+
def rm_rf(dn)
|
470
|
+
$stderr.puts "rm -rf #{dn}" if verbose?
|
471
|
+
return if no_harm?
|
472
|
+
|
473
|
+
Dir.chdir dn
|
474
|
+
Dir.foreach('.') do |fn|
|
475
|
+
next if fn == '.'
|
476
|
+
next if fn == '..'
|
477
|
+
if File.dir?(fn)
|
478
|
+
verbose_off {
|
479
|
+
rm_rf fn
|
480
|
+
}
|
586
481
|
else
|
587
|
-
|
482
|
+
verbose_off {
|
483
|
+
rm_f fn
|
484
|
+
}
|
588
485
|
end
|
589
486
|
end
|
590
|
-
|
591
|
-
|
592
|
-
rescue Errno::ENOTEMPTY
|
593
|
-
# directory may not be empty
|
594
|
-
end
|
487
|
+
Dir.chdir '..'
|
488
|
+
Dir.rmdir dn
|
595
489
|
end
|
596
490
|
|
597
491
|
def move_file(src, dest)
|
598
|
-
|
492
|
+
File.unlink dest if File.exist?(dest)
|
599
493
|
begin
|
600
494
|
File.rename src, dest
|
601
495
|
rescue
|
602
|
-
File.open(dest, 'wb') {|f|
|
603
|
-
f.write File.binread(src)
|
604
|
-
}
|
496
|
+
File.open(dest, 'wb') {|f| f.write File.binread(src) }
|
605
497
|
File.chmod File.stat(src).mode, dest
|
606
498
|
File.unlink src
|
607
499
|
end
|
608
500
|
end
|
609
501
|
|
610
|
-
def force_remove_file(path)
|
611
|
-
begin
|
612
|
-
remove_file path
|
613
|
-
rescue
|
614
|
-
end
|
615
|
-
end
|
616
|
-
|
617
|
-
def remove_file(path)
|
618
|
-
File.chmod 0777, path
|
619
|
-
File.unlink path
|
620
|
-
end
|
621
|
-
|
622
502
|
def install(from, dest, mode, prefix = nil)
|
623
503
|
$stderr.puts "install #{from} #{dest}" if verbose?
|
624
504
|
return if no_harm?
|
@@ -650,42 +530,66 @@ module FileOperations
|
|
650
530
|
new_content != File.binread(path)
|
651
531
|
end
|
652
532
|
|
653
|
-
def command(
|
654
|
-
$stderr.puts
|
655
|
-
system
|
656
|
-
"system(#{args.map{|a| a.inspect }.join(' ')}) failed"
|
533
|
+
def command(str)
|
534
|
+
$stderr.puts str if verbose?
|
535
|
+
system str or raise RuntimeError, "'system #{str}' failed"
|
657
536
|
end
|
658
537
|
|
659
|
-
def ruby(
|
660
|
-
command config('rubyprog')
|
538
|
+
def ruby(str)
|
539
|
+
command config('rubyprog') + ' ' + str
|
661
540
|
end
|
662
541
|
|
663
|
-
def make(task =
|
664
|
-
command
|
542
|
+
def make(task = '')
|
543
|
+
command config('makeprog') + ' ' + task
|
665
544
|
end
|
666
545
|
|
667
546
|
def extdir?(dir)
|
668
|
-
File.exist?(
|
547
|
+
File.exist?(dir + '/MANIFEST')
|
669
548
|
end
|
670
549
|
|
671
|
-
def
|
672
|
-
Dir.open(
|
673
|
-
return d.select {|ent| File.file?("#{
|
550
|
+
def all_files_in(dirname)
|
551
|
+
Dir.open(dirname) {|d|
|
552
|
+
return d.select {|ent| File.file?("#{dirname}/#{ent}") }
|
674
553
|
}
|
675
554
|
end
|
676
555
|
|
677
|
-
|
556
|
+
REJECT_DIRS = %w(
|
557
|
+
CVS SCCS RCS CVS.adm .svn
|
558
|
+
)
|
678
559
|
|
679
|
-
def
|
680
|
-
Dir.open(
|
681
|
-
return d.select {|
|
560
|
+
def all_dirs_in(dirname)
|
561
|
+
Dir.open(dirname) {|d|
|
562
|
+
return d.select {|n| File.dir?("#{dirname}/#{n}") } - %w(. ..) - REJECT_DIRS
|
682
563
|
}
|
683
564
|
end
|
684
565
|
|
685
566
|
end
|
686
567
|
|
687
568
|
|
688
|
-
#
|
569
|
+
#
|
570
|
+
# Main Installer
|
571
|
+
#
|
572
|
+
|
573
|
+
module HookUtils
|
574
|
+
|
575
|
+
def run_hook(name)
|
576
|
+
try_run_hook "#{curr_srcdir()}/#{name}" or
|
577
|
+
try_run_hook "#{curr_srcdir()}/#{name}.rb"
|
578
|
+
end
|
579
|
+
|
580
|
+
def try_run_hook(fname)
|
581
|
+
return false unless File.file?(fname)
|
582
|
+
begin
|
583
|
+
instance_eval File.read(fname), fname, 1
|
584
|
+
rescue
|
585
|
+
setup_rb_error "hook #{fname} failed:\n" + $!.message
|
586
|
+
end
|
587
|
+
true
|
588
|
+
end
|
589
|
+
|
590
|
+
end
|
591
|
+
|
592
|
+
|
689
593
|
module HookScriptAPI
|
690
594
|
|
691
595
|
def get_config(key)
|
@@ -694,7 +598,6 @@ module HookScriptAPI
|
|
694
598
|
|
695
599
|
alias config get_config
|
696
600
|
|
697
|
-
# obsolete: use metaconfig to change configuration
|
698
601
|
def set_config(key, val)
|
699
602
|
@config[key] = val
|
700
603
|
end
|
@@ -703,6 +606,10 @@ module HookScriptAPI
|
|
703
606
|
# srcdir/objdir (works only in the package directory)
|
704
607
|
#
|
705
608
|
|
609
|
+
#abstract srcdir_root
|
610
|
+
#abstract objdir_root
|
611
|
+
#abstract relpath
|
612
|
+
|
706
613
|
def curr_srcdir
|
707
614
|
"#{srcdir_root()}/#{relpath()}"
|
708
615
|
end
|
@@ -724,7 +631,7 @@ module HookScriptAPI
|
|
724
631
|
end
|
725
632
|
|
726
633
|
def srcfile?(path)
|
727
|
-
File.file?
|
634
|
+
File.file? srcfile(path)
|
728
635
|
end
|
729
636
|
|
730
637
|
def srcentries(path = '.')
|
@@ -750,8 +657,8 @@ end
|
|
750
657
|
|
751
658
|
class ToplevelInstaller
|
752
659
|
|
753
|
-
Version = '3.
|
754
|
-
Copyright = 'Copyright (c) 2000-
|
660
|
+
Version = '3.3.1'
|
661
|
+
Copyright = 'Copyright (c) 2000-2004 Minero Aoki'
|
755
662
|
|
756
663
|
TASKS = [
|
757
664
|
[ 'all', 'do config, setup, then install' ],
|
@@ -759,44 +666,27 @@ class ToplevelInstaller
|
|
759
666
|
[ 'show', 'shows current configuration' ],
|
760
667
|
[ 'setup', 'compiles ruby extentions and others' ],
|
761
668
|
[ 'install', 'installs files' ],
|
762
|
-
[ 'test', 'run all tests in test/' ],
|
763
669
|
[ 'clean', "does `make clean' for each extention" ],
|
764
670
|
[ 'distclean',"does `make distclean' for each extention" ]
|
765
671
|
]
|
766
672
|
|
767
673
|
def ToplevelInstaller.invoke
|
768
|
-
|
769
|
-
config.load_standard_entries
|
770
|
-
config.load_multipackage_entries if multipackage?
|
771
|
-
config.fixup
|
772
|
-
klass = (multipackage?() ? ToplevelInstallerMulti : ToplevelInstaller)
|
773
|
-
klass.new(File.dirname($0), config).invoke
|
674
|
+
instance().invoke
|
774
675
|
end
|
775
676
|
|
776
|
-
|
777
|
-
File.dir?(File.dirname($0) + '/packages')
|
778
|
-
end
|
677
|
+
@singleton = nil
|
779
678
|
|
780
|
-
def ToplevelInstaller.
|
781
|
-
|
782
|
-
|
783
|
-
load File.expand_path(arg.split(/=/, 2)[1])
|
784
|
-
$".push 'rbconfig.rb'
|
785
|
-
else
|
786
|
-
require 'rbconfig'
|
787
|
-
end
|
788
|
-
::Config::CONFIG
|
679
|
+
def ToplevelInstaller.instance
|
680
|
+
@singleton ||= new(File.dirname($0))
|
681
|
+
@singleton
|
789
682
|
end
|
790
683
|
|
791
|
-
|
792
|
-
@ardir = File.expand_path(ardir_root)
|
793
|
-
@config = config
|
794
|
-
# cache
|
795
|
-
@valid_task_re = nil
|
796
|
-
end
|
684
|
+
include MetaConfigAPI
|
797
685
|
|
798
|
-
def
|
799
|
-
@config
|
686
|
+
def initialize(ardir_root)
|
687
|
+
@config = nil
|
688
|
+
@options = { 'verbose' => true }
|
689
|
+
@ardir = File.expand_path(ardir_root)
|
800
690
|
end
|
801
691
|
|
802
692
|
def inspect
|
@@ -807,20 +697,14 @@ class ToplevelInstaller
|
|
807
697
|
run_metaconfigs
|
808
698
|
case task = parsearg_global()
|
809
699
|
when nil, 'all'
|
700
|
+
@config = load_config('config')
|
810
701
|
parsearg_config
|
811
702
|
init_installers
|
812
703
|
exec_config
|
813
704
|
exec_setup
|
814
705
|
exec_install
|
815
706
|
else
|
816
|
-
|
817
|
-
when 'config', 'test'
|
818
|
-
;
|
819
|
-
when 'clean', 'distclean'
|
820
|
-
@config.load_savefile if File.exist?(@config.savefile)
|
821
|
-
else
|
822
|
-
@config.load_savefile
|
823
|
-
end
|
707
|
+
@config = load_config(task)
|
824
708
|
__send__ "parsearg_#{task}"
|
825
709
|
init_installers
|
826
710
|
__send__ "exec_#{task}"
|
@@ -828,11 +712,25 @@ class ToplevelInstaller
|
|
828
712
|
end
|
829
713
|
|
830
714
|
def run_metaconfigs
|
831
|
-
|
715
|
+
eval_file_ifexist "#{@ardir}/metaconfig"
|
716
|
+
end
|
717
|
+
|
718
|
+
def load_config(task)
|
719
|
+
case task
|
720
|
+
when 'config'
|
721
|
+
ConfigTable.new
|
722
|
+
when 'clean', 'distclean'
|
723
|
+
if File.exist?(ConfigTable.savefile)
|
724
|
+
then ConfigTable.load
|
725
|
+
else ConfigTable.new
|
726
|
+
end
|
727
|
+
else
|
728
|
+
ConfigTable.load
|
729
|
+
end
|
832
730
|
end
|
833
731
|
|
834
732
|
def init_installers
|
835
|
-
@installer = Installer.new(@config, @ardir, File.expand_path('.'))
|
733
|
+
@installer = Installer.new(@config, @options, @ardir, File.expand_path('.'))
|
836
734
|
end
|
837
735
|
|
838
736
|
#
|
@@ -856,89 +754,78 @@ class ToplevelInstaller
|
|
856
754
|
#
|
857
755
|
|
858
756
|
def parsearg_global
|
757
|
+
valid_task = /\A(?:#{TASKS.map {|task,desc| task }.join '|'})\z/
|
758
|
+
|
859
759
|
while arg = ARGV.shift
|
860
760
|
case arg
|
861
761
|
when /\A\w+\z/
|
862
|
-
setup_rb_error "invalid task: #{arg}" unless valid_task
|
762
|
+
setup_rb_error "invalid task: #{arg}" unless valid_task =~ arg
|
863
763
|
return arg
|
764
|
+
|
864
765
|
when '-q', '--quiet'
|
865
|
-
@
|
866
|
-
|
867
|
-
|
868
|
-
|
766
|
+
@options['verbose'] = false
|
767
|
+
|
768
|
+
when '--verbose'
|
769
|
+
@options['verbose'] = true
|
770
|
+
|
771
|
+
when '-h', '--help'
|
869
772
|
print_usage $stdout
|
870
773
|
exit 0
|
871
|
-
|
774
|
+
|
775
|
+
when '-v', '--version'
|
872
776
|
puts "#{File.basename($0)} version #{Version}"
|
873
777
|
exit 0
|
778
|
+
|
874
779
|
when '--copyright'
|
875
780
|
puts Copyright
|
876
781
|
exit 0
|
782
|
+
|
877
783
|
else
|
878
784
|
setup_rb_error "unknown global option '#{arg}'"
|
879
785
|
end
|
880
786
|
end
|
881
|
-
nil
|
882
|
-
end
|
883
787
|
|
884
|
-
|
885
|
-
valid_task_re() =~ t
|
788
|
+
nil
|
886
789
|
end
|
887
790
|
|
888
|
-
def valid_task_re
|
889
|
-
@valid_task_re ||= /\A(?:#{TASKS.map {|task,desc| task }.join('|')})\z/
|
890
|
-
end
|
891
791
|
|
892
792
|
def parsearg_no_options
|
893
793
|
unless ARGV.empty?
|
894
|
-
task
|
895
|
-
setup_rb_error "#{task}: unknown options: #{ARGV.join(' ')}"
|
794
|
+
setup_rb_error "#{task}: unknown options: #{ARGV.join ' '}"
|
896
795
|
end
|
897
796
|
end
|
898
797
|
|
899
798
|
alias parsearg_show parsearg_no_options
|
900
799
|
alias parsearg_setup parsearg_no_options
|
901
|
-
alias parsearg_test parsearg_no_options
|
902
800
|
alias parsearg_clean parsearg_no_options
|
903
801
|
alias parsearg_distclean parsearg_no_options
|
904
802
|
|
905
803
|
def parsearg_config
|
906
|
-
|
907
|
-
|
908
|
-
|
804
|
+
re = /\A--(#{ConfigTable.map {|i| i.name }.join('|')})(?:=(.*))?\z/
|
805
|
+
@options['config-opt'] = []
|
806
|
+
|
909
807
|
while i = ARGV.shift
|
910
808
|
if /\A--?\z/ =~ i
|
911
|
-
@config
|
809
|
+
@options['config-opt'] = ARGV.dup
|
912
810
|
break
|
913
811
|
end
|
914
|
-
|
915
|
-
|
916
|
-
|
917
|
-
else
|
918
|
-
evalopt.push [name, value]
|
919
|
-
end
|
920
|
-
set.push name
|
921
|
-
end
|
922
|
-
evalopt.each do |name, value|
|
923
|
-
@config.lookup(name).evaluate value, @config
|
924
|
-
end
|
925
|
-
# Check if configuration is valid
|
926
|
-
set.each do |n|
|
927
|
-
@config[n] if @config.value_config?(n)
|
812
|
+
m = re.match(i) or setup_rb_error "config: unknown option #{i}"
|
813
|
+
name, value = *m.to_a[1,2]
|
814
|
+
@config[name] = value
|
928
815
|
end
|
929
816
|
end
|
930
817
|
|
931
818
|
def parsearg_install
|
932
|
-
@
|
933
|
-
@
|
819
|
+
@options['no-harm'] = false
|
820
|
+
@options['install-prefix'] = ''
|
934
821
|
while a = ARGV.shift
|
935
822
|
case a
|
936
|
-
when
|
937
|
-
@
|
938
|
-
when /\A--prefix
|
939
|
-
path =
|
823
|
+
when /\A--no-harm\z/
|
824
|
+
@options['no-harm'] = true
|
825
|
+
when /\A--prefix=(.*)\z/
|
826
|
+
path = $1
|
940
827
|
path = File.expand_path(path) unless path[0,1] == '/'
|
941
|
-
@
|
828
|
+
@options['install-prefix'] = path
|
942
829
|
else
|
943
830
|
setup_rb_error "install: unknown option #{a}"
|
944
831
|
end
|
@@ -960,8 +847,8 @@ class ToplevelInstaller
|
|
960
847
|
out.puts 'Global options:'
|
961
848
|
out.printf fmt, '-q,--quiet', 'suppress message outputs'
|
962
849
|
out.printf fmt, ' --verbose', 'output messages verbosely'
|
963
|
-
out.printf fmt, '
|
964
|
-
out.printf fmt, '
|
850
|
+
out.printf fmt, '-h,--help', 'print this message'
|
851
|
+
out.printf fmt, '-v,--version', 'print version and quit'
|
965
852
|
out.printf fmt, ' --copyright', 'print copyright and quit'
|
966
853
|
out.puts
|
967
854
|
out.puts 'Tasks:'
|
@@ -972,14 +859,14 @@ class ToplevelInstaller
|
|
972
859
|
fmt = " %-24s %s [%s]\n"
|
973
860
|
out.puts
|
974
861
|
out.puts 'Options for CONFIG or ALL:'
|
975
|
-
|
862
|
+
ConfigTable.each do |item|
|
976
863
|
out.printf fmt, item.help_opt, item.description, item.help_default
|
977
864
|
end
|
978
865
|
out.printf fmt, '--rbconfig=path', 'rbconfig.rb to load',"running ruby's"
|
979
866
|
out.puts
|
980
867
|
out.puts 'Options for INSTALL:'
|
981
868
|
out.printf fmt, '--no-harm', 'only display what to do if given', 'off'
|
982
|
-
out.printf fmt, '--prefix=path', 'install path prefix', ''
|
869
|
+
out.printf fmt, '--prefix=path', 'install path prefix', '$prefix'
|
983
870
|
out.puts
|
984
871
|
end
|
985
872
|
|
@@ -1000,13 +887,9 @@ class ToplevelInstaller
|
|
1000
887
|
@installer.exec_install
|
1001
888
|
end
|
1002
889
|
|
1003
|
-
def exec_test
|
1004
|
-
@installer.exec_test
|
1005
|
-
end
|
1006
|
-
|
1007
890
|
def exec_show
|
1008
|
-
|
1009
|
-
printf "%-20s %s\n", i.name, i.value
|
891
|
+
ConfigTable.each do |i|
|
892
|
+
printf "%-20s %s\n", i.name, i.value
|
1010
893
|
end
|
1011
894
|
end
|
1012
895
|
|
@@ -1018,45 +901,36 @@ class ToplevelInstaller
|
|
1018
901
|
@installer.exec_distclean
|
1019
902
|
end
|
1020
903
|
|
1021
|
-
end
|
904
|
+
end
|
1022
905
|
|
1023
906
|
|
1024
907
|
class ToplevelInstallerMulti < ToplevelInstaller
|
1025
908
|
|
909
|
+
include HookUtils
|
910
|
+
include HookScriptAPI
|
1026
911
|
include FileOperations
|
1027
912
|
|
1028
|
-
def initialize(
|
913
|
+
def initialize(ardir)
|
1029
914
|
super
|
1030
|
-
@packages =
|
915
|
+
@packages = all_dirs_in("#{@ardir}/packages")
|
1031
916
|
raise 'no package exists' if @packages.empty?
|
1032
|
-
@root_installer = Installer.new(@config, @ardir, File.expand_path('.'))
|
1033
917
|
end
|
1034
918
|
|
1035
919
|
def run_metaconfigs
|
1036
|
-
|
920
|
+
eval_file_ifexist "#{@ardir}/metaconfig"
|
1037
921
|
@packages.each do |name|
|
1038
|
-
|
922
|
+
eval_file_ifexist "#{@ardir}/packages/#{name}/metaconfig"
|
1039
923
|
end
|
1040
924
|
end
|
1041
925
|
|
1042
|
-
attr_reader :packages
|
1043
|
-
|
1044
|
-
def packages=(list)
|
1045
|
-
raise 'package list is empty' if list.empty?
|
1046
|
-
list.each do |name|
|
1047
|
-
raise "directory packages/#{name} does not exist"\
|
1048
|
-
unless File.dir?("#{@ardir}/packages/#{name}")
|
1049
|
-
end
|
1050
|
-
@packages = list
|
1051
|
-
end
|
1052
|
-
|
1053
926
|
def init_installers
|
1054
927
|
@installers = {}
|
1055
928
|
@packages.each do |pack|
|
1056
|
-
@installers[pack] = Installer.new(@config,
|
929
|
+
@installers[pack] = Installer.new(@config, @options,
|
1057
930
|
"#{@ardir}/packages/#{pack}",
|
1058
931
|
"packages/#{pack}")
|
1059
932
|
end
|
933
|
+
|
1060
934
|
with = extract_selection(config('with'))
|
1061
935
|
without = extract_selection(config('without'))
|
1062
936
|
@selected = @installers.keys.select {|name|
|
@@ -1080,6 +954,21 @@ class ToplevelInstallerMulti < ToplevelInstaller
|
|
1080
954
|
f.puts
|
1081
955
|
end
|
1082
956
|
|
957
|
+
#
|
958
|
+
# multi-package metaconfig API
|
959
|
+
#
|
960
|
+
|
961
|
+
attr_reader :packages
|
962
|
+
|
963
|
+
def declare_packages(list)
|
964
|
+
raise 'package list is empty' if list.empty?
|
965
|
+
list.each do |name|
|
966
|
+
raise "directory packages/#{name} does not exist"\
|
967
|
+
unless File.dir?("#{@ardir}/packages/#{name}")
|
968
|
+
end
|
969
|
+
@packages = list
|
970
|
+
end
|
971
|
+
|
1083
972
|
#
|
1084
973
|
# Task Handlers
|
1085
974
|
#
|
@@ -1103,21 +992,15 @@ class ToplevelInstallerMulti < ToplevelInstaller
|
|
1103
992
|
run_hook 'post-install'
|
1104
993
|
end
|
1105
994
|
|
1106
|
-
def exec_test
|
1107
|
-
run_hook 'pre-test'
|
1108
|
-
each_selected_installers {|inst| inst.exec_test }
|
1109
|
-
run_hook 'post-test'
|
1110
|
-
end
|
1111
|
-
|
1112
995
|
def exec_clean
|
1113
|
-
rm_f
|
996
|
+
rm_f ConfigTable.savefile
|
1114
997
|
run_hook 'pre-clean'
|
1115
998
|
each_selected_installers {|inst| inst.exec_clean }
|
1116
999
|
run_hook 'post-clean'
|
1117
1000
|
end
|
1118
1001
|
|
1119
1002
|
def exec_distclean
|
1120
|
-
rm_f
|
1003
|
+
rm_f ConfigTable.savefile
|
1121
1004
|
run_hook 'pre-distclean'
|
1122
1005
|
each_selected_installers {|inst| inst.exec_distclean }
|
1123
1006
|
run_hook 'post-distclean'
|
@@ -1130,7 +1013,7 @@ class ToplevelInstallerMulti < ToplevelInstaller
|
|
1130
1013
|
def each_selected_installers
|
1131
1014
|
Dir.mkdir 'packages' unless File.dir?('packages')
|
1132
1015
|
@selected.each do |pack|
|
1133
|
-
$stderr.puts "Processing the package `#{pack}' ..." if verbose
|
1016
|
+
$stderr.puts "Processing the package `#{pack}' ..." if @options['verbose']
|
1134
1017
|
Dir.mkdir "packages/#{pack}" unless File.dir?("packages/#{pack}")
|
1135
1018
|
Dir.chdir "packages/#{pack}"
|
1136
1019
|
yield @installers[pack]
|
@@ -1138,32 +1021,28 @@ class ToplevelInstallerMulti < ToplevelInstaller
|
|
1138
1021
|
end
|
1139
1022
|
end
|
1140
1023
|
|
1141
|
-
def run_hook(id)
|
1142
|
-
@root_installer.run_hook id
|
1143
|
-
end
|
1144
|
-
|
1145
|
-
# module FileOperations requires this
|
1146
1024
|
def verbose?
|
1147
|
-
@
|
1025
|
+
@options['verbose']
|
1148
1026
|
end
|
1149
1027
|
|
1150
|
-
# module FileOperations requires this
|
1151
1028
|
def no_harm?
|
1152
|
-
@
|
1029
|
+
@options['no-harm']
|
1153
1030
|
end
|
1154
1031
|
|
1155
|
-
end
|
1032
|
+
end
|
1156
1033
|
|
1157
1034
|
|
1158
1035
|
class Installer
|
1159
1036
|
|
1160
|
-
FILETYPES = %w( bin lib ext data
|
1037
|
+
FILETYPES = %w( bin lib ext data )
|
1161
1038
|
|
1162
|
-
include FileOperations
|
1163
1039
|
include HookScriptAPI
|
1040
|
+
include HookUtils
|
1041
|
+
include FileOperations
|
1164
1042
|
|
1165
|
-
def initialize(config, srcroot, objroot)
|
1043
|
+
def initialize(config, opt, srcroot, objroot)
|
1166
1044
|
@config = config
|
1045
|
+
@options = opt
|
1167
1046
|
@srcdir = File.expand_path(srcroot)
|
1168
1047
|
@objdir = File.expand_path(objroot)
|
1169
1048
|
@currdir = '.'
|
@@ -1173,9 +1052,6 @@ class Installer
|
|
1173
1052
|
"#<#{self.class} #{File.basename(@srcdir)}>"
|
1174
1053
|
end
|
1175
1054
|
|
1176
|
-
def noop(rel)
|
1177
|
-
end
|
1178
|
-
|
1179
1055
|
#
|
1180
1056
|
# Hook Script API base methods
|
1181
1057
|
#
|
@@ -1193,25 +1069,23 @@ class Installer
|
|
1193
1069
|
end
|
1194
1070
|
|
1195
1071
|
#
|
1196
|
-
#
|
1072
|
+
# configs/options
|
1197
1073
|
#
|
1198
1074
|
|
1199
|
-
|
1200
|
-
|
1201
|
-
@config.verbose?
|
1075
|
+
def no_harm?
|
1076
|
+
@options['no-harm']
|
1202
1077
|
end
|
1203
1078
|
|
1204
|
-
|
1205
|
-
|
1206
|
-
@config.no_harm?
|
1079
|
+
def verbose?
|
1080
|
+
@options['verbose']
|
1207
1081
|
end
|
1208
1082
|
|
1209
1083
|
def verbose_off
|
1210
1084
|
begin
|
1211
|
-
save, @
|
1085
|
+
save, @options['verbose'] = @options['verbose'], false
|
1212
1086
|
yield
|
1213
1087
|
ensure
|
1214
|
-
@
|
1088
|
+
@options['verbose'] = save
|
1215
1089
|
end
|
1216
1090
|
end
|
1217
1091
|
|
@@ -1223,19 +1097,22 @@ class Installer
|
|
1223
1097
|
exec_task_traverse 'config'
|
1224
1098
|
end
|
1225
1099
|
|
1226
|
-
|
1227
|
-
|
1100
|
+
def config_dir_bin(rel)
|
1101
|
+
end
|
1102
|
+
|
1103
|
+
def config_dir_lib(rel)
|
1104
|
+
end
|
1228
1105
|
|
1229
1106
|
def config_dir_ext(rel)
|
1230
1107
|
extconf if extdir?(curr_srcdir())
|
1231
1108
|
end
|
1232
1109
|
|
1233
|
-
alias config_dir_data noop
|
1234
|
-
alias config_dir_conf noop
|
1235
|
-
alias config_dir_man noop
|
1236
|
-
|
1237
1110
|
def extconf
|
1238
|
-
|
1111
|
+
opt = @options['config-opt'].join(' ')
|
1112
|
+
command "#{config('rubyprog')} #{curr_srcdir()}/extconf.rb #{opt}"
|
1113
|
+
end
|
1114
|
+
|
1115
|
+
def config_dir_data(rel)
|
1239
1116
|
end
|
1240
1117
|
|
1241
1118
|
#
|
@@ -1247,90 +1124,39 @@ class Installer
|
|
1247
1124
|
end
|
1248
1125
|
|
1249
1126
|
def setup_dir_bin(rel)
|
1250
|
-
|
1251
|
-
|
1127
|
+
all_files_in(curr_srcdir()).each do |fname|
|
1128
|
+
adjust_shebang "#{curr_srcdir()}/#{fname}"
|
1252
1129
|
end
|
1253
1130
|
end
|
1254
1131
|
|
1255
|
-
|
1256
|
-
|
1257
|
-
def setup_dir_ext(rel)
|
1258
|
-
make if extdir?(curr_srcdir())
|
1259
|
-
end
|
1260
|
-
|
1261
|
-
alias setup_dir_data noop
|
1262
|
-
alias setup_dir_conf noop
|
1263
|
-
alias setup_dir_man noop
|
1264
|
-
|
1265
|
-
def update_shebang_line(path)
|
1132
|
+
def adjust_shebang(path)
|
1266
1133
|
return if no_harm?
|
1267
|
-
return if config('shebang') == 'never'
|
1268
|
-
old = Shebang.load(path)
|
1269
|
-
if old
|
1270
|
-
$stderr.puts "warning: #{path}: Shebang line includes too many args. It is not portable and your program may not work." if old.args.size > 1
|
1271
|
-
new = new_shebang(old)
|
1272
|
-
return if new.to_s == old.to_s
|
1273
|
-
else
|
1274
|
-
return unless config('shebang') == 'all'
|
1275
|
-
new = Shebang.new(config('rubypath'))
|
1276
|
-
end
|
1277
|
-
$stderr.puts "updating shebang: #{File.basename(path)}" if verbose?
|
1278
|
-
open_atomic_writer(path) {|output|
|
1279
|
-
File.open(path, 'rb') {|f|
|
1280
|
-
f.gets if old # discard
|
1281
|
-
output.puts new.to_s
|
1282
|
-
output.print f.read
|
1283
|
-
}
|
1284
|
-
}
|
1285
|
-
end
|
1286
|
-
|
1287
|
-
def new_shebang(old)
|
1288
|
-
if /\Aruby/ =~ File.basename(old.cmd)
|
1289
|
-
Shebang.new(config('rubypath'), old.args)
|
1290
|
-
elsif File.basename(old.cmd) == 'env' and old.args.first == 'ruby'
|
1291
|
-
Shebang.new(config('rubypath'), old.args[1..-1])
|
1292
|
-
else
|
1293
|
-
return old unless config('shebang') == 'all'
|
1294
|
-
Shebang.new(config('rubypath'))
|
1295
|
-
end
|
1296
|
-
end
|
1297
|
-
|
1298
|
-
def open_atomic_writer(path, &block)
|
1299
1134
|
tmpfile = File.basename(path) + '.tmp'
|
1300
1135
|
begin
|
1301
|
-
File.open(
|
1302
|
-
|
1136
|
+
File.open(path, 'rb') {|r|
|
1137
|
+
first = r.gets
|
1138
|
+
return unless File.basename(config('rubypath')) == 'ruby'
|
1139
|
+
return unless File.basename(first.sub(/\A\#!/, '').split[0]) == 'ruby'
|
1140
|
+
$stderr.puts "adjusting shebang: #{File.basename(path)}" if verbose?
|
1141
|
+
File.open(tmpfile, 'wb') {|w|
|
1142
|
+
w.print first.sub(/\A\#!\s*\S+/, '#! ' + config('rubypath'))
|
1143
|
+
w.write r.read
|
1144
|
+
}
|
1145
|
+
move_file tmpfile, File.basename(path)
|
1146
|
+
}
|
1303
1147
|
ensure
|
1304
1148
|
File.unlink tmpfile if File.exist?(tmpfile)
|
1305
1149
|
end
|
1306
1150
|
end
|
1307
1151
|
|
1308
|
-
|
1309
|
-
|
1310
|
-
line = nil
|
1311
|
-
File.open(path) {|f|
|
1312
|
-
line = f.gets
|
1313
|
-
}
|
1314
|
-
return nil unless /\A#!/ =~ line
|
1315
|
-
parse(line)
|
1316
|
-
end
|
1317
|
-
|
1318
|
-
def Shebang.parse(line)
|
1319
|
-
cmd, *args = *line.strip.sub(/\A\#!/, '').split(' ')
|
1320
|
-
new(cmd, args)
|
1321
|
-
end
|
1322
|
-
|
1323
|
-
def initialize(cmd, args = [])
|
1324
|
-
@cmd = cmd
|
1325
|
-
@args = args
|
1326
|
-
end
|
1152
|
+
def setup_dir_lib(rel)
|
1153
|
+
end
|
1327
1154
|
|
1328
|
-
|
1329
|
-
|
1155
|
+
def setup_dir_ext(rel)
|
1156
|
+
make if extdir?(curr_srcdir())
|
1157
|
+
end
|
1330
1158
|
|
1331
|
-
|
1332
|
-
"#! #{@cmd}" + (@args.empty? ? '' : " #{@args.join(' ')}")
|
1333
|
-
end
|
1159
|
+
def setup_dir_data(rel)
|
1334
1160
|
end
|
1335
1161
|
|
1336
1162
|
#
|
@@ -1343,77 +1169,63 @@ class Installer
|
|
1343
1169
|
end
|
1344
1170
|
|
1345
1171
|
def install_dir_bin(rel)
|
1346
|
-
install_files
|
1172
|
+
install_files collect_filenames_auto(), "#{config('bindir')}/#{rel}", 0755
|
1347
1173
|
end
|
1348
1174
|
|
1349
1175
|
def install_dir_lib(rel)
|
1350
|
-
install_files
|
1176
|
+
install_files ruby_scripts(), "#{config('rbdir')}/#{rel}", 0644
|
1351
1177
|
end
|
1352
1178
|
|
1353
1179
|
def install_dir_ext(rel)
|
1354
1180
|
return unless extdir?(curr_srcdir())
|
1355
|
-
install_files
|
1181
|
+
install_files ruby_extentions('.'),
|
1356
1182
|
"#{config('sodir')}/#{File.dirname(rel)}",
|
1357
1183
|
0555
|
1358
1184
|
end
|
1359
1185
|
|
1360
1186
|
def install_dir_data(rel)
|
1361
|
-
install_files
|
1362
|
-
end
|
1363
|
-
|
1364
|
-
def install_dir_conf(rel)
|
1365
|
-
# FIXME: should not remove current config files
|
1366
|
-
# (rename previous file to .old/.org)
|
1367
|
-
install_files targetfiles(), "#{config('sysconfdir')}/#{rel}", 0644
|
1368
|
-
end
|
1369
|
-
|
1370
|
-
def install_dir_man(rel)
|
1371
|
-
install_files targetfiles(), "#{config('mandir')}/#{rel}", 0644
|
1187
|
+
install_files collect_filenames_auto(), "#{config('datadir')}/#{rel}", 0644
|
1372
1188
|
end
|
1373
1189
|
|
1374
1190
|
def install_files(list, dest, mode)
|
1375
|
-
mkdir_p dest, @
|
1191
|
+
mkdir_p dest, @options['install-prefix']
|
1376
1192
|
list.each do |fname|
|
1377
|
-
install fname, dest, mode, @
|
1378
|
-
end
|
1379
|
-
end
|
1380
|
-
|
1381
|
-
def libfiles
|
1382
|
-
glob_reject(%w(*.y *.output), targetfiles())
|
1383
|
-
end
|
1384
|
-
|
1385
|
-
def rubyextentions(dir)
|
1386
|
-
ents = glob_select("*.#{@config.dllext}", targetfiles())
|
1387
|
-
if ents.empty?
|
1388
|
-
setup_rb_error "no ruby extention exists: 'ruby #{$0} setup' first"
|
1193
|
+
install fname, dest, mode, @options['install-prefix']
|
1389
1194
|
end
|
1390
|
-
ents
|
1391
|
-
end
|
1392
|
-
|
1393
|
-
def targetfiles
|
1394
|
-
mapdir(existfiles() - hookfiles())
|
1395
1195
|
end
|
1396
1196
|
|
1397
|
-
def
|
1398
|
-
|
1399
|
-
if File.exist?(ent)
|
1400
|
-
then ent # objdir
|
1401
|
-
else "#{curr_srcdir()}/#{ent}" # srcdir
|
1402
|
-
end
|
1403
|
-
}
|
1197
|
+
def ruby_scripts
|
1198
|
+
collect_filenames_auto().select {|n| /\.rb\z/ =~ n }
|
1404
1199
|
end
|
1405
|
-
|
1200
|
+
|
1406
1201
|
# picked up many entries from cvs-1.11.1/src/ignore.c
|
1407
|
-
|
1202
|
+
reject_patterns = %w(
|
1408
1203
|
core RCSLOG tags TAGS .make.state
|
1409
1204
|
.nse_depinfo #* .#* cvslog.* ,* .del-* *.olb
|
1410
1205
|
*~ *.old *.bak *.BAK *.orig *.rej _$* *$
|
1411
1206
|
|
1412
1207
|
*.org *.in .*
|
1413
1208
|
)
|
1209
|
+
mapping = {
|
1210
|
+
'.' => '\.',
|
1211
|
+
'$' => '\$',
|
1212
|
+
'#' => '\#',
|
1213
|
+
'*' => '.*'
|
1214
|
+
}
|
1215
|
+
REJECT_PATTERNS = Regexp.new('\A(?:' +
|
1216
|
+
reject_patterns.map {|pat|
|
1217
|
+
pat.gsub(/[\.\$\#\*]/) {|ch| mapping[ch] }
|
1218
|
+
}.join('|') +
|
1219
|
+
')\z')
|
1220
|
+
|
1221
|
+
def collect_filenames_auto
|
1222
|
+
mapdir((existfiles() - hookfiles()).reject {|fname|
|
1223
|
+
REJECT_PATTERNS =~ fname
|
1224
|
+
})
|
1225
|
+
end
|
1414
1226
|
|
1415
1227
|
def existfiles
|
1416
|
-
|
1228
|
+
all_files_in(curr_srcdir()) | all_files_in('.')
|
1417
1229
|
end
|
1418
1230
|
|
1419
1231
|
def hookfiles
|
@@ -1422,49 +1234,24 @@ class Installer
|
|
1422
1234
|
}.flatten
|
1423
1235
|
end
|
1424
1236
|
|
1425
|
-
def
|
1426
|
-
|
1427
|
-
|
1428
|
-
|
1429
|
-
|
1430
|
-
|
1431
|
-
|
1432
|
-
|
1433
|
-
end
|
1434
|
-
|
1435
|
-
GLOB2REGEX = {
|
1436
|
-
'.' => '\.',
|
1437
|
-
'$' => '\$',
|
1438
|
-
'#' => '\#',
|
1439
|
-
'*' => '.*'
|
1440
|
-
}
|
1441
|
-
|
1442
|
-
def globs2re(pats)
|
1443
|
-
/\A(?:#{
|
1444
|
-
pats.map {|pat| pat.gsub(/[\.\$\#\*]/) {|ch| GLOB2REGEX[ch] } }.join('|')
|
1445
|
-
})\z/
|
1237
|
+
def mapdir(filelist)
|
1238
|
+
filelist.map {|fname|
|
1239
|
+
if File.exist?(fname) # objdir
|
1240
|
+
fname
|
1241
|
+
else # srcdir
|
1242
|
+
File.join(curr_srcdir(), fname)
|
1243
|
+
end
|
1244
|
+
}
|
1446
1245
|
end
|
1447
1246
|
|
1448
|
-
|
1449
|
-
|
1450
|
-
|
1451
|
-
|
1452
|
-
|
1453
|
-
|
1454
|
-
|
1455
|
-
|
1456
|
-
$stderr.puts 'no test in this package' if verbose?
|
1457
|
-
return
|
1458
|
-
end
|
1459
|
-
$stderr.puts 'Running tests...' if verbose?
|
1460
|
-
begin
|
1461
|
-
require 'test/unit'
|
1462
|
-
rescue LoadError
|
1463
|
-
setup_rb_error 'test/unit cannot loaded. You need Ruby 1.8 or later to invoke this task.'
|
1464
|
-
end
|
1465
|
-
runner = Test::Unit::AutoRunner.new(true)
|
1466
|
-
runner.to_run << TESTDIR
|
1467
|
-
runner.run
|
1247
|
+
def ruby_extentions(dir)
|
1248
|
+
Dir.open(dir) {|d|
|
1249
|
+
ents = d.select {|fname| /\.#{::Config::CONFIG['DLEXT']}\z/ =~ fname }
|
1250
|
+
if ents.empty?
|
1251
|
+
setup_rb_error "no ruby extention exists: 'ruby #{$0} setup' first"
|
1252
|
+
end
|
1253
|
+
return ents
|
1254
|
+
}
|
1468
1255
|
end
|
1469
1256
|
|
1470
1257
|
#
|
@@ -1473,51 +1260,53 @@ class Installer
|
|
1473
1260
|
|
1474
1261
|
def exec_clean
|
1475
1262
|
exec_task_traverse 'clean'
|
1476
|
-
rm_f
|
1263
|
+
rm_f ConfigTable.savefile
|
1477
1264
|
rm_f 'InstalledFiles'
|
1478
1265
|
end
|
1479
1266
|
|
1480
|
-
|
1481
|
-
|
1482
|
-
|
1483
|
-
|
1484
|
-
|
1267
|
+
def clean_dir_bin(rel)
|
1268
|
+
end
|
1269
|
+
|
1270
|
+
def clean_dir_lib(rel)
|
1271
|
+
end
|
1485
1272
|
|
1486
1273
|
def clean_dir_ext(rel)
|
1487
1274
|
return unless extdir?(curr_srcdir())
|
1488
1275
|
make 'clean' if File.file?('Makefile')
|
1489
1276
|
end
|
1490
1277
|
|
1278
|
+
def clean_dir_data(rel)
|
1279
|
+
end
|
1280
|
+
|
1491
1281
|
#
|
1492
1282
|
# TASK distclean
|
1493
1283
|
#
|
1494
1284
|
|
1495
1285
|
def exec_distclean
|
1496
1286
|
exec_task_traverse 'distclean'
|
1497
|
-
rm_f
|
1287
|
+
rm_f ConfigTable.savefile
|
1498
1288
|
rm_f 'InstalledFiles'
|
1499
1289
|
end
|
1500
1290
|
|
1501
|
-
|
1502
|
-
|
1291
|
+
def distclean_dir_bin(rel)
|
1292
|
+
end
|
1293
|
+
|
1294
|
+
def distclean_dir_lib(rel)
|
1295
|
+
end
|
1503
1296
|
|
1504
1297
|
def distclean_dir_ext(rel)
|
1505
1298
|
return unless extdir?(curr_srcdir())
|
1506
1299
|
make 'distclean' if File.file?('Makefile')
|
1507
1300
|
end
|
1508
1301
|
|
1509
|
-
alias distclean_dir_data noop
|
1510
|
-
alias distclean_dir_conf noop
|
1511
|
-
alias distclean_dir_man noop
|
1512
|
-
|
1513
1302
|
#
|
1514
|
-
#
|
1303
|
+
# lib
|
1515
1304
|
#
|
1516
1305
|
|
1517
1306
|
def exec_task_traverse(task)
|
1518
1307
|
run_hook "pre-#{task}"
|
1519
1308
|
FILETYPES.each do |type|
|
1520
|
-
if
|
1309
|
+
if config('without-ext') == 'yes' and type == 'ext'
|
1521
1310
|
$stderr.puts 'skipping ext/* by user option' if verbose?
|
1522
1311
|
next
|
1523
1312
|
end
|
@@ -1530,7 +1319,7 @@ class Installer
|
|
1530
1319
|
dive_into(rel) {
|
1531
1320
|
run_hook "pre-#{task}"
|
1532
1321
|
__send__ mid, rel.sub(%r[\A.*?(?:/|\z)], '')
|
1533
|
-
|
1322
|
+
all_dirs_in(curr_srcdir()).each do |d|
|
1534
1323
|
traverse task, "#{rel}/#{d}", mid
|
1535
1324
|
end
|
1536
1325
|
run_hook "post-#{task}"
|
@@ -1552,30 +1341,16 @@ class Installer
|
|
1552
1341
|
@currdir = File.dirname(rel)
|
1553
1342
|
end
|
1554
1343
|
|
1555
|
-
def run_hook(id)
|
1556
|
-
path = [ "#{curr_srcdir()}/#{id}",
|
1557
|
-
"#{curr_srcdir()}/#{id}.rb" ].detect {|cand| File.file?(cand) }
|
1558
|
-
return unless path
|
1559
|
-
begin
|
1560
|
-
instance_eval File.read(path), path, 1
|
1561
|
-
rescue
|
1562
|
-
raise if $DEBUG
|
1563
|
-
setup_rb_error "hook #{path} failed:\n" + $!.message
|
1564
|
-
end
|
1565
|
-
end
|
1566
|
-
|
1567
|
-
end # class Installer
|
1568
|
-
|
1569
|
-
|
1570
|
-
class SetupError < StandardError; end
|
1571
|
-
|
1572
|
-
def setup_rb_error(msg)
|
1573
|
-
raise SetupError, msg
|
1574
1344
|
end
|
1575
1345
|
|
1346
|
+
|
1576
1347
|
if $0 == __FILE__
|
1577
1348
|
begin
|
1578
|
-
|
1349
|
+
if multipackage_install?
|
1350
|
+
ToplevelInstallerMulti.invoke
|
1351
|
+
else
|
1352
|
+
ToplevelInstaller.invoke
|
1353
|
+
end
|
1579
1354
|
rescue SetupError
|
1580
1355
|
raise if $DEBUG
|
1581
1356
|
$stderr.puts $!.message
|