autoproj 1.6.1 → 1.6.2.rc2
Sign up to get free protection for your applications and to get access to all the features.
- data/Rakefile +2 -0
- data/bin/autoproj +33 -22
- data/doc/guide/src/autoproj_bootstrap +636 -284
- data/lib/autoproj/cmdline.rb +233 -70
- data/lib/autoproj/manifest.rb +50 -16
- data/lib/autoproj/options.rb +13 -3
- data/lib/autoproj/osdeps.rb +368 -149
- data/lib/autoproj/system.rb +1 -1
- data/lib/autoproj/version.rb +1 -1
- metadata +13 -22
data/Rakefile
CHANGED
@@ -51,6 +51,7 @@ namespace 'dist' do
|
|
51
51
|
task 'bootstrap' do
|
52
52
|
require 'yaml'
|
53
53
|
osdeps_code = File.read(File.join(Dir.pwd, 'lib', 'autoproj', 'osdeps.rb'))
|
54
|
+
options_code = File.read(File.join(Dir.pwd, 'lib', 'autoproj', 'options.rb'))
|
54
55
|
osdeps_defaults = File.read(File.join(Dir.pwd, 'lib', 'autoproj', 'default.osdeps'))
|
55
56
|
# Filter rubygems dependencies from the OSdeps default. They will be
|
56
57
|
# installed at first build
|
@@ -67,6 +68,7 @@ namespace 'dist' do
|
|
67
68
|
|
68
69
|
bootstrap_code = File.read(File.join(Dir.pwd, 'bin', 'autoproj_bootstrap.in')).
|
69
70
|
gsub('OSDEPS_CODE', osdeps_code).
|
71
|
+
gsub('OPTIONS_CODE', options_code).
|
70
72
|
gsub('OSDEPS_DEFAULTS', osdeps_defaults)
|
71
73
|
File.open(File.join(Dir.pwd, 'doc', 'guide', 'src', 'autoproj_bootstrap'), 'w') do |io|
|
72
74
|
io.write bootstrap_code
|
data/bin/autoproj
CHANGED
@@ -21,8 +21,8 @@ end
|
|
21
21
|
def report(debug)
|
22
22
|
Autobuild::Reporting.report do
|
23
23
|
yield
|
24
|
-
Autobuild::Reporting.success
|
25
24
|
end
|
25
|
+
Autobuild::Reporting.success
|
26
26
|
|
27
27
|
rescue ConfigError => e
|
28
28
|
STDERR.puts
|
@@ -51,7 +51,7 @@ Autoproj::OSDependencies.autodetect_ruby
|
|
51
51
|
report(Autobuild.debug) do
|
52
52
|
selected_packages =
|
53
53
|
begin Autoproj::CmdLine.parse_arguments(ARGV.dup)
|
54
|
-
rescue
|
54
|
+
rescue RuntimeError => e
|
55
55
|
if Autoproj::CmdLine.bootstrap? && !Autoproj.in_autoproj_installation?(Dir.pwd)
|
56
56
|
STDERR.puts <<EOTEXT
|
57
57
|
|
@@ -86,8 +86,10 @@ EOTEXT
|
|
86
86
|
|
87
87
|
# Basic initialization
|
88
88
|
Autoproj::CmdLine.initialize
|
89
|
-
|
90
|
-
|
89
|
+
if selected_packages.empty?
|
90
|
+
Autoproj::CmdLine.update_myself
|
91
|
+
Autoproj::CmdLine.update_configuration
|
92
|
+
end
|
91
93
|
Autoproj::CmdLine.load_configuration
|
92
94
|
manifest = Autoproj.manifest
|
93
95
|
|
@@ -154,6 +156,12 @@ EOTEXT
|
|
154
156
|
all_enabled_packages = Autoproj::CmdLine.import_packages(selected_packages)
|
155
157
|
Autoproj::CmdLine.snapshot(Autoproj::CmdLine.snapshot_dir, all_enabled_packages)
|
156
158
|
exit(0)
|
159
|
+
elsif Autoproj::CmdLine.revshow_osdeps?
|
160
|
+
all_enabled_packages = Autoproj::CmdLine.import_packages(selected_packages)
|
161
|
+
Autoproj::CmdLine.revshow_osdeps(all_enabled_packages)
|
162
|
+
elsif Autoproj::CmdLine.show_osdeps?
|
163
|
+
all_enabled_packages = Autoproj::CmdLine.import_packages(selected_packages)
|
164
|
+
Autoproj::CmdLine.show_osdeps(all_enabled_packages)
|
157
165
|
end
|
158
166
|
|
159
167
|
STDERR.puts
|
@@ -165,36 +173,39 @@ EOTEXT
|
|
165
173
|
Autoproj.osdeps.install(Autoproj.build_system_dependencies)
|
166
174
|
end
|
167
175
|
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
176
|
+
# Now, we actually do the import. Unfortunately, at this stage, we need to
|
177
|
+
# import the package and its dependencies ourselves so that we are able to
|
178
|
+
# build the list of packages that have actually been selected on the command
|
179
|
+
# line.
|
180
|
+
all_enabled_packages = Autoproj::CmdLine.import_packages(selected_packages)
|
181
|
+
|
182
|
+
if all_enabled_packages.empty?
|
183
|
+
STDERR.puts color("autoproj: nothing to do", :bold)
|
184
|
+
elsif Autoproj::CmdLine.update_os_dependencies?
|
185
|
+
manifest.install_os_dependencies(all_enabled_packages)
|
186
|
+
elsif Autoproj::CmdLine.doc?
|
187
|
+
Autoproj::CmdLine.build_packages(selected_packages, all_enabled_packages)
|
188
|
+
elsif Autoproj::CmdLine.build?
|
189
|
+
begin
|
190
|
+
Autoproj::CmdLine.build_packages(selected_packages, all_enabled_packages)
|
183
191
|
|
184
192
|
# Now, do some sanity checks on the result
|
185
193
|
prefixes = all_enabled_packages.inject(Set.new) do |set, pkg_name|
|
186
194
|
set << Autobuild::Package[pkg_name].prefix
|
187
195
|
end
|
196
|
+
|
197
|
+
Autoproj.progress
|
198
|
+
Autoproj.progress "checking for undefined symbols in installed libraries", :bold
|
188
199
|
prefixes.each do |prefix|
|
189
200
|
libdir = File.join(prefix, "lib")
|
190
201
|
if File.directory?(libdir)
|
191
202
|
Autoproj.validate_solib_dependencies(libdir)
|
192
203
|
end
|
193
204
|
end
|
205
|
+
ensure
|
206
|
+
Autoproj.export_env_sh
|
207
|
+
STDERR.puts color("autoproj: updated #{Autoproj.root_dir}/env.sh", :green)
|
194
208
|
end
|
195
|
-
ensure
|
196
|
-
Autoproj.export_env_sh
|
197
|
-
STDERR.puts color("autoproj: updated #{Autoproj.root_dir}/env.sh", :green)
|
198
209
|
end
|
199
210
|
end
|
200
211
|
|
@@ -5,6 +5,30 @@ if RUBY_VERSION < "1.8.7"
|
|
5
5
|
exit 1
|
6
6
|
end
|
7
7
|
|
8
|
+
require 'set'
|
9
|
+
curdir_entries = Dir.entries('.').to_set - [".", "..", "autoproj_bootstrap", ".gems", 'env.sh'].to_set
|
10
|
+
if !curdir_entries.empty? && ENV['AUTOPROJ_BOOTSTRAP_IGNORE_NONEMPTY_DIR'] != '1'
|
11
|
+
while true
|
12
|
+
print "The current directory is not empty, continue bootstrapping anyway ? [yes] "
|
13
|
+
STDOUT.flush
|
14
|
+
answer = STDIN.readline.chomp
|
15
|
+
if answer == "no"
|
16
|
+
exit
|
17
|
+
elsif answer == "" || answer == "yes"
|
18
|
+
# Set the environment variable since we might restart the
|
19
|
+
# autoproj_bootstrap script and -- anyway -- will run "autoproj
|
20
|
+
# bootstrap" later on
|
21
|
+
break
|
22
|
+
else
|
23
|
+
STDOUT.puts "invalid answer. Please answer 'yes' or 'no'"
|
24
|
+
STDOUT.flush
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
# Environment is clean, so just mark it as so unconditionally
|
30
|
+
ENV['AUTOPROJ_BOOTSTRAP_IGNORE_NONEMPTY_DIR'] = '1'
|
31
|
+
|
8
32
|
needed_gem_home = ENV['AUTOPROJ_GEM_HOME'] || "#{Dir.pwd}/.gems"
|
9
33
|
if $LOADED_FEATURES.find { |str| str =~ /bygems/ }
|
10
34
|
if ENV['GEM_HOME'] != needed_gem_home
|
@@ -27,26 +51,15 @@ module Autoproj
|
|
27
51
|
class ConfigError < RuntimeError; end
|
28
52
|
class << self
|
29
53
|
attr_reader :verbose
|
30
|
-
attr_reader :config
|
31
|
-
end
|
32
|
-
@config = Hash.new
|
33
|
-
|
34
|
-
# Fake option management for the OSdeps class
|
35
|
-
def self.has_config_key?(key)
|
36
|
-
config.has_key?(key)
|
37
|
-
end
|
38
|
-
|
39
|
-
def self.user_config(key)
|
40
|
-
config[key]
|
41
|
-
end
|
42
|
-
|
43
|
-
def self.change_option(name, value, ignored = true)
|
44
|
-
config[name] = value
|
45
54
|
end
|
46
55
|
|
47
56
|
def self.color(string, *args)
|
48
57
|
string
|
49
58
|
end
|
59
|
+
|
60
|
+
def self.progress(str)
|
61
|
+
STDERR.puts " #{str}"
|
62
|
+
end
|
50
63
|
end
|
51
64
|
|
52
65
|
module Autobuild
|
@@ -106,6 +119,9 @@ module Autoproj
|
|
106
119
|
end
|
107
120
|
@aliases = Hash.new
|
108
121
|
|
122
|
+
attr_writer :silent
|
123
|
+
def silent?; @silent end
|
124
|
+
|
109
125
|
def self.alias(old_name, new_name)
|
110
126
|
@aliases[new_name] = old_name
|
111
127
|
end
|
@@ -138,17 +154,24 @@ module Autoproj
|
|
138
154
|
# The Gem::SpecFetcher object that should be used to query RubyGems, and
|
139
155
|
# install RubyGems packages
|
140
156
|
def gem_fetcher
|
141
|
-
|
157
|
+
if !@gem_fetcher
|
158
|
+
Autobuild.progress "looking for RubyGems updates"
|
159
|
+
@gem_fetcher = Gem::SpecFetcher.fetcher
|
160
|
+
end
|
161
|
+
@gem_fetcher
|
142
162
|
end
|
143
163
|
|
144
164
|
def initialize(defs = Hash.new, file = nil)
|
145
165
|
@definitions = defs.to_hash
|
146
166
|
@sources = Hash.new
|
167
|
+
@installed_packages = Array.new
|
147
168
|
if file
|
148
169
|
defs.each_key do |package_name|
|
149
170
|
sources[package_name] = file
|
150
171
|
end
|
151
172
|
end
|
173
|
+
@silent = true
|
174
|
+
@filter_uptodate_packages = true
|
152
175
|
end
|
153
176
|
|
154
177
|
# Returns the full path to the osdeps file from which the package
|
@@ -194,10 +217,15 @@ module Autoproj
|
|
194
217
|
# Returns true if it is possible to install packages for the operating
|
195
218
|
# system on which we are installed
|
196
219
|
def self.supported_operating_system?
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
220
|
+
if @supported_operating_system.nil?
|
221
|
+
osdef = operating_system
|
222
|
+
@supported_operating_system =
|
223
|
+
if !osdef then false
|
224
|
+
else
|
225
|
+
OS_AUTO_PACKAGE_INSTALL.has_key?(osdef[0])
|
226
|
+
end
|
227
|
+
end
|
228
|
+
return @supported_operating_system
|
201
229
|
end
|
202
230
|
|
203
231
|
# Autodetects the operating system name and version
|
@@ -214,11 +242,14 @@ module Autoproj
|
|
214
242
|
if @operating_system
|
215
243
|
return @operating_system
|
216
244
|
elsif Autoproj.has_config_key?('operating_system')
|
217
|
-
@operating_system = Autoproj.user_config('operating_system')
|
218
|
-
|
245
|
+
return (@operating_system = Autoproj.user_config('operating_system'))
|
246
|
+
end
|
247
|
+
|
248
|
+
Autoproj.progress " autodetecting the operating system"
|
249
|
+
if data = os_from_lsb
|
219
250
|
if data[0] != "debian"
|
220
|
-
#
|
221
|
-
# sid is listed as lenny by lsb-release
|
251
|
+
# if on Debian proper, fall back to reading debian_version,
|
252
|
+
# as sid is listed as lenny by lsb-release
|
222
253
|
@operating_system = data
|
223
254
|
end
|
224
255
|
end
|
@@ -266,15 +297,48 @@ module Autoproj
|
|
266
297
|
return [distributor, [codename, version]]
|
267
298
|
end
|
268
299
|
|
300
|
+
# On a dpkg-enabled system, checks if the provided package is installed
|
301
|
+
# and returns true if it is the case
|
302
|
+
def self.dpkg_package_installed?(package_name)
|
303
|
+
if !@dpkg_installed_packages
|
304
|
+
@dpkg_installed_packages = Set.new
|
305
|
+
dpkg_status = File.readlines('/var/lib/dpkg/status')
|
306
|
+
dpkg_status.grep(/^(Package|Status)/).
|
307
|
+
each_slice(2) do |package, status|
|
308
|
+
if status.chomp == "Status: install ok installed"
|
309
|
+
@dpkg_installed_packages << package.split[1].chomp
|
310
|
+
end
|
311
|
+
end
|
312
|
+
end
|
313
|
+
|
314
|
+
if package_name =~ /^(\w[a-z0-9+-.]+)/
|
315
|
+
@dpkg_installed_packages.include?($1)
|
316
|
+
else
|
317
|
+
Autoproj.progress "WARN: #{package_name} is not a valid Debian package name"
|
318
|
+
false
|
319
|
+
end
|
320
|
+
end
|
269
321
|
|
270
322
|
GAIN_ROOT_ACCESS = <<-EOSCRIPT
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
323
|
+
# Gain root access using sudo
|
324
|
+
if test `id -u` != "0"; then
|
325
|
+
exec sudo /bin/bash $0 "$@"
|
326
|
+
|
327
|
+
fi
|
275
328
|
EOSCRIPT
|
276
329
|
|
277
|
-
|
330
|
+
OS_PACKAGE_CHECK = {
|
331
|
+
'debian' => method(:dpkg_package_installed?),
|
332
|
+
'ubuntu' => method(:dpkg_package_installed?)
|
333
|
+
}
|
334
|
+
OS_USER_PACKAGE_INSTALL = {
|
335
|
+
'debian' => "apt-get install '%s'",
|
336
|
+
'ubuntu' => "apt-get install '%s'",
|
337
|
+
'gentoo' => "emerge '%s'",
|
338
|
+
'arch' => "pacman '%s'"
|
339
|
+
}
|
340
|
+
|
341
|
+
OS_AUTO_PACKAGE_INSTALL = {
|
278
342
|
'debian' => "export DEBIAN_FRONTEND=noninteractive; apt-get install -y '%s'",
|
279
343
|
'ubuntu' => "export DEBIAN_FRONTEND=noninteractive; apt-get install -y '%s'",
|
280
344
|
'gentoo' => "emerge --noreplace '%s'",
|
@@ -286,7 +350,6 @@ module Autoproj
|
|
286
350
|
WRONG_OS_VERSION = 2
|
287
351
|
IGNORE = 3
|
288
352
|
PACKAGES = 4
|
289
|
-
SHELL_SNIPPET = 5
|
290
353
|
UNKNOWN_OS = 7
|
291
354
|
AVAILABLE = 10
|
292
355
|
|
@@ -308,9 +371,6 @@ module Autoproj
|
|
308
371
|
# [PACKAGES, definition]::
|
309
372
|
# +definition+ is an array of package names that this OS's package
|
310
373
|
# manager can understand
|
311
|
-
# [SHELL_SNIPPET, definition]::
|
312
|
-
# +definition+ is a string which is a shell snippet that will install
|
313
|
-
# the package
|
314
374
|
def resolve_package(name)
|
315
375
|
os_name, os_version = OSDependencies.operating_system
|
316
376
|
|
@@ -346,7 +406,7 @@ module Autoproj
|
|
346
406
|
version_list.to_s.split(',').
|
347
407
|
map(&:downcase).
|
348
408
|
any? do |v|
|
349
|
-
|
409
|
+
os_version.any? { |osv| Regexp.new(v) =~ osv }
|
350
410
|
end
|
351
411
|
end
|
352
412
|
|
@@ -361,7 +421,7 @@ module Autoproj
|
|
361
421
|
elsif data.to_str =~ /\w+/
|
362
422
|
return [PACKAGES, [data.to_str]]
|
363
423
|
else
|
364
|
-
|
424
|
+
raise ConfigError, "invalid package specificiation #{data} in #{source_of(name)}"
|
365
425
|
end
|
366
426
|
end
|
367
427
|
|
@@ -373,7 +433,6 @@ module Autoproj
|
|
373
433
|
os_name, os_version = OSDependencies.operating_system
|
374
434
|
|
375
435
|
os_packages = []
|
376
|
-
shell_snippets = []
|
377
436
|
dependencies.each do |name|
|
378
437
|
result = resolve_package(name)
|
379
438
|
if result == NO_PACKAGE
|
@@ -381,32 +440,30 @@ module Autoproj
|
|
381
440
|
elsif result == WRONG_OS
|
382
441
|
raise ConfigError, "there is an osdeps definition for #{name}, but not for this operating system"
|
383
442
|
elsif result == WRONG_OS_VERSION
|
384
|
-
raise ConfigError, "there is an osdeps definition for #{name}, but
|
443
|
+
raise ConfigError, "there is an osdeps definition for #{name}, but not for this particular operating system version"
|
385
444
|
elsif result == IGNORE
|
386
445
|
next
|
387
446
|
elsif result[0] == PACKAGES
|
388
447
|
os_packages.concat(result[1])
|
389
|
-
elsif result[0] == SHELL_SNIPPET
|
390
|
-
shell_snippets << result[1]
|
391
448
|
end
|
392
449
|
end
|
393
450
|
|
394
|
-
if !
|
451
|
+
if !OS_AUTO_PACKAGE_INSTALL.has_key?(os_name)
|
395
452
|
raise ConfigError, "I don't know how to install packages on #{os_name}"
|
396
453
|
end
|
397
454
|
|
398
|
-
return os_packages
|
455
|
+
return os_packages
|
399
456
|
end
|
400
457
|
|
401
458
|
|
402
|
-
def
|
403
|
-
os_name
|
404
|
-
|
405
|
-
|
406
|
-
|
407
|
-
|
408
|
-
|
409
|
-
|
459
|
+
def generate_user_os_script(os_name, os_packages)
|
460
|
+
if OS_USER_PACKAGE_INSTALL[os_name]
|
461
|
+
(OS_USER_PACKAGE_INSTALL[os_name] % [os_packages.join("' '")])
|
462
|
+
else generate_auto_os_script(os_name, os_packages)
|
463
|
+
end
|
464
|
+
end
|
465
|
+
def generate_auto_os_script(os_name, os_packages)
|
466
|
+
(OS_AUTO_PACKAGE_INSTALL[os_name] % [os_packages.join("' '")])
|
410
467
|
end
|
411
468
|
|
412
469
|
# Returns true if +name+ is an acceptable OS package for this OS and
|
@@ -497,9 +554,25 @@ module Autoproj
|
|
497
554
|
end
|
498
555
|
end
|
499
556
|
|
500
|
-
|
501
|
-
|
557
|
+
# Returns true if the osdeps system knows how to remove uptodate
|
558
|
+
# packages from the needs-to-be-installed package list on this OS
|
559
|
+
def can_filter_uptodate_packages?
|
560
|
+
os_name, _ = OSDependencies.operating_system
|
561
|
+
!!OS_PACKAGE_CHECK[os_name]
|
562
|
+
end
|
563
|
+
|
564
|
+
# Returns the set of packages in +packages+ that are not already
|
565
|
+
# installed on this OS, if it is supported
|
566
|
+
def filter_uptodate_os_packages(packages, os_name)
|
567
|
+
check_method = OS_PACKAGE_CHECK[os_name]
|
568
|
+
return packages.dup if !check_method
|
569
|
+
|
570
|
+
packages.find_all { |pkg| !check_method[pkg] }
|
571
|
+
end
|
502
572
|
|
573
|
+
# Returns the set of RubyGem packages in +packages+ that are not already
|
574
|
+
# installed, or that can be upgraded
|
575
|
+
def filter_uptodate_gems(gems)
|
503
576
|
# Don't install gems that are already there ...
|
504
577
|
gems = gems.dup
|
505
578
|
gems.delete_if do |name|
|
@@ -520,143 +593,300 @@ module Autoproj
|
|
520
593
|
gems
|
521
594
|
end
|
522
595
|
|
523
|
-
|
524
|
-
|
525
|
-
|
526
|
-
|
596
|
+
HANDLE_ALL = 'all'
|
597
|
+
HANDLE_RUBY = 'ruby'
|
598
|
+
HANDLE_OS = 'os'
|
599
|
+
HANDLE_NONE = 'none'
|
600
|
+
|
601
|
+
def self.osdeps_mode_option_unsupported_os
|
602
|
+
long_doc =<<-EOT
|
603
|
+
The software packages that autoproj will have to build may require other
|
604
|
+
prepackaged softwares (a.k.a. OS dependencies) to be installed (RubyGems
|
605
|
+
packages, packages from your operating system/distribution, ...). Autoproj is
|
606
|
+
usually able to install those automatically, but unfortunately your operating
|
607
|
+
system is not (yet) supported by autoproj's osdeps mechanism, it can only offer
|
608
|
+
you some limited support.
|
609
|
+
|
610
|
+
RubyGem packages are a cross-platform mechanism, and are therefore supported.
|
611
|
+
However, you will have to install the kind of OS dependencies (so-called OS
|
612
|
+
packages)
|
613
|
+
|
614
|
+
This option is meant to allow you to control autoproj's behaviour while handling
|
615
|
+
OS dependencies.
|
616
|
+
|
617
|
+
* if you say "ruby", the RubyGem packages will be installed.
|
618
|
+
* if you say "none", autoproj will not do anything related to the OS
|
619
|
+
dependencies.
|
620
|
+
|
621
|
+
As any configuration value, the mode can be changed anytime by calling
|
622
|
+
an autoproj operation with the --reconfigure option (e.g. autoproj update
|
623
|
+
--reconfigure).
|
624
|
+
|
625
|
+
Finally, OS dependencies can be installed by calling "autoproj osdeps"
|
626
|
+
with the corresponding option (--all, --ruby, --os or --none). Calling
|
627
|
+
"autoproj osdeps" without arguments will also give you information as
|
628
|
+
to what you should install to compile the software successfully.
|
629
|
+
EOT
|
630
|
+
message = [ "Which prepackaged software (a.k.a. 'osdeps') should autoproj install automatically (ruby, none) ?", long_doc.strip ]
|
631
|
+
|
632
|
+
Autoproj.configuration_option 'osdeps_mode', 'string',
|
633
|
+
:default => 'ruby',
|
634
|
+
:doc => [short_doc, long_doc],
|
635
|
+
:possible_values => %w{ruby none},
|
636
|
+
:lowercase => true
|
637
|
+
end
|
527
638
|
|
528
|
-
def
|
529
|
-
|
530
|
-
|
531
|
-
|
532
|
-
|
533
|
-
|
534
|
-
|
535
|
-
|
536
|
-
|
537
|
-
|
639
|
+
def self.osdeps_mode_option_supported_os
|
640
|
+
long_doc =<<-EOT
|
641
|
+
The software packages that autoproj will have to build may require other
|
642
|
+
prepackaged softwares (a.k.a. OS dependencies) to be installed (RubyGems
|
643
|
+
packages, packages from your operating system/distribution, ...). Autoproj
|
644
|
+
is able to install those automatically for you.
|
645
|
+
|
646
|
+
Advanced users may want to control this behaviour. Additionally, the
|
647
|
+
installation of some packages require administration rights, which you may
|
648
|
+
not have. This option is meant to allow you to control autoproj's behaviour
|
649
|
+
while handling OS dependencies.
|
650
|
+
|
651
|
+
* if you say "all", it will install all packages automatically.
|
652
|
+
This requires root access thru 'sudo'
|
653
|
+
* if you say "ruby", only the Ruby packages will be installed.
|
654
|
+
Installing these packages does not require root access.
|
655
|
+
* if you say "os", only the OS-provided packages will be installed.
|
656
|
+
Installing these packages requires root access.
|
657
|
+
* if you say "none", autoproj will not do anything related to the
|
658
|
+
OS dependencies.
|
659
|
+
|
660
|
+
As any configuration value, the mode can be changed anytime by calling
|
661
|
+
an autoproj operation with the --reconfigure option (e.g. autoproj update
|
662
|
+
--reconfigure).
|
663
|
+
|
664
|
+
Finally, OS dependencies can be installed by calling "autoproj osdeps"
|
665
|
+
with the corresponding option (--all, --ruby, --os or --none).
|
666
|
+
EOT
|
667
|
+
message = [ "Which prepackaged software (a.k.a. 'osdeps') should autoproj install automatically (all, ruby, os, none) ?", long_doc.strip ]
|
668
|
+
|
669
|
+
Autoproj.configuration_option 'osdeps_mode', 'string',
|
670
|
+
:default => 'all',
|
671
|
+
:doc => message,
|
672
|
+
:possible_values => %w{all ruby os none},
|
673
|
+
:lowercase => true
|
674
|
+
end
|
675
|
+
|
676
|
+
def self.define_osdeps_mode_option
|
677
|
+
if supported_operating_system?
|
678
|
+
osdeps_mode_option_supported_os
|
538
679
|
else
|
539
|
-
|
680
|
+
osdeps_mode_option_unsupported_os
|
540
681
|
end
|
541
682
|
end
|
542
683
|
|
543
|
-
|
544
|
-
|
545
|
-
|
546
|
-
|
547
|
-
|
548
|
-
|
549
|
-
|
684
|
+
def self.osdeps_mode_string_to_value(string)
|
685
|
+
string = string.downcase
|
686
|
+
case string
|
687
|
+
when 'all' then HANDLE_ALL
|
688
|
+
when 'ruby' then HANDLE_RUBY
|
689
|
+
when 'os' then HANDLE_OS
|
690
|
+
when 'none' then HANDLE_NONE
|
691
|
+
else raise ArgumentError, "invalid osdeps mode string '#{string}'"
|
550
692
|
end
|
693
|
+
end
|
551
694
|
|
552
|
-
|
553
|
-
|
554
|
-
|
555
|
-
|
556
|
-
|
557
|
-
|
558
|
-
|
559
|
-
|
560
|
-
|
561
|
-
|
562
|
-
|
563
|
-
|
564
|
-
|
565
|
-
|
566
|
-
|
567
|
-
|
568
|
-
|
569
|
-
|
570
|
-
|
571
|
-
|
572
|
-
|
573
|
-
|
574
|
-
puts
|
575
|
-
end
|
695
|
+
# If set to true (the default), #install will try to remove the list of
|
696
|
+
# already uptodate packages from the installed packages. Set to false to
|
697
|
+
# install all packages regardless of their status
|
698
|
+
attr_accessor :filter_uptodate_packages
|
699
|
+
|
700
|
+
# Override the osdeps mode
|
701
|
+
def osdeps_mode=(value)
|
702
|
+
@osdeps_mode = OSDependencies.osdeps_mode_string_to_value(value)
|
703
|
+
end
|
704
|
+
|
705
|
+
# Returns the osdeps mode chosen by the user
|
706
|
+
def osdeps_mode
|
707
|
+
# This has two uses. It caches the value extracted from the
|
708
|
+
# AUTOPROJ_OSDEPS_MODE and/or configuration file. Moreover, it
|
709
|
+
# allows to override the osdeps mode by using
|
710
|
+
# OSDependencies#osdeps_mode=
|
711
|
+
if @osdeps_mode
|
712
|
+
return @osdeps_mode
|
713
|
+
end
|
714
|
+
|
715
|
+
@osdeps_mode = OSDependencies.osdeps_mode
|
716
|
+
end
|
576
717
|
|
577
|
-
|
578
|
-
|
579
|
-
|
580
|
-
|
581
|
-
|
582
|
-
|
583
|
-
|
584
|
-
|
585
|
-
|
586
|
-
|
587
|
-
print "Should I install the RubyGems packages ? [yes] "
|
718
|
+
def self.osdeps_mode
|
719
|
+
puts caller.join("\n ")
|
720
|
+
while true
|
721
|
+
mode =
|
722
|
+
if !Autoproj.has_config_key?('osdeps_mode') &&
|
723
|
+
mode_name = ENV['AUTOPROJ_OSDEPS_MODE']
|
724
|
+
begin OSDependencies.osdeps_mode_string_to_value(mode_name)
|
725
|
+
rescue ArgumentError
|
726
|
+
Autoproj.warn "invalid osdeps mode given through AUTOPROJ_OSDEPS_MODE (#{mode})"
|
727
|
+
nil
|
588
728
|
end
|
589
729
|
else
|
590
|
-
|
591
|
-
|
592
|
-
|
593
|
-
|
594
|
-
|
595
|
-
while do_osdeps.nil?
|
596
|
-
answer = STDIN.readline.chomp
|
597
|
-
if answer == ''
|
598
|
-
do_osdeps = true
|
599
|
-
elsif answer == "no"
|
600
|
-
do_osdeps = false
|
601
|
-
elsif answer == 'yes'
|
602
|
-
do_osdeps = true
|
603
|
-
else
|
604
|
-
print "invalid answer. Please answer with 'yes' or 'no' "
|
605
|
-
STDOUT.flush
|
730
|
+
mode_name = Autoproj.user_config('osdeps_mode')
|
731
|
+
begin OSDependencies.osdeps_mode_string_to_value(mode_name)
|
732
|
+
rescue ArgumentError
|
733
|
+
Autoproj.warn "invalid osdeps mode stored in configuration file"
|
734
|
+
nil
|
606
735
|
end
|
607
736
|
end
|
737
|
+
|
738
|
+
if mode
|
739
|
+
@osdeps_mode = mode
|
740
|
+
return mode
|
741
|
+
end
|
742
|
+
|
743
|
+
# Invalid configuration values. Retry
|
744
|
+
Autoproj.reset_option('osdeps_mode')
|
745
|
+
ENV['AUTOPROJ_OSDEPS_MODE'] = nil
|
746
|
+
end
|
747
|
+
end
|
748
|
+
|
749
|
+
# The set of packages that have already been installed
|
750
|
+
attr_reader :installed_packages
|
751
|
+
|
752
|
+
def osdeps_interaction_unknown_os(osdeps)
|
753
|
+
puts <<-EOMSG
|
754
|
+
#{Autoproj.color("The build process requires some other software packages to be installed on our operating system", :bold)}
|
755
|
+
#{Autoproj.color("If they are already installed, simply ignore this message", :red)}"
|
756
|
+
|
757
|
+
#{osdeps.join("\n ")}
|
758
|
+
|
759
|
+
EOMSG
|
760
|
+
print Autoproj.color("Press ENTER to continue", :bold)
|
761
|
+
STDOUT.flush
|
762
|
+
STDIN.readline
|
763
|
+
puts
|
764
|
+
nil
|
765
|
+
end
|
766
|
+
|
767
|
+
def osdeps_interaction(osdeps, os_packages, shell_script, silent)
|
768
|
+
if !OSDependencies.supported_operating_system?
|
769
|
+
if silent
|
770
|
+
return false
|
608
771
|
else
|
609
|
-
|
610
|
-
puts "do it yourself. Alternatively, you can run 'autoproj osdeps' and/or change to"
|
611
|
-
puts "automatic osdeps handling by running an autoproj operation with the --reconfigure"
|
612
|
-
puts "option (e.g. autoproj build --reconfigure)"
|
613
|
-
puts Autoproj.color("==============================", :bold)
|
614
|
-
puts
|
615
|
-
|
616
|
-
if automatic_osdeps_mode == WAIT
|
617
|
-
print "Press ENTER to continue "
|
618
|
-
STDOUT.flush
|
619
|
-
STDIN.readline
|
620
|
-
end
|
772
|
+
return osdeps_interaction_unknown_os(osdeps)
|
621
773
|
end
|
774
|
+
elsif OSDependencies.force_osdeps
|
775
|
+
return true
|
776
|
+
elsif osdeps_mode == HANDLE_ALL || osdeps_mode == HANDLE_OS
|
777
|
+
return true
|
778
|
+
elsif silent
|
779
|
+
return false
|
780
|
+
end
|
781
|
+
|
782
|
+
# We're asked to not install the OS packages but to display them
|
783
|
+
# anyway, do so now
|
784
|
+
puts <<-EOMSG
|
785
|
+
|
786
|
+
#{Autoproj.color("The build process and/or the packages require some other software to be installed", :bold)}
|
787
|
+
#{Autoproj.color("and you required autoproj to not install them itself", :bold)}
|
788
|
+
#{Autoproj.color("\nIf these packages are already installed, simply ignore this message\n", :red) if !can_filter_uptodate_packages?}
|
789
|
+
The following packages are available as OS dependencies, i.e. as prebuilt
|
790
|
+
packages provided by your distribution / operating system. You will have to
|
791
|
+
install them manually if they are not already installed
|
792
|
+
|
793
|
+
#{os_packages.sort.join("\n ")}
|
794
|
+
|
795
|
+
the following command line(s) can be run as root to install them:
|
796
|
+
|
797
|
+
#{shell_script.split("\n").join("\n| ")}
|
798
|
+
|
799
|
+
EOMSG
|
800
|
+
print " #{Autoproj.color("Press ENTER to continue ", :bold)}"
|
801
|
+
STDOUT.flush
|
802
|
+
STDIN.readline
|
803
|
+
puts
|
804
|
+
false
|
805
|
+
end
|
806
|
+
|
807
|
+
def gems_interaction(gems, cmdline, silent)
|
808
|
+
if OSDependencies.force_osdeps
|
809
|
+
return true
|
810
|
+
elsif osdeps_mode == HANDLE_ALL || osdeps_mode == HANDLE_RUBY
|
811
|
+
return true
|
812
|
+
elsif silent
|
813
|
+
return false
|
814
|
+
end
|
815
|
+
|
816
|
+
# We're not supposed to install rubygem packages but silent is not
|
817
|
+
# set, so display information about them anyway
|
818
|
+
puts <<-EOMSG
|
819
|
+
#{Autoproj.color("The build process and/or the packages require some Ruby Gems to be installed", :bold)}
|
820
|
+
#{Autoproj.color("and you required autoproj to not do it itself", :bold)}
|
821
|
+
You can use the --all or --ruby options to autoproj osdeps to install these
|
822
|
+
packages anyway, and/or change to the osdeps handling mode by running an
|
823
|
+
autoproj operation with the --reconfigure option as for instance
|
824
|
+
autoproj build --reconfigure
|
825
|
+
|
826
|
+
The following command line can be used to install them manually
|
827
|
+
|
828
|
+
#{cmdline.join(" ")}
|
829
|
+
|
830
|
+
Autoproj expects these Gems to be installed in #{Autoproj.gem_home} This can
|
831
|
+
be overriden by setting the AUTOPROJ_GEM_HOME environment variable manually
|
832
|
+
|
833
|
+
EOMSG
|
834
|
+
print " #{Autoproj.color("Press ENTER to continue ", :bold)}"
|
835
|
+
|
836
|
+
STDOUT.flush
|
837
|
+
STDIN.readline
|
838
|
+
puts
|
839
|
+
false
|
840
|
+
end
|
622
841
|
|
623
|
-
|
624
|
-
|
842
|
+
# Requests the installation of the given set of packages
|
843
|
+
def install(packages, package_osdeps = Hash.new)
|
844
|
+
handled_os = OSDependencies.supported_operating_system?
|
845
|
+
# Remove the set of packages that have already been installed
|
846
|
+
packages -= installed_packages
|
847
|
+
return if packages.empty?
|
848
|
+
|
849
|
+
osdeps, gems = partition_packages(packages, package_osdeps)
|
850
|
+
if handled_os
|
851
|
+
os_name, os_version = OSDependencies.operating_system
|
852
|
+
os_packages = resolve_os_dependencies(osdeps)
|
853
|
+
if filter_uptodate_packages
|
854
|
+
os_packages = filter_uptodate_os_packages(os_packages, os_name)
|
625
855
|
end
|
626
856
|
end
|
857
|
+
if filter_uptodate_packages
|
858
|
+
gems = filter_uptodate_gems(gems)
|
859
|
+
end
|
627
860
|
|
628
861
|
did_something = false
|
629
862
|
|
630
|
-
if
|
631
|
-
|
632
|
-
|
633
|
-
|
634
|
-
Autoproj.progress shell_script
|
863
|
+
if !osdeps.empty? && (!os_packages || !os_packages.empty?)
|
864
|
+
if handled_os
|
865
|
+
shell_script = generate_auto_os_script(os_name, os_packages)
|
866
|
+
user_shell_script = generate_user_os_script(os_name, os_packages)
|
635
867
|
end
|
868
|
+
if osdeps_interaction(osdeps, os_packages, user_shell_script, silent?)
|
869
|
+
Autoproj.progress " installing OS packages: #{os_packages.sort.join(", ")}"
|
636
870
|
|
637
|
-
|
638
|
-
|
639
|
-
|
640
|
-
|
641
|
-
begin
|
642
|
-
Autobuild::Subprocess.run 'autoproj', 'osdeps', '/bin/bash', File.expand_path('osdeps.sh')
|
643
|
-
ensure
|
644
|
-
FileUtils.rm_f 'osdeps.sh'
|
645
|
-
end
|
646
|
-
did_something ||= true
|
647
|
-
end
|
871
|
+
if Autoproj.verbose
|
872
|
+
Autoproj.progress "Generating installation script for non-ruby OS dependencies"
|
873
|
+
Autoproj.progress shell_script
|
874
|
+
end
|
648
875
|
|
649
|
-
|
650
|
-
|
876
|
+
Tempfile.open('osdeps_sh') do |io|
|
877
|
+
io.puts "#! /bin/bash"
|
878
|
+
io.puts GAIN_ROOT_ACCESS
|
879
|
+
io.write shell_script
|
880
|
+
io.flush
|
881
|
+
Autobuild::Subprocess.run 'autoproj', 'osdeps', '/bin/bash', io.path
|
882
|
+
end
|
883
|
+
did_something = true
|
884
|
+
end
|
651
885
|
end
|
652
886
|
|
653
|
-
# Now install
|
887
|
+
# Now install the RubyGems
|
654
888
|
if !gems.empty?
|
655
889
|
guess_gem_program
|
656
|
-
if Autoproj.verbose
|
657
|
-
Autoproj.progress "Installing rubygems dependencies with"
|
658
|
-
Autoproj.progress "gem install #{gems.join(" ")}"
|
659
|
-
end
|
660
890
|
|
661
891
|
cmdline = [Autobuild.tool('gem'), 'install']
|
662
892
|
if Autoproj::OSDependencies.gem_with_prerelease
|
@@ -664,9 +894,11 @@ module Autoproj
|
|
664
894
|
end
|
665
895
|
cmdline.concat(gems)
|
666
896
|
|
667
|
-
|
668
|
-
|
669
|
-
|
897
|
+
if gems_interaction(gems, cmdline, silent?)
|
898
|
+
Autobuild.progress "installing/updating RubyGems dependencies: #{gems.sort.join(", ")}"
|
899
|
+
Autobuild::Subprocess.run 'autoproj', 'osdeps', *cmdline
|
900
|
+
did_something = true
|
901
|
+
end
|
670
902
|
end
|
671
903
|
|
672
904
|
did_something
|
@@ -675,53 +907,206 @@ module Autoproj
|
|
675
907
|
end
|
676
908
|
|
677
909
|
|
910
|
+
module Autoproj
|
911
|
+
class InputError < RuntimeError; end
|
912
|
+
|
913
|
+
class BuildOption
|
914
|
+
attr_reader :name
|
915
|
+
attr_reader :type
|
916
|
+
attr_reader :options
|
917
|
+
|
918
|
+
attr_reader :validator
|
919
|
+
|
920
|
+
TRUE_STRINGS = %w{on yes y true}
|
921
|
+
FALSE_STRINGS = %w{off no n false}
|
922
|
+
def initialize(name, type, options, validator)
|
923
|
+
@name, @type, @options = name.to_str, type.to_str, options.to_hash
|
924
|
+
@validator = validator.to_proc if validator
|
925
|
+
if !BuildOption.respond_to?("validate_#{type}")
|
926
|
+
raise ConfigError, "invalid option type #{type}"
|
927
|
+
end
|
928
|
+
end
|
929
|
+
|
930
|
+
def short_doc
|
931
|
+
if short_doc = options[:short_doc]
|
932
|
+
short_doc
|
933
|
+
elsif doc = options[:doc]
|
934
|
+
if doc.respond_to?(:to_ary) then doc.first
|
935
|
+
else doc
|
936
|
+
end
|
937
|
+
else "#{name} (no documentation for this option)"
|
938
|
+
end
|
939
|
+
end
|
940
|
+
|
941
|
+
def doc
|
942
|
+
doc = (options[:doc] || "#{name} (no documentation for this option)")
|
943
|
+
if doc.respond_to?(:to_ary) # multi-line
|
944
|
+
first_line = Autoproj.color(doc[0], :bold)
|
945
|
+
remaining = doc[1..-1]
|
946
|
+
if !remaining.empty?
|
947
|
+
remaining = remaining.join("\n").split("\n").join("\n ")
|
948
|
+
first_line + "\n " + remaining
|
949
|
+
end
|
950
|
+
else
|
951
|
+
doc
|
952
|
+
end
|
953
|
+
end
|
954
|
+
|
955
|
+
def ask(current_value, doc = nil)
|
956
|
+
default_value =
|
957
|
+
if current_value then current_value.to_s
|
958
|
+
elsif options[:default] then options[:default].to_str
|
959
|
+
else ''
|
960
|
+
end
|
961
|
+
|
962
|
+
STDOUT.print " #{doc || self.doc} [#{default_value}] "
|
963
|
+
STDOUT.flush
|
964
|
+
answer = STDIN.readline.chomp
|
965
|
+
if answer == ''
|
966
|
+
answer = default_value
|
967
|
+
end
|
968
|
+
validate(answer)
|
969
|
+
|
970
|
+
rescue InputError => e
|
971
|
+
Autoproj.progress("invalid value: #{e.message}", :red)
|
972
|
+
retry
|
973
|
+
end
|
974
|
+
|
975
|
+
def validate(value)
|
976
|
+
value = BuildOption.send("validate_#{type}", value, options)
|
977
|
+
if validator
|
978
|
+
value = validator[value]
|
979
|
+
end
|
980
|
+
value
|
981
|
+
end
|
982
|
+
|
983
|
+
def self.validate_boolean(value, options)
|
984
|
+
if TRUE_STRINGS.include?(value.downcase)
|
985
|
+
true
|
986
|
+
elsif FALSE_STRINGS.include?(value.downcase)
|
987
|
+
false
|
988
|
+
else
|
989
|
+
raise InputError, "invalid boolean value '#{value}', accepted values are '#{TRUE_STRINGS.join(", ")}' for true, and '#{FALSE_STRINGS.join(", ")} for false"
|
990
|
+
end
|
991
|
+
end
|
992
|
+
|
993
|
+
def self.validate_string(value, options)
|
994
|
+
if possible_values = options[:possible_values]
|
995
|
+
if options[:lowercase]
|
996
|
+
value = value.downcase
|
997
|
+
end
|
998
|
+
if !possible_values.include?(value)
|
999
|
+
raise InputError, "invalid value '#{value}', accepted values are '#{possible_values.join(", ")}'"
|
1000
|
+
end
|
1001
|
+
end
|
1002
|
+
value
|
1003
|
+
end
|
1004
|
+
end
|
1005
|
+
|
1006
|
+
@user_config = Hash.new
|
1007
|
+
|
1008
|
+
def self.option_set
|
1009
|
+
@user_config.inject(Hash.new) do |h, (k, v)|
|
1010
|
+
h[k] = v.first
|
1011
|
+
h
|
1012
|
+
end
|
1013
|
+
end
|
1014
|
+
|
1015
|
+
def self.reset_option(key)
|
1016
|
+
@user_config.delete(key)
|
1017
|
+
end
|
1018
|
+
|
1019
|
+
def self.change_option(key, value, user_validated = false)
|
1020
|
+
@user_config[key] = [value, user_validated]
|
1021
|
+
end
|
1022
|
+
|
1023
|
+
def self.user_config(key)
|
1024
|
+
value, seen = @user_config[key]
|
1025
|
+
# All non-user options are always considered as "seen"
|
1026
|
+
seen ||= !@declared_options.has_key?(key)
|
1027
|
+
|
1028
|
+
if value.nil? || (!seen && Autoproj.reconfigure?)
|
1029
|
+
value = configure(key)
|
1030
|
+
else
|
1031
|
+
if !seen
|
1032
|
+
doc = @declared_options[key].short_doc
|
1033
|
+
if doc[-1, 1] != "?"
|
1034
|
+
doc = "#{doc}:"
|
1035
|
+
end
|
1036
|
+
Autoproj.progress " #{doc} #{value}"
|
1037
|
+
@user_config[key] = [value, true]
|
1038
|
+
end
|
1039
|
+
value
|
1040
|
+
end
|
1041
|
+
end
|
1042
|
+
|
1043
|
+
@declared_options = Hash.new
|
1044
|
+
def self.configuration_option(name, type, options, &validator)
|
1045
|
+
@declared_options[name] = BuildOption.new(name, type, options, validator)
|
1046
|
+
end
|
1047
|
+
|
1048
|
+
def self.declared_option?(name)
|
1049
|
+
@declared_options.has_key?(name)
|
1050
|
+
end
|
1051
|
+
|
1052
|
+
def self.configure(option_name)
|
1053
|
+
if opt = @declared_options[option_name]
|
1054
|
+
if current_value = @user_config[option_name]
|
1055
|
+
current_value = current_value.first
|
1056
|
+
end
|
1057
|
+
value = opt.ask(current_value)
|
1058
|
+
@user_config[option_name] = [value, true]
|
1059
|
+
value
|
1060
|
+
else
|
1061
|
+
raise ConfigError, "undeclared option '#{option_name}'"
|
1062
|
+
end
|
1063
|
+
end
|
1064
|
+
|
1065
|
+
def self.save_config
|
1066
|
+
File.open(File.join(Autoproj.config_dir, "config.yml"), "w") do |io|
|
1067
|
+
config = Hash.new
|
1068
|
+
@user_config.each_key do |key|
|
1069
|
+
config[key] = @user_config[key].first
|
1070
|
+
end
|
1071
|
+
|
1072
|
+
io.write YAML.dump(config)
|
1073
|
+
end
|
1074
|
+
end
|
1075
|
+
|
1076
|
+
def self.has_config_key?(name)
|
1077
|
+
@user_config.has_key?(name)
|
1078
|
+
end
|
1079
|
+
|
1080
|
+
def self.load_config
|
1081
|
+
config_file = File.join(Autoproj.config_dir, "config.yml")
|
1082
|
+
if File.exists?(config_file)
|
1083
|
+
config = YAML.load(File.read(config_file))
|
1084
|
+
config.each do |key, value|
|
1085
|
+
@user_config[key] = [value, false]
|
1086
|
+
end
|
1087
|
+
end
|
1088
|
+
end
|
1089
|
+
|
1090
|
+
class << self
|
1091
|
+
attr_accessor :reconfigure
|
1092
|
+
end
|
1093
|
+
def self.reconfigure?; @reconfigure end
|
1094
|
+
end
|
1095
|
+
|
1096
|
+
|
678
1097
|
|
679
1098
|
DEFS = <<EODEFS
|
680
1099
|
---
|
681
|
-
svn:
|
682
|
-
arch: subversion
|
683
|
-
gentoo: dev-util/subversion
|
684
|
-
debian,ubuntu: subversion
|
685
|
-
autobuild: gem
|
686
|
-
zlib:
|
687
|
-
debian,ubuntu: zlib1g-dev
|
688
|
-
libxml2:
|
689
|
-
arch: libxml2
|
690
|
-
gentoo: dev-libs/libxml2
|
691
|
-
debian,ubuntu: libxml2-dev
|
692
1100
|
none: ignore
|
693
|
-
autotools:
|
694
|
-
arch: automake autoconf
|
695
|
-
gentoo:
|
696
|
-
- sys-devel/automake:1.9
|
697
|
-
- sys-devel/autoconf
|
698
|
-
debian,ubuntu:
|
699
|
-
- automake1.9
|
700
|
-
- autoconf
|
701
|
-
autoproj: gem
|
702
|
-
archive:
|
703
|
-
arch:
|
704
|
-
- tar
|
705
|
-
- unzip
|
706
|
-
gentoo:
|
707
|
-
- app-arch/tar
|
708
|
-
- app-arch/unzip
|
709
|
-
debian,ubuntu:
|
710
|
-
- tar
|
711
|
-
- unzip
|
712
|
-
lsb_release:
|
713
|
-
arch:
|
714
|
-
gentoo: sys-apps/lsb-release
|
715
|
-
debian,ubuntu: lsb-release
|
716
1101
|
ruby18:
|
717
|
-
gentoo:
|
718
|
-
- dev-lang/ruby:1.8
|
719
1102
|
debian,ubuntu:
|
720
1103
|
- ruby1.8-dev
|
721
1104
|
- ruby1.8
|
722
1105
|
- rubygems1.8
|
723
1106
|
- ri1.8
|
724
1107
|
- libopenssl-ruby1.8
|
1108
|
+
gentoo:
|
1109
|
+
- dev-lang/ruby:1.8
|
725
1110
|
ruby19:
|
726
1111
|
debian:
|
727
1112
|
squeeze,sid:
|
@@ -732,104 +1117,72 @@ ruby19:
|
|
732
1117
|
- ruby1.9.1
|
733
1118
|
- ruby1.9.1-dev
|
734
1119
|
- rubygems1.9.1
|
735
|
-
arch:
|
736
|
-
- ruby
|
737
|
-
gentoo:
|
738
|
-
- dev-lang/ruby:1.9
|
739
1120
|
ubuntu:
|
740
1121
|
- ruby1.9.1
|
741
1122
|
- ruby1.9.1-dev
|
742
1123
|
- rubygems1.9.1
|
743
1124
|
- ri1.9.1
|
744
1125
|
- libopenssl-ruby1.9.1
|
1126
|
+
gentoo:
|
1127
|
+
- dev-lang/ruby:1.9
|
1128
|
+
arch:
|
1129
|
+
- ruby
|
1130
|
+
rdoc: gem
|
1131
|
+
build-essential:
|
1132
|
+
debian,ubuntu: build-essential
|
1133
|
+
gentoo:
|
1134
|
+
arch:
|
1135
|
+
libxml2:
|
1136
|
+
debian,ubuntu: libxml2-dev
|
1137
|
+
gentoo: dev-libs/libxml2
|
1138
|
+
arch: libxml2
|
1139
|
+
libxslt:
|
1140
|
+
debian,ubuntu: libxslt1-dev
|
1141
|
+
gentoo: dev-libs/libxslt
|
1142
|
+
arch: libxslt
|
1143
|
+
zlib:
|
1144
|
+
debian,ubuntu: zlib1g-dev
|
1145
|
+
autobuild: gem
|
1146
|
+
autoproj: gem
|
745
1147
|
git:
|
746
|
-
arch: git
|
747
|
-
gentoo: dev-vcs/git
|
748
1148
|
debian,ubuntu: git-core
|
1149
|
+
gentoo: dev-vcs/git
|
1150
|
+
arch: git
|
1151
|
+
svn:
|
1152
|
+
debian,ubuntu: subversion
|
1153
|
+
gentoo: dev-util/subversion
|
1154
|
+
arch: subversion
|
749
1155
|
cmake:
|
750
|
-
arch: cmake
|
751
|
-
gentoo: dev-util/cmake
|
752
1156
|
debian,ubuntu: cmake
|
753
|
-
|
1157
|
+
gentoo: dev-util/cmake
|
1158
|
+
arch: cmake
|
1159
|
+
autotools:
|
1160
|
+
debian,ubuntu:
|
1161
|
+
- automake1.9
|
1162
|
+
- autoconf
|
1163
|
+
gentoo:
|
1164
|
+
- sys-devel/automake:1.9
|
1165
|
+
- sys-devel/autoconf
|
1166
|
+
arch: automake autoconf
|
1167
|
+
lsb_release:
|
1168
|
+
debian,ubuntu: lsb-release
|
1169
|
+
gentoo: sys-apps/lsb-release
|
754
1170
|
arch:
|
1171
|
+
archive:
|
1172
|
+
debian,ubuntu:
|
1173
|
+
- tar
|
1174
|
+
- unzip
|
755
1175
|
gentoo:
|
756
|
-
|
757
|
-
|
758
|
-
arch:
|
759
|
-
|
760
|
-
|
761
|
-
rdoc: gem
|
1176
|
+
- app-arch/tar
|
1177
|
+
- app-arch/unzip
|
1178
|
+
arch:
|
1179
|
+
- tar
|
1180
|
+
- unzip
|
762
1181
|
|
763
1182
|
EODEFS
|
764
1183
|
|
765
|
-
|
766
|
-
|
767
|
-
else
|
768
|
-
if !Autoproj::OSDependencies.supported_operating_system?
|
769
|
-
puts <<-EOT
|
770
|
-
|
771
|
-
autoproj is usually able to handle the installation of operating system packages
|
772
|
-
himself. However, it does not handle your operating system (yet), and will
|
773
|
-
therefore have to let you install the packages yourself.
|
774
|
-
|
775
|
-
It can still install the RubyGems packages that are required by the built
|
776
|
-
packages.
|
777
|
-
|
778
|
-
If you answer 'no' to the following question, autoproj will always go on,
|
779
|
-
assuming that all the required dependencies are already installed. If you answer
|
780
|
-
'yes', it will make sure that the RubyGems are installed himself, but it will
|
781
|
-
assume that you took care of the other packages. If you answer 'wait', it will
|
782
|
-
not install anything but will wait for you to press ENTER each time some
|
783
|
-
external software is needed. Finally, if you answer 'ask', it will ask you each
|
784
|
-
time what it should do when there is something to install
|
785
|
-
|
786
|
-
EOT
|
787
|
-
|
788
|
-
print "How should autoproj install RubyGems packages automatically (yes, no, wait or ask) ? [yes] "
|
789
|
-
STDOUT.flush
|
790
|
-
else
|
791
|
-
# Before doing *anything*, we have to ask the user if he wants us to install
|
792
|
-
# the osdeps ...
|
793
|
-
puts <<-EOT
|
794
|
-
|
795
|
-
autoproj is able to handle the installation of operating system packages
|
796
|
-
himself. This functionality will use 'sudo' to gain root access each time
|
797
|
-
it is needed.
|
798
|
-
|
799
|
-
If you answer 'no' to the following question, autoproj will go on, assuming that
|
800
|
-
all the required dependencies are already installed. If you answer 'yes', it
|
801
|
-
will make sure that they are installed himself. If you answer 'wait', it will
|
802
|
-
not install anything but wait for you to press ENTER each time some external
|
803
|
-
software is needed. Finally, if you answer 'ask', it will ask you what it
|
804
|
-
should do each time there is something to install.
|
805
|
-
|
806
|
-
EOT
|
807
|
-
print "Should autoproj install OS packages automatically (yes, no, wait or ask) ? [yes] "
|
808
|
-
STDOUT.flush
|
809
|
-
end
|
810
|
-
|
811
|
-
automatic_osdeps = nil
|
812
|
-
while automatic_osdeps.nil?
|
813
|
-
answer = STDIN.readline.chomp
|
814
|
-
if answer == ''
|
815
|
-
automatic_osdeps = true
|
816
|
-
elsif answer == "no"
|
817
|
-
automatic_osdeps = false
|
818
|
-
elsif answer == 'wait'
|
819
|
-
automatic_osdeps = :wait
|
820
|
-
elsif answer == 'ask'
|
821
|
-
automatic_osdeps = :ask
|
822
|
-
elsif answer == 'yes'
|
823
|
-
automatic_osdeps = true
|
824
|
-
else
|
825
|
-
print "invalid answer. Please answer with 'yes', 'no', 'wait' or 'ask' "
|
826
|
-
STDOUT.flush
|
827
|
-
end
|
828
|
-
end
|
829
|
-
end
|
830
|
-
|
831
|
-
Autoproj.config['automatic_osdeps'] =
|
832
|
-
automatic_osdeps
|
1184
|
+
Autoproj::OSDependencies.define_osdeps_mode_option
|
1185
|
+
ENV['AUTOPROJ_OSDEPS_MODE'] = Autoproj::OSDependencies.osdeps_mode
|
833
1186
|
|
834
1187
|
# First thing we do is install a proper ruby environment. We make sure that we
|
835
1188
|
# aren't installing any gems for now (as we need to choose the right gem
|
@@ -887,7 +1240,6 @@ if ARGV.first != "localdev"
|
|
887
1240
|
end
|
888
1241
|
Autoproj::OSDependencies.gem_with_prerelease = false
|
889
1242
|
|
890
|
-
ENV['AUTOPROJ_AUTOMATIC_OSDEPS'] = automatic_osdeps.to_s
|
891
1243
|
if !system('autoproj', 'bootstrap', *ARGV)
|
892
1244
|
STDERR.puts "ERROR: failed to run autoproj bootstrap #{ARGV.join(", ")}"
|
893
1245
|
exit 1
|