autoproj 1.5.8 → 1.6.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,3 +1,8 @@
1
+ = Version 1.6.0
2
+ * version that will be used in the Orocos project
3
+ * the osdeps management is now fully configurable. What is means is that you
4
+ can ask autoproj to *not* install osdeps packages at all
5
+
1
6
  = Version 1.5.8
2
7
  * add a way to add some ignore regexp to the dependency tracking. Updated user
3
8
  guide about that.
data/Rakefile CHANGED
@@ -24,45 +24,11 @@ begin
24
24
  ['webgen', '>= 0.5.9'] <<
25
25
  ['rdoc', '>= 2.4.0']
26
26
  end
27
-
28
- Rake.clear_tasks(/dist:publish_docs/)
29
- task 'publish_docs' => 'doc' do
30
- if !system('doc/update_github')
31
- raise "cannot update the gh-pages branch for GitHub"
32
- end
33
- if !system('git', 'push', 'origin', '+gh-pages')
34
- raise "cannot push the documentation"
35
- end
36
- end
37
-
38
- desc "generate the bootstrap script"
39
- task 'bootstrap' do
40
- osdeps_code = File.read(File.join(Dir.pwd, 'lib', 'autoproj', 'osdeps.rb'))
41
- osdeps_defaults = File.read(File.join(Dir.pwd, 'lib', 'autoproj', 'default.osdeps'))
42
- # Filter rubygems dependencies from the OSdeps default. They will be
43
- # installed at first build
44
- osdeps = YAML.load(osdeps_defaults)
45
- osdeps.delete_if do |name, content|
46
- if content.respond_to?(:delete)
47
- content.delete('gem')
48
- content.empty?
49
- else
50
- content == 'gem'
51
- end
52
- end
53
- osdeps_defaults = YAML.dump(osdeps)
54
-
55
- bootstrap_code = File.read(File.join(Dir.pwd, 'bin', 'autoproj_bootstrap.in')).
56
- gsub('OSDEPS_CODE', osdeps_code).
57
- gsub('OSDEPS_DEFAULTS', osdeps_defaults)
58
- File.open(File.join(Dir.pwd, 'doc', 'guide', 'src', 'autoproj_bootstrap'), 'w') do |io|
59
- io.write bootstrap_code
60
- end
61
- end
62
27
  end
63
28
 
64
29
  # Define our own documentation handling. Rake.clear_tasks is defined by Hoe
65
30
  Rake.clear_tasks(/dist:(re|clobber_|)docs/)
31
+ Rake.clear_tasks(/dist:publish_docs/)
66
32
 
67
33
  rescue LoadError
68
34
  STDERR.puts "cannot load the Hoe gem. Distribution is disabled"
@@ -71,6 +37,43 @@ rescue Exception => e
71
37
  STDERR.puts "error message is: #{e.message}"
72
38
  end
73
39
 
40
+ namespace 'dist' do
41
+ task 'publish_docs' => 'doc' do
42
+ if !system('doc/update_github')
43
+ raise "cannot update the gh-pages branch for GitHub"
44
+ end
45
+ if !system('git', 'push', 'origin', '+gh-pages')
46
+ raise "cannot push the documentation"
47
+ end
48
+ end
49
+
50
+ desc "generate the bootstrap script"
51
+ task 'bootstrap' do
52
+ require 'yaml'
53
+ osdeps_code = File.read(File.join(Dir.pwd, 'lib', 'autoproj', 'osdeps.rb'))
54
+ osdeps_defaults = File.read(File.join(Dir.pwd, 'lib', 'autoproj', 'default.osdeps'))
55
+ # Filter rubygems dependencies from the OSdeps default. They will be
56
+ # installed at first build
57
+ osdeps = YAML.load(osdeps_defaults)
58
+ osdeps.delete_if do |name, content|
59
+ if content.respond_to?(:delete)
60
+ content.delete('gem')
61
+ content.empty?
62
+ else
63
+ content == 'gem'
64
+ end
65
+ end
66
+ osdeps_defaults = YAML.dump(osdeps)
67
+
68
+ bootstrap_code = File.read(File.join(Dir.pwd, 'bin', 'autoproj_bootstrap.in')).
69
+ gsub('OSDEPS_CODE', osdeps_code).
70
+ gsub('OSDEPS_DEFAULTS', osdeps_defaults)
71
+ File.open(File.join(Dir.pwd, 'doc', 'guide', 'src', 'autoproj_bootstrap'), 'w') do |io|
72
+ io.write bootstrap_code
73
+ end
74
+ end
75
+ end
76
+
74
77
  do_doc = begin
75
78
  require 'webgen/webgentask'
76
79
  require 'rdoc/task'
@@ -28,7 +28,7 @@ def report(debug)
28
28
  rescue ConfigError => e
29
29
  STDERR.puts
30
30
  STDERR.puts color(e.message, :red, :bold)
31
- root_dir = /^#{Regexp.quote(Autoproj.root_dir)}/
31
+ root_dir = /^#{Regexp.quote(Autoproj.root_dir)}(?!\/\.gems)/
32
32
  e.backtrace.find_all { |path| path =~ root_dir }.
33
33
  each do |path|
34
34
  STDERR.puts color(" in #{path}", :red, :bold)
@@ -27,14 +27,25 @@ module Autoproj
27
27
  class ConfigError < RuntimeError; end
28
28
  class << self
29
29
  attr_reader :verbose
30
+ attr_reader :config
30
31
  end
32
+ @config = Hash.new
31
33
 
32
34
  # Fake option management for the OSdeps class
33
- def self.has_config_key?(*args)
34
- false
35
+ def self.has_config_key?(key)
36
+ config.has_key?(key)
35
37
  end
36
- def self.change_option(*args)
37
- false
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
+ end
46
+
47
+ def self.color(string, *args)
48
+ string
38
49
  end
39
50
  end
40
51
 
@@ -90,6 +101,8 @@ module Autoproj
90
101
 
91
102
  class << self
92
103
  attr_reader :aliases
104
+ attr_accessor :force_osdeps
105
+ attr_accessor :gem_with_prerelease
93
106
  end
94
107
  @aliases = Hash.new
95
108
 
@@ -217,11 +230,13 @@ module Autoproj
217
230
  ['gentoo', [version]]
218
231
  elsif File.exists?('/etc/arch-release')
219
232
  ['arch', []]
220
- else
221
- raise ConfigError, "Unknown operating system"
222
233
  end
223
234
  end
224
235
 
236
+ if !@operating_system
237
+ return
238
+ end
239
+
225
240
  # Normalize the names to lowercase
226
241
  @operating_system =
227
242
  [@operating_system[0].downcase,
@@ -257,62 +272,118 @@ module Autoproj
257
272
  'arch' => 'pacman -Sy --noconfirm %s'
258
273
  }
259
274
 
260
- # Resolves the given OS dependencies into the actual packages that need
261
- # to be installed on this particular OS.
275
+ NO_PACKAGE = 0
276
+ WRONG_OS = 1
277
+ WRONG_OS_VERSION = 2
278
+ IGNORE = 3
279
+ PACKAGES = 4
280
+ SHELL_SNIPPET = 5
281
+ UNKNOWN_OS = 7
282
+ AVAILABLE = 10
283
+
284
+ # Check for the definition of +name+ for this operating system
262
285
  #
263
- # Raises ConfigError if some packages can't be found
264
- def resolve_os_dependencies(dependencies)
286
+ # It can return
287
+ #
288
+ # NO_PACKAGE::
289
+ # there are no package definition for +name
290
+ # UNKNOWN_OS::
291
+ # this is not an OS autoproj knows how to deal with
292
+ # WRONG_OS::
293
+ # there are a package definition, but not for this OS
294
+ # WRONG_OS_VERSION::
295
+ # there is a package definition for this OS, but not for this
296
+ # particular version of the OS
297
+ # IGNORE::
298
+ # there is a package definition that told us to ignore the package
299
+ # [PACKAGES, definition]::
300
+ # +definition+ is an array of package names that this OS's package
301
+ # manager can understand
302
+ # [SHELL_SNIPPET, definition]::
303
+ # +definition+ is a string which is a shell snippet that will install
304
+ # the package
305
+ def resolve_package(name)
265
306
  os_name, os_version = OSDependencies.operating_system
266
- if !OS_PACKAGE_INSTALL.has_key?(os_name)
267
- raise ConfigError, "I don't know how to install packages on #{os_name}"
307
+
308
+ dep_def = definitions[name]
309
+ if !dep_def
310
+ return NO_PACKAGE
268
311
  end
269
312
 
270
- os_packages = []
271
- shell_snippets = []
272
- dependencies.each do |name|
273
- dep_def = definitions[name]
274
- if !dep_def
275
- raise ConfigError, "I don't know how to install '#{name}'"
276
- end
313
+ if !os_name
314
+ return UNKNOWN_OS
315
+ end
316
+
317
+ # Find a matching entry for the OS name
318
+ os_entry = dep_def.find do |name_list, data|
319
+ name_list.split(',').
320
+ map(&:downcase).
321
+ any? { |n| n == os_name }
322
+ end
323
+
324
+ if !os_entry
325
+ return WRONG_OS
326
+ end
327
+
328
+ data = os_entry.last
329
+
330
+ # This package does not need to be installed on this operating system (example: build tools on Gentoo)
331
+ if !data || data == "ignore"
332
+ return IGNORE
333
+ end
277
334
 
278
- # Find a matching entry for the OS name
279
- os_entry = dep_def.find do |name_list, data|
280
- name_list.split(',').
335
+ if data.kind_of?(Hash)
336
+ version_entry = data.find do |version_list, data|
337
+ version_list.to_s.split(',').
281
338
  map(&:downcase).
282
- any? { |n| n == os_name }
339
+ any? do |v|
340
+ os_version.any? { |osv| Regexp.new(v) =~ osv }
341
+ end
283
342
  end
284
343
 
285
- if !os_entry
286
- raise ConfigError, "I don't know how to install '#{name}' on #{os_name}"
344
+ if !version_entry
345
+ return WRONG_OS_VERSION
287
346
  end
347
+ data = version_entry.last
348
+ end
288
349
 
289
- data = os_entry.last
290
-
291
- # This package does not need to be installed on this operating system (example: build tools on Gentoo)
292
- next if !data || data == "ignore"
350
+ if data.respond_to?(:to_ary)
351
+ return [PACKAGES, data]
352
+ elsif data.to_str =~ /\w+/
353
+ return [PACKAGES, [data.to_str]]
354
+ else
355
+ return [SHELL_SNIPPET, data.to_str]
356
+ end
357
+ end
293
358
 
294
- if data.kind_of?(Hash)
295
- version_entry = data.find do |version_list, data|
296
- version_list.to_s.split(',').
297
- map(&:downcase).
298
- any? do |v|
299
- os_version.any? { |osv| Regexp.new(v) =~ osv }
300
- end
301
- end
359
+ # Resolves the given OS dependencies into the actual packages that need
360
+ # to be installed on this particular OS.
361
+ #
362
+ # Raises ConfigError if some packages can't be found
363
+ def resolve_os_dependencies(dependencies)
364
+ os_name, os_version = OSDependencies.operating_system
302
365
 
303
- if !version_entry
304
- raise ConfigError, "I don't know how to install '#{name}' on this specific version of #{os_name} (#{os_version.join(", ")})"
305
- end
306
- data = version_entry.last
366
+ os_packages = []
367
+ shell_snippets = []
368
+ dependencies.each do |name|
369
+ result = resolve_package(name)
370
+ if result == NO_PACKAGE
371
+ raise ConfigError, "there is no osdeps definition for #{name}"
372
+ elsif result == WRONG_OS
373
+ raise ConfigError, "there is an osdeps definition for #{name}, but not for this operating system"
374
+ elsif result == WRONG_OS_VERSION
375
+ raise ConfigError, "there is an osdeps definition for #{name}, but no for this particular operating system version"
376
+ elsif result == IGNORE
377
+ next
378
+ elsif result[0] == PACKAGES
379
+ os_packages.concat(result[1])
380
+ elsif result[0] == SHELL_SNIPPET
381
+ shell_snippets << result[1]
307
382
  end
383
+ end
308
384
 
309
- if data.respond_to?(:to_ary)
310
- os_packages.concat data.to_ary
311
- elsif data.to_str =~ /\w+/
312
- os_packages << data.to_str
313
- else
314
- shell_snippets << data.to_str
315
- end
385
+ if !OS_PACKAGE_INSTALL.has_key?(os_name)
386
+ raise ConfigError, "I don't know how to install packages on #{os_name}"
316
387
  end
317
388
 
318
389
  return os_packages, shell_snippets
@@ -329,14 +400,27 @@ module Autoproj
329
400
  "\n" + shell_snippets.join("\n")
330
401
  end
331
402
 
332
- # Returns true if there is an operating-system package with that name,
333
- # and false otherwise
403
+ # Returns true if +name+ is an acceptable OS package for this OS and
404
+ # version
334
405
  def has?(name)
406
+ availability_of(name) == AVAILABLE
407
+ end
408
+
409
+ # If +name+ is an osdeps that is available for this operating system,
410
+ # returns AVAILABLE. Otherwise, returns the same error code than
411
+ # resolve_package.
412
+ def availability_of(name)
335
413
  osdeps, gemdeps = partition_packages([name].to_set)
336
- resolve_os_dependencies(osdeps)
337
- true
338
- rescue ConfigError
339
- false
414
+ if !osdeps.empty?
415
+ status = resolve_package(name)
416
+ if status.respond_to?(:to_ary) || status == IGNORE
417
+ AVAILABLE
418
+ else
419
+ status
420
+ end
421
+ else
422
+ AVAILABLE
423
+ end
340
424
  end
341
425
 
342
426
  # call-seq:
@@ -357,12 +441,10 @@ module Autoproj
357
441
  package_set.to_set.each do |name|
358
442
  pkg_def = definitions[name]
359
443
  if !pkg_def
360
- msg = "I know nothing about a prepackaged software called '#{name}'"
361
- if pkg_names = package_osdeps[name]
362
- msg += ", it is listed as dependency of the following package(s): #{pkg_names.join(", ")}"
363
- end
364
-
365
- raise ConfigError, msg
444
+ # Error cases are taken care of later, because that is were
445
+ # the automatic/manual osdeps logic lies
446
+ osdeps << name
447
+ next
366
448
  end
367
449
 
368
450
  pkg_def = pkg_def.dup
@@ -373,6 +455,9 @@ module Autoproj
373
455
  when "gem" then
374
456
  gems << name
375
457
  else
458
+ # This is *not* handled later, as is the absence of a
459
+ # package definition. The reason is that it is a bad
460
+ # configuration file, and should be fixed by the user
376
461
  raise ConfigError, "unknown OS-independent package management type #{pkg_def} for #{name}"
377
462
  end
378
463
  else
@@ -403,19 +488,123 @@ module Autoproj
403
488
  end
404
489
  end
405
490
 
491
+ def filter_uptodate_gems(gems)
492
+ Autobuild.progress "looking for RubyGems updates"
493
+
494
+ # Don't install gems that are already there ...
495
+ gems = gems.dup
496
+ gems.delete_if do |name|
497
+ version_requirements = Gem::Requirement.default
498
+ installed = Gem.source_index.find_name(name, version_requirements)
499
+ if !installed.empty? && Autobuild.do_update
500
+ # Look if we can update the package ...
501
+ dep = Gem::Dependency.new(name, version_requirements)
502
+ available = gem_fetcher.find_matching(dep)
503
+ installed_version = installed.map(&:version).max
504
+ available_version = available.map { |(name, v), source| v }.max
505
+ needs_update = (available_version > installed_version)
506
+ !needs_update
507
+ else
508
+ !installed.empty?
509
+ end
510
+ end
511
+ gems
512
+ end
513
+
514
+ AUTOMATIC = true
515
+ MANUAL = false
516
+ WAIT = :wait
517
+ ASK = :ask
518
+
519
+ def automatic_osdeps_mode
520
+ if mode = ENV['AUTOPROJ_AUTOMATIC_OSDEPS']
521
+ mode =
522
+ if mode == 'true' then AUTOMATIC
523
+ elsif mode == 'false' then MANUAL
524
+ elsif mode == 'wait' then WAIT
525
+ else ASK
526
+ end
527
+ Autoproj.change_option('automatic_osdeps', mode, true)
528
+ mode
529
+ else
530
+ Autoproj.user_config('automatic_osdeps')
531
+ end
532
+ end
533
+
406
534
  # Requests the installation of the given set of packages
407
535
  def install(packages, package_osdeps = Hash.new)
536
+ os_def = OSDependencies.operating_system
408
537
  osdeps, gems = partition_packages(packages, package_osdeps)
538
+ gems = filter_uptodate_gems(gems)
539
+ if osdeps.empty? && gems.empty?
540
+ return
541
+ end
542
+
543
+ if automatic_osdeps_mode == AUTOMATIC && !os_def && !osdeps.empty?
544
+ puts
545
+ puts Autoproj.color("==============================", :bold)
546
+ puts Autoproj.color("The packages that will be built require some other software to be installed", :bold)
547
+ puts " " + osdeps.join("\n ")
548
+ puts Autoproj.color("==============================", :bold)
549
+ puts
550
+ end
551
+
552
+ if !OSDependencies.force_osdeps && automatic_osdeps_mode != AUTOMATIC
553
+ puts
554
+ puts Autoproj.color("==============================", :bold)
555
+ puts Autoproj.color("The packages that will be built require some other software to be installed", :bold)
556
+ puts
557
+ if !osdeps.empty?
558
+ puts "From the operating system:"
559
+ puts " " + osdeps.join("\n ")
560
+ puts
561
+ end
562
+ if !gems.empty?
563
+ puts "From RubyGems:"
564
+ puts " " + gems.join("\n ")
565
+ puts
566
+ end
567
+
568
+ if automatic_osdeps_mode == ASK
569
+ print "Should I install these packages ? [yes] "
570
+ STDOUT.flush
571
+ do_osdeps = nil
572
+ while do_osdeps.nil?
573
+ answer = STDIN.readline.chomp
574
+ if answer == ''
575
+ do_osdeps = true
576
+ elsif answer == "no"
577
+ do_osdeps = false
578
+ elsif answer == 'yes'
579
+ do_osdeps = true
580
+ else
581
+ print "invalid answer. Please answer with 'yes' or 'no' "
582
+ STDOUT.flush
583
+ end
584
+ end
585
+ else
586
+ puts "Since you requested autoproj to not handle the osdeps automatically, you have to"
587
+ puts "do it yourself. Alternatively, you can run 'autoproj osdeps' and/or change to"
588
+ puts "automatic osdeps handling by running an autoproj operation with the --reconfigure"
589
+ puts "option (e.g. autoproj build --reconfigure)"
590
+ puts Autoproj.color("==============================", :bold)
591
+ puts
592
+
593
+ if automatic_osdeps_mode == WAIT
594
+ print "Press ENTER to continue "
595
+ STDOUT.flush
596
+ STDIN.readline
597
+ end
598
+ end
599
+
600
+ if !do_osdeps
601
+ return
602
+ end
603
+ end
409
604
 
410
605
  did_something = false
411
606
 
412
- # Ideally, we would feed the OS dependencies to rosdep.
413
- # Unfortunately, this is C++ code and I don't want to install the
414
- # whole ROS stack just for rosdep ...
415
- #
416
- # So, for now, reimplement rosdep by ourselves. Given how things
417
- # are done, this is actually not so hard.
418
- if !osdeps.empty?
607
+ if os_def && !osdeps.empty?
419
608
  shell_script = generate_os_script(osdeps)
420
609
  if Autoproj.verbose
421
610
  Autoproj.progress "Installing non-ruby OS dependencies with"
@@ -435,35 +624,25 @@ module Autoproj
435
624
  end
436
625
 
437
626
  if !gems.empty?
438
- Autobuild.progress "looking for RubyGems updates"
439
- # Don't install gems that are already there ...
440
- gems.delete_if do |name|
441
- version_requirements = Gem::Requirement.default
442
- installed = Gem.source_index.find_name(name, version_requirements)
443
- if !installed.empty? && Autobuild.do_update
444
- # Look if we can update the package ...
445
- dep = Gem::Dependency.new(name, version_requirements)
446
- available = gem_fetcher.find_matching(dep)
447
- installed_version = installed.map(&:version).max
448
- available_version = available.map { |(name, v), source| v }.max
449
- needs_update = (available_version > installed_version)
450
- !needs_update
451
- else
452
- !installed.empty?
453
- end
454
- end
627
+ gems = filter_uptodate_gems(gems)
455
628
  end
456
629
 
457
630
  # Now install what is left
458
631
  if !gems.empty?
459
632
  guess_gem_program
460
-
461
633
  if Autoproj.verbose
462
634
  Autoproj.progress "Installing rubygems dependencies with"
463
635
  Autoproj.progress "gem install #{gems.join(" ")}"
464
636
  end
637
+
638
+ cmdline = [Autobuild.tool('gem'), 'install']
639
+ if Autobuild::OSDependencies.gem_with_prerelease
640
+ cmdline << "--prerelease"
641
+ end
642
+ cmdline.concat(gems)
643
+
465
644
  Autobuild.progress "installing/updating RubyGems dependencies: #{gems.join(", ")}"
466
- Autobuild::Subprocess.run 'autoproj', 'osdeps', Autobuild.tool('gem'), 'install', *gems
645
+ Autobuild::Subprocess.run 'autoproj', 'osdeps', *cmdline
467
646
  did_something ||= true
468
647
  end
469
648
 
@@ -560,6 +739,69 @@ rdoc: gem
560
739
 
561
740
  EODEFS
562
741
 
742
+ operating_system = Autoproj::OSDependencies.operating_system
743
+ if !operating_system
744
+ puts <<-EOT
745
+
746
+ autoproj is usually able to handle the installation of operating system packages
747
+ himself. However, it does not know about your operating system, and will
748
+ therefore have to let you install the packages yourself.
749
+
750
+ It can still install the RubyGems packages that are required by the built
751
+ packages.
752
+
753
+ If you answer 'no' to the following question, autoproj will always go on,
754
+ assuming that all the required dependencies are already installed. If you answer
755
+ 'yes', it will make sure that the RubyGems are installed himself, but it will
756
+ assume that you took care of the other packages. If you answer 'wait', it will
757
+ not install anything but will wait for you to press ENTER each time some
758
+ external software is needed. Finally, if you answer 'ask', it will ask you each
759
+ time what it should do when there is something to install
760
+
761
+ EOT
762
+
763
+ print "How should autoproj install RubyGems packages automatically (yes, no, wait or ask) ? [yes] "
764
+ STDOUT.flush
765
+ else
766
+ # Before doing *anything*, we have to ask the user if he wants us to install
767
+ # the osdeps ...
768
+ puts <<-EOT
769
+
770
+ autoproj is able to handle the installation of operating system packages
771
+ himself. This functionality will use 'sudo' to gain root access each time
772
+ it is needed.
773
+
774
+ If you answer 'no' to the following question, autoproj will go on, assuming that
775
+ all the required dependencies are already installed. If you answer 'yes', it
776
+ will make sure that they are installed himself. If you answer 'wait', it will
777
+ not install anything but wait for you to press ENTER each time some external
778
+ software is needed. Finally, if you answer 'ask', it will ask you what it
779
+ should do each time there is something to install.
780
+
781
+ EOT
782
+ print "Should autoproj install OS packages automatically (yes, no, wait or ask) ? [yes] "
783
+ STDOUT.flush
784
+ end
785
+
786
+ automatic_osdeps = nil
787
+ while automatic_osdeps.nil?
788
+ answer = STDIN.readline.chomp
789
+ if answer == ''
790
+ automatic_osdeps = true
791
+ elsif answer == "no"
792
+ automatic_osdeps = false
793
+ elsif answer == 'ask'
794
+ automatic_osdeps = :ask
795
+ elsif answer == 'yes'
796
+ automatic_osdeps = true
797
+ else
798
+ print "invalid answer. Please answer with 'yes', 'no' or 'ask' "
799
+ STDOUT.flush
800
+ end
801
+ end
802
+ Autoproj.config['automatic_osdeps'] =
803
+ automatic_osdeps
804
+
563
805
  # First thing we do is install a proper ruby environment. We make sure that we
564
806
  # aren't installing any gems for now (as we need to choose the right gem
565
807
  # binary) by setting Autobuild.programs['gem'] to nil
@@ -582,10 +824,7 @@ USER_PACKAGES = %w{autoproj}
582
824
  ENV['RUBYOPT'] = "-rubygems"
583
825
  require 'rubygems'
584
826
 
585
- packages = PACKAGES.dup
586
- if ARGV.first != "dev"
587
- packages += USER_PACKAGES
588
- end
827
+ packages = PACKAGES + USER_PACKAGES
589
828
 
590
829
  begin
591
830
  osdeps_management = Autoproj::OSDependencies.new(YAML.load(DEFS))
@@ -596,8 +835,14 @@ rescue Autoproj::ConfigError => e
596
835
  exit(1)
597
836
  end
598
837
 
599
- if ARGV.first != "dev"
600
- Autobuild::Subprocess.run('bootstrap', 'post', 'autoproj', 'bootstrap', *ARGV)
838
+ if ARGV.first == "dev"
839
+ Autoproj::OSDependencies.gem_with_prerelease = true
840
+ end
841
+
842
+ ENV['AUTOPROJ_AUTOMATIC_OSDEPS'] = automatic_osdeps.to_s
843
+ if !system('autoproj', 'bootstrap', *ARGV)
844
+ STDERR.puts "ERROR: failed to run autoproj bootstrap #{ARGV.join(", ")}"
845
+ exit 1
601
846
  end
602
847
 
603
848
  File.open('env.sh', 'w') do |io|