autoproj 1.5.8 → 1.6.0.rc1

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.
@@ -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|