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/lib/autoproj/cmdline.rb
CHANGED
@@ -30,54 +30,6 @@ module Autoproj
|
|
30
30
|
end
|
31
31
|
|
32
32
|
module CmdLine
|
33
|
-
def self.handle_automatic_osdeps
|
34
|
-
if !Autoproj.has_config_key?('automatic_osdeps') && ENV['AUTOPROJ_AUTOMATIC_OSDEPS']
|
35
|
-
mode = ENV['AUTOPROJ_AUTOMATIC_OSDEPS']
|
36
|
-
mode =
|
37
|
-
if mode == 'true' then Autoproj::OSDependencies::AUTOMATIC
|
38
|
-
elsif mode == 'false' then Autoproj::OSDependencies::MANUAL
|
39
|
-
elsif mode == 'wait' then Autoproj::OSDependencies::WAIT
|
40
|
-
else Autoproj::OSDependencies::ASK
|
41
|
-
end
|
42
|
-
|
43
|
-
Autoproj.change_option('automatic_osdeps', mode, true)
|
44
|
-
end
|
45
|
-
|
46
|
-
short_doc = "Should autoproj handle the OS package installation automatically (yes, no, wait or ask) ?"
|
47
|
-
long_doc =<<-EOT
|
48
|
-
* if you say "yes", the OS dependencies will be handled by autoproj.
|
49
|
-
* if you say "no", the list of OS dependencies that need to be installed will be
|
50
|
-
listed, and autoproj will go on, assuming that you have installed them yourself.
|
51
|
-
* if you say "ask", you will be prompted each time a package needs to be installed.
|
52
|
-
* if you say "wait", autoproj will simply wait for you to press ENTER to continue
|
53
|
-
after it prompted you for the dependencies.
|
54
|
-
|
55
|
-
This value can be changed anytime by calling an autoproj operation
|
56
|
-
with the --reconfigure option (e.g. autoproj update --reconfigure).
|
57
|
-
Moreover, the "autoproj osdeps" call will always allow you to install
|
58
|
-
OS dependencies through autoproj.
|
59
|
-
EOT
|
60
|
-
long_doc = long_doc.strip
|
61
|
-
|
62
|
-
Autoproj.configuration_option 'automatic_osdeps', 'string',
|
63
|
-
:default => 'yes',
|
64
|
-
:doc => [short_doc, long_doc] do |value|
|
65
|
-
begin
|
66
|
-
Autoproj::BuildOption.validate_boolean(value, Hash.new)
|
67
|
-
rescue Autoproj::InputError
|
68
|
-
if value.to_s == "ask"
|
69
|
-
:ask
|
70
|
-
elsif value.to_s == "wait"
|
71
|
-
:wait
|
72
|
-
else
|
73
|
-
raise Autoproj::InputError, "invalid value. Please answer 'yes', 'no', 'wait' or 'ask' -- without the quotes"
|
74
|
-
end
|
75
|
-
end
|
76
|
-
end
|
77
|
-
|
78
|
-
Autoproj.user_config('automatic_osdeps')
|
79
|
-
end
|
80
|
-
|
81
33
|
def self.initialize
|
82
34
|
Autobuild::Reporting << Autoproj::Reporter.new
|
83
35
|
if mail_config[:to]
|
@@ -106,8 +58,6 @@ OS dependencies through autoproj.
|
|
106
58
|
Autobuild.srcdir = Autoproj.root_dir
|
107
59
|
Autobuild.logdir = File.join(Autobuild.prefix, 'log')
|
108
60
|
|
109
|
-
handle_automatic_osdeps
|
110
|
-
|
111
61
|
ruby = RbConfig::CONFIG['RUBY_INSTALL_NAME']
|
112
62
|
if ruby != 'ruby'
|
113
63
|
bindir = File.join(Autoproj.build_dir, 'bin')
|
@@ -141,24 +91,44 @@ OS dependencies through autoproj.
|
|
141
91
|
if Autobuild.do_update.nil?
|
142
92
|
Autobuild.do_update = manifest.auto_update?
|
143
93
|
end
|
144
|
-
if Autoproj::CmdLine.update_os_dependencies.nil?
|
145
|
-
Autoproj::CmdLine.update_os_dependencies = manifest.auto_update?
|
146
|
-
end
|
147
94
|
|
148
95
|
# Initialize the Autoproj.osdeps object by loading the default. The
|
149
96
|
# rest is loaded later
|
150
97
|
Autoproj.osdeps = Autoproj::OSDependencies.load_default
|
98
|
+
Autoproj.osdeps.silent = !osdeps?
|
99
|
+
Autoproj.osdeps.filter_uptodate_packages = osdeps_filter_uptodate?
|
100
|
+
if Autoproj::CmdLine.osdeps_forced_mode
|
101
|
+
Autoproj.osdeps.osdeps_mode = Autoproj::CmdLine.osdeps_forced_mode
|
102
|
+
end
|
103
|
+
if @update_os_dependencies || Autoproj::CmdLine.osdeps?
|
104
|
+
Autoproj.reset_option('operating_system')
|
105
|
+
end
|
106
|
+
# Do that AFTER we have properly setup Autoproj.osdeps as to avoid
|
107
|
+
# unnecessarily redetecting the operating system
|
108
|
+
Autoproj::OSDependencies.define_osdeps_mode_option
|
109
|
+
Autoproj.osdeps.osdeps_mode
|
151
110
|
end
|
152
111
|
|
153
112
|
def self.update_myself
|
154
113
|
return if !Autoproj::CmdLine.update_os_dependencies?
|
155
114
|
|
115
|
+
# This is a guard to avoid infinite recursion in case the user is
|
116
|
+
# running autoproj osdeps --force
|
117
|
+
if ENV['AUTOPROJ_RESTARTING'] == '1'
|
118
|
+
return
|
119
|
+
end
|
120
|
+
|
156
121
|
# First things first, see if we need to update ourselves
|
157
122
|
if Autoproj.osdeps.install(%w{autobuild autoproj})
|
123
|
+
puts
|
124
|
+
Autoproj.progress 'autoproj and/or autobuild has been updated, restarting autoproj'
|
125
|
+
puts
|
126
|
+
|
158
127
|
# We updated autobuild or autoproj themselves ... Restart !
|
159
128
|
#
|
160
129
|
# ...But first save the configuration (!)
|
161
130
|
Autoproj.save_config
|
131
|
+
ENV['AUTOPROJ_RESTARTING'] = '1'
|
162
132
|
require 'rbconfig'
|
163
133
|
ruby = RbConfig::CONFIG['RUBY_INSTALL_NAME']
|
164
134
|
exec(ruby, $0, *ARGV)
|
@@ -217,13 +187,18 @@ OS dependencies through autoproj.
|
|
217
187
|
|
218
188
|
# Update the remote sources if there are any
|
219
189
|
if manifest.has_remote_sources?
|
220
|
-
|
190
|
+
if manifest.should_update_remote_sources
|
191
|
+
Autoproj.progress("autoproj: updating remote definitions of package sets", :bold)
|
192
|
+
end
|
193
|
+
|
221
194
|
# If we need to install some packages to import our remote sources, do it
|
222
195
|
if update_os_dependencies?
|
223
196
|
Autoproj.osdeps.install(source_os_dependencies)
|
224
197
|
end
|
225
198
|
|
226
|
-
manifest.
|
199
|
+
if manifest.should_update_remote_sources
|
200
|
+
manifest.update_remote_sources
|
201
|
+
end
|
227
202
|
Autoproj.progress
|
228
203
|
end
|
229
204
|
end
|
@@ -389,7 +364,9 @@ OS dependencies through autoproj.
|
|
389
364
|
delete_if { |pkg_name, pkg| Autoproj.manifest.excluded?(pkg_name) || Autoproj.manifest.ignored?(pkg_name) }
|
390
365
|
|
391
366
|
packages.each do |_, pkg|
|
392
|
-
pkg.
|
367
|
+
pkg.isolate_errors do
|
368
|
+
pkg.import
|
369
|
+
end
|
393
370
|
end
|
394
371
|
|
395
372
|
ensure
|
@@ -498,10 +475,19 @@ OS dependencies through autoproj.
|
|
498
475
|
def self.manifest; Autoproj.manifest end
|
499
476
|
def self.bootstrap?; !!@bootstrap end
|
500
477
|
def self.only_status?; !!@only_status end
|
478
|
+
def self.only_local?; !!@only_local end
|
501
479
|
def self.check?; !!@check end
|
502
480
|
def self.manifest_update?; !!@manifest_update end
|
503
481
|
def self.only_config?; !!@only_config end
|
504
|
-
def self.update_os_dependencies
|
482
|
+
def self.update_os_dependencies?
|
483
|
+
# Check if the mode disables osdeps anyway ...
|
484
|
+
if !@update_os_dependencies.nil? && !@update_os_dependencies
|
485
|
+
return false
|
486
|
+
end
|
487
|
+
|
488
|
+
# Now look for what the user wants
|
489
|
+
Autoproj.osdeps.osdeps_mode != 'none' || !Autoproj.osdeps.silent?
|
490
|
+
end
|
505
491
|
class << self
|
506
492
|
attr_accessor :update_os_dependencies
|
507
493
|
attr_accessor :snapshot_dir
|
@@ -515,14 +501,29 @@ OS dependencies through autoproj.
|
|
515
501
|
def self.build?; @mode =~ /build/ end
|
516
502
|
def self.doc?; @mode == "doc" end
|
517
503
|
def self.snapshot?; @mode == "snapshot" end
|
504
|
+
|
505
|
+
def self.osdeps?; @mode == "osdeps" end
|
506
|
+
def self.show_osdeps?; @mode == "osdeps" && @show_osdeps end
|
507
|
+
def self.revshow_osdeps?; @mode == "osdeps" && @revshow_osdeps end
|
508
|
+
def self.osdeps_forced_mode; @osdeps_forced_mode end
|
509
|
+
def self.osdeps_filter_uptodate?
|
510
|
+
if @mode == "osdeps"
|
511
|
+
@osdeps_filter_uptodate
|
512
|
+
else true
|
513
|
+
end
|
514
|
+
end
|
518
515
|
def self.list_newest?; @list_newest end
|
519
516
|
def self.parse_arguments(args)
|
520
517
|
@only_status = false
|
518
|
+
@only_local = false
|
519
|
+
@show_osdeps = false
|
520
|
+
@revshow_osdeps = false
|
521
|
+
@osdeps_filter_uptodate = true
|
522
|
+
@osdeps_forced_mode = nil
|
521
523
|
@check = false
|
522
524
|
@manifest_update = false
|
523
525
|
@display_configuration = false
|
524
|
-
@update_os_dependencies =
|
525
|
-
update_os_dependencies = nil
|
526
|
+
@update_os_dependencies = nil
|
526
527
|
@force_re_build_with_depends = false
|
527
528
|
force_re_build_with_depends = nil
|
528
529
|
@only_config = false
|
@@ -586,7 +587,10 @@ where 'mode' is one of:
|
|
586
587
|
opts.on("--[no-]update", "[do not] update already checked-out packages (build modes only)") do |value|
|
587
588
|
do_update = value
|
588
589
|
end
|
589
|
-
opts.on("--
|
590
|
+
opts.on("--keep-going", "-k", "continue building even though one package has an error") do
|
591
|
+
Autobuild.ignore_errors = true
|
592
|
+
end
|
593
|
+
opts.on("--os-version", "displays the operating system as detected by autoproj") do
|
590
594
|
os = OSDependencies.operating_system
|
591
595
|
if !os
|
592
596
|
puts "no information about that OS"
|
@@ -600,15 +604,49 @@ where 'mode' is one of:
|
|
600
604
|
exit 0
|
601
605
|
end
|
602
606
|
|
603
|
-
opts.on("--[no-]osdeps", "[do not] install prepackaged dependencies (build and update modes only)") do |value|
|
604
|
-
update_os_dependencies = value
|
605
|
-
end
|
606
607
|
opts.on("--with-depends", "apply rebuild and force-build to both packages selected on the command line and their dependencies") do
|
607
608
|
force_re_build_with_depends = true
|
608
609
|
end
|
609
610
|
opts.on("--list-newest", "for each source directory, list what is the newest file used by autoproj for dependency tracking") do
|
610
611
|
Autoproj::CmdLine.list_newest = true
|
611
612
|
end
|
613
|
+
opts.on("--rshow", "in the osdeps mode, shows information for each OS package") do
|
614
|
+
@revshow_osdeps = true
|
615
|
+
end
|
616
|
+
opts.on("--show", "in the osdeps mode, show a per-package listing of the OS dependencies instead of installing them") do
|
617
|
+
@show_osdeps = true
|
618
|
+
end
|
619
|
+
opts.on("--no-osdeps", "disable osdeps handling in build and update modes") do |value|
|
620
|
+
@osdeps_forced_mode = 'none'
|
621
|
+
end
|
622
|
+
opts.on("--all", "in osdeps mode, install both OS packages and RubyGem packages, regardless of the otherwise selected mode") do
|
623
|
+
@osdeps_forced_mode = 'all'
|
624
|
+
end
|
625
|
+
opts.on("--os", "in osdeps mode, install OS packages and display information about the RubyGem packages, regardless of the otherwise selected mode") do
|
626
|
+
if @osdeps_forced_mode == 'ruby'
|
627
|
+
# Make --ruby --os behave like --all
|
628
|
+
@osdeps_forced_mode = 'all'
|
629
|
+
else
|
630
|
+
@osdeps_forced_mode = 'os'
|
631
|
+
end
|
632
|
+
end
|
633
|
+
opts.on('--force', 'in osdeps mode, do not filter out installed and uptodate packages') do
|
634
|
+
@osdeps_filter_uptodate = false
|
635
|
+
end
|
636
|
+
opts.on("--ruby", "in osdeps mode, install only RubyGem packages and display information about the OS packages, regardless of the otherwise selected mode") do
|
637
|
+
if @osdeps_forced_mode == 'os'
|
638
|
+
# Make --ruby --os behave like --all
|
639
|
+
@osdeps_forced_mode = 'all'
|
640
|
+
else
|
641
|
+
@osdeps_forced_mode = 'ruby'
|
642
|
+
end
|
643
|
+
end
|
644
|
+
opts.on("--none", "in osdeps mode, do not install any package but display information about them, regardless of the otherwise selected mode") do
|
645
|
+
@osdeps_forced_mode = 'none'
|
646
|
+
end
|
647
|
+
opts.on("--local", "for status, do not access the network") do
|
648
|
+
@only_local = true
|
649
|
+
end
|
612
650
|
|
613
651
|
opts.on("--verbose", "verbose output") do
|
614
652
|
Autoproj.verbose = true
|
@@ -663,7 +701,6 @@ where 'mode' is one of:
|
|
663
701
|
|
664
702
|
selection = args.dup
|
665
703
|
@partial_build = !selection.empty?
|
666
|
-
@update_os_dependencies = update_os_dependencies if !update_os_dependencies.nil?
|
667
704
|
@force_re_build_with_depends = force_re_build_with_depends if !force_re_build_with_depends.nil?
|
668
705
|
Autobuild.do_update = do_update if !do_update.nil?
|
669
706
|
selection
|
@@ -717,7 +754,6 @@ where 'mode' is one of:
|
|
717
754
|
@update_os_dependencies = true
|
718
755
|
when "update"
|
719
756
|
Autobuild.do_update = true
|
720
|
-
@update_os_dependencies = true
|
721
757
|
Autobuild.do_build = false
|
722
758
|
when "check"
|
723
759
|
Autobuild.do_update = false
|
@@ -733,7 +769,6 @@ where 'mode' is one of:
|
|
733
769
|
Autobuild.do_update = false
|
734
770
|
@update_os_dependencies = true
|
735
771
|
Autobuild.do_build = false
|
736
|
-
Autoproj::OSDependencies.force_osdeps = true
|
737
772
|
when "status"
|
738
773
|
@only_status = true
|
739
774
|
Autobuild.do_update = false
|
@@ -745,7 +780,7 @@ where 'mode' is one of:
|
|
745
780
|
when "update-config"
|
746
781
|
@only_config = true
|
747
782
|
Autobuild.do_update = true
|
748
|
-
@update_os_dependencies =
|
783
|
+
@update_os_dependencies = true
|
749
784
|
Autobuild.do_build = false
|
750
785
|
when "list-config"
|
751
786
|
@only_config = true
|
@@ -780,7 +815,7 @@ where 'mode' is one of:
|
|
780
815
|
elsif !File.directory?(pkg.srcdir)
|
781
816
|
lines << Autoproj.color(" is not imported yet", :magenta)
|
782
817
|
else
|
783
|
-
status = pkg.importer.status(pkg)
|
818
|
+
status = pkg.importer.status(pkg,@only_local)
|
784
819
|
if status.uncommitted_code
|
785
820
|
lines << Autoproj.color(" contains uncommitted modifications", :red)
|
786
821
|
end
|
@@ -924,8 +959,9 @@ where 'mode' is one of:
|
|
924
959
|
vcs = Autoproj.normalize_vcs_definition(vcs_def)
|
925
960
|
|
926
961
|
# Install the OS dependencies required for this VCS
|
927
|
-
|
962
|
+
Autoproj::OSDependencies.define_osdeps_mode_option
|
928
963
|
osdeps = Autoproj::OSDependencies.load_default
|
964
|
+
osdeps.osdeps_mode
|
929
965
|
osdeps.install([vcs.type])
|
930
966
|
|
931
967
|
# Now check out the actual configuration
|
@@ -968,7 +1004,29 @@ manifest_source:
|
|
968
1004
|
if File.exists?(File.join("autoproj", "manifest"))
|
969
1005
|
raise ConfigError, "this installation is already bootstrapped. Remove the autoproj directory if it is not the case"
|
970
1006
|
end
|
971
|
-
|
1007
|
+
|
1008
|
+
require 'set'
|
1009
|
+
curdir_entries = Dir.entries('.').to_set - [".", "..", "autoproj_bootstrap", ".gems", 'env.sh'].to_set
|
1010
|
+
if !curdir_entries.empty? && ENV['AUTOPROJ_BOOTSTRAP_IGNORE_NONEMPTY_DIR'] != '1'
|
1011
|
+
while true
|
1012
|
+
print "The current directory is not empty, continue bootstrapping anyway ? [yes] "
|
1013
|
+
STDOUT.flush
|
1014
|
+
answer = STDIN.readline.chomp
|
1015
|
+
if answer == "no"
|
1016
|
+
exit
|
1017
|
+
elsif answer == "" || answer == "yes"
|
1018
|
+
# Set this environment variable since we might restart
|
1019
|
+
# autoproj later on.
|
1020
|
+
ENV['AUTOPROJ_BOOTSTRAP_IGNORE_NONEMPTY_DIR'] = '1'
|
1021
|
+
break
|
1022
|
+
else
|
1023
|
+
STDOUT.puts "invalid answer. Please answer 'yes' or 'no'"
|
1024
|
+
STDOUT.flush
|
1025
|
+
end
|
1026
|
+
end
|
1027
|
+
end
|
1028
|
+
|
1029
|
+
Autobuild.logdir = File.join(Autoproj.prefix, 'log')
|
972
1030
|
|
973
1031
|
# Check if GEM_HOME is set. If it is the case, assume that we are
|
974
1032
|
# bootstrapping from another installation directory and start by
|
@@ -1155,6 +1213,111 @@ export PATH=$GEM_HOME/bin:$PATH
|
|
1155
1213
|
io.write YAML.dump(overrides)
|
1156
1214
|
end
|
1157
1215
|
end
|
1216
|
+
|
1217
|
+
# Displays the reverse OS dependencies (i.e. for each osdeps package,
|
1218
|
+
# who depends on it and where it is defined)
|
1219
|
+
def self.revshow_osdeps(packages)
|
1220
|
+
_, ospkg_to_pkg = Autoproj.manifest.list_os_dependencies(packages)
|
1221
|
+
|
1222
|
+
# A mapping from a package name to
|
1223
|
+
# [is_os_pkg, is_gem_pkg, definitions, used_by]
|
1224
|
+
#
|
1225
|
+
# where
|
1226
|
+
#
|
1227
|
+
# +used_by+ is the set of autobuild package names that use this
|
1228
|
+
# osdeps package
|
1229
|
+
#
|
1230
|
+
# +definitions+ is a osdep_name => definition_file mapping
|
1231
|
+
mapping = Hash.new { |h, k| h[k] = [false, false, Hash.new, Set.new] }
|
1232
|
+
|
1233
|
+
ospkg_to_pkg.each do |pkg_osdep, pkgs|
|
1234
|
+
osdeps, gems = Autoproj.osdeps.
|
1235
|
+
partition_packages([pkg_osdep], ospkg_to_pkg)
|
1236
|
+
|
1237
|
+
gems.each do |gem_name|
|
1238
|
+
mapping[gem_name][1] = true
|
1239
|
+
mapping[gem_name][2][pkg_osdep] = Autoproj.osdeps.source_of(pkg_osdep)
|
1240
|
+
mapping[gem_name][3] |= pkgs
|
1241
|
+
end
|
1242
|
+
|
1243
|
+
if Autoproj::OSDependencies.supported_operating_system?
|
1244
|
+
osdeps = Autoproj.osdeps.
|
1245
|
+
resolve_os_dependencies(osdeps)
|
1246
|
+
end
|
1247
|
+
osdeps.each do |ospkg_name|
|
1248
|
+
mapping[ospkg_name][0] = true
|
1249
|
+
mapping[ospkg_name][2][pkg_osdep] = Autoproj.osdeps.source_of(pkg_osdep)
|
1250
|
+
mapping[ospkg_name][3] |= pkgs
|
1251
|
+
end
|
1252
|
+
end
|
1253
|
+
|
1254
|
+
mapping = mapping.sort_by(&:first)
|
1255
|
+
mapping.each do |pkg_name, (is_os_pkg, is_gem_pkg, definitions, used_by)|
|
1256
|
+
kind = if is_os_pkg && is_gem_pkg
|
1257
|
+
"both a RubyGem and OS package"
|
1258
|
+
elsif is_os_pkg
|
1259
|
+
"an OS package"
|
1260
|
+
else
|
1261
|
+
"a RubyGem package"
|
1262
|
+
end
|
1263
|
+
|
1264
|
+
puts "#{pkg_name} is #{kind}"
|
1265
|
+
definitions.to_a.
|
1266
|
+
sort_by(&:first).
|
1267
|
+
each do |osdep_name, file_name|
|
1268
|
+
puts " defined as #{osdep_name} in #{file_name}"
|
1269
|
+
end
|
1270
|
+
|
1271
|
+
puts " depended-upon by #{used_by.sort.join(", ")}"
|
1272
|
+
end
|
1273
|
+
end
|
1274
|
+
|
1275
|
+
# Displays the OS dependencies required by the given packages
|
1276
|
+
def self.show_osdeps(packages)
|
1277
|
+
_, ospkg_to_pkg = Autoproj.manifest.list_os_dependencies(packages)
|
1278
|
+
|
1279
|
+
# ospkg_to_pkg is the reverse mapping to what we want. Invert it
|
1280
|
+
mapping = Hash.new { |h, k| h[k] = Set.new }
|
1281
|
+
ospkg_to_pkg.each do |ospkg, pkgs|
|
1282
|
+
pkgs.each do |pkg_name|
|
1283
|
+
mapping[pkg_name] << ospkg
|
1284
|
+
end
|
1285
|
+
end
|
1286
|
+
|
1287
|
+
# Now sort it by package name (better for display)
|
1288
|
+
package_osdeps = mapping.to_a.
|
1289
|
+
sort_by { |name, _| name }
|
1290
|
+
|
1291
|
+
package_osdeps.each do |pkg_name, pkg_osdeps|
|
1292
|
+
if pkg_osdeps.empty?
|
1293
|
+
puts " #{pkg_name}: no OS dependencies"
|
1294
|
+
next
|
1295
|
+
end
|
1296
|
+
|
1297
|
+
osdeps, gems = Autoproj.osdeps.
|
1298
|
+
partition_packages(pkg_osdeps, ospkg_to_pkg)
|
1299
|
+
|
1300
|
+
puts " #{pkg_name}:"
|
1301
|
+
if !gems.empty?
|
1302
|
+
puts " RubyGem packages: #{gems.to_a.sort.join(", ")}"
|
1303
|
+
end
|
1304
|
+
|
1305
|
+
# If we are on a supported OS, convert the osdeps name to plain
|
1306
|
+
# package name
|
1307
|
+
if Autoproj::OSDependencies.supported_operating_system?
|
1308
|
+
pkg_osdeps = Autoproj.osdeps.
|
1309
|
+
resolve_os_dependencies(osdeps)
|
1310
|
+
|
1311
|
+
if !pkg_osdeps.empty?
|
1312
|
+
puts " OS packages: #{pkg_osdeps.to_a.sort.join(", ")}"
|
1313
|
+
end
|
1314
|
+
else
|
1315
|
+
if !os_packages.empty?
|
1316
|
+
puts " OS dependencies: #{os_packages.to_a.sort.join(", ")}"
|
1317
|
+
end
|
1318
|
+
end
|
1319
|
+
end
|
1320
|
+
end
|
1158
1321
|
end
|
1159
1322
|
end
|
1160
1323
|
|
data/lib/autoproj/manifest.rb
CHANGED
@@ -616,6 +616,15 @@ module Autoproj
|
|
616
616
|
# The path to the manifest file that has been loaded
|
617
617
|
attr_reader :file
|
618
618
|
|
619
|
+
# True if osdeps should be handled in update and build, or left to the
|
620
|
+
# osdeps command
|
621
|
+
def auto_osdeps?
|
622
|
+
if data.has_key?('auto_osdeps')
|
623
|
+
!!data['auto_osdeps']
|
624
|
+
else true
|
625
|
+
end
|
626
|
+
end
|
627
|
+
|
619
628
|
# True if autoproj should run an update automatically when the user
|
620
629
|
# uses" build"
|
621
630
|
def auto_update?
|
@@ -721,7 +730,7 @@ module Autoproj
|
|
721
730
|
end
|
722
731
|
|
723
732
|
if source_name && !done_something
|
724
|
-
raise ConfigError, "source '#{source_name}' does not exist"
|
733
|
+
raise ConfigError, "in #{file}: source '#{source_name}' does not exist"
|
725
734
|
end
|
726
735
|
end
|
727
736
|
|
@@ -743,6 +752,16 @@ module Autoproj
|
|
743
752
|
each_remote_source(false).any? { true }
|
744
753
|
end
|
745
754
|
|
755
|
+
# True if calling update_remote_sources will actually do anything
|
756
|
+
def should_update_remote_sources
|
757
|
+
each_remote_source(false) do |source|
|
758
|
+
if !File.directory?(source.local_dir)
|
759
|
+
return true
|
760
|
+
end
|
761
|
+
end
|
762
|
+
false
|
763
|
+
end
|
764
|
+
|
746
765
|
# Like #each_source, but filters out local package sets
|
747
766
|
def each_remote_source(load_description = true)
|
748
767
|
if !block_given?
|
@@ -1023,7 +1042,7 @@ module Autoproj
|
|
1023
1042
|
else
|
1024
1043
|
source = each_source.find { |source| source.name == name }
|
1025
1044
|
if !source
|
1026
|
-
raise ConfigError, "#{name} is neither a package nor a source"
|
1045
|
+
raise ConfigError, "in #{file}: #{name} is neither a package nor a source"
|
1027
1046
|
end
|
1028
1047
|
packages.values.
|
1029
1048
|
find_all { |pkg| pkg.package_set.name == source.name }.
|
@@ -1104,6 +1123,13 @@ module Autoproj
|
|
1104
1123
|
Autobuild::Package.each.map { |name, _| name }.to_set
|
1105
1124
|
end
|
1106
1125
|
|
1126
|
+
# Returns all the packages that can be built in this installation
|
1127
|
+
def all_packages
|
1128
|
+
packages.values.
|
1129
|
+
map { |pkg| pkg.autobuild.name }.
|
1130
|
+
find_all { |pkg_name| !Autoproj.osdeps || !Autoproj.osdeps.has?(pkg_name) }
|
1131
|
+
end
|
1132
|
+
|
1107
1133
|
# Returns the set of packages that should be built if the user does not
|
1108
1134
|
# specify any on the command line
|
1109
1135
|
def default_packages
|
@@ -1111,9 +1137,7 @@ module Autoproj
|
|
1111
1137
|
layout_packages(layout, true)
|
1112
1138
|
else
|
1113
1139
|
# No layout, all packages are selected
|
1114
|
-
|
1115
|
-
map { |pkg| pkg.autobuild.name }.
|
1116
|
-
find_all { |pkg_name| !Autoproj.osdeps || !Autoproj.osdeps.has?(pkg_name) }
|
1140
|
+
all_packages
|
1117
1141
|
end
|
1118
1142
|
|
1119
1143
|
names.delete_if { |pkg_name| excluded?(pkg_name) || ignored?(pkg_name) }
|
@@ -1156,7 +1180,7 @@ module Autoproj
|
|
1156
1180
|
begin
|
1157
1181
|
package.depends_on name
|
1158
1182
|
rescue Autobuild::ConfigException => e
|
1159
|
-
raise ConfigError, "manifest #{manifest_path} of #{package.name} from #{source.name} lists '#{name}' as dependency, which is listed in the layout but has no autobuild definition", e.backtrace
|
1183
|
+
raise ConfigError, "manifest #{manifest_path} of #{package.name} from #{source.name} lists '#{name}' as dependency, which is listed in the layout of #{file} but has no autobuild definition", e.backtrace
|
1160
1184
|
rescue ConfigError => e
|
1161
1185
|
raise ConfigError, "manifest #{manifest_path} of #{package.name} from #{source.name} lists '#{name}' as dependency, but it is neither a normal package nor an osdeps package. osdeps reports: #{e.message}", e.backtrace
|
1162
1186
|
end
|
@@ -1170,7 +1194,15 @@ module Autoproj
|
|
1170
1194
|
selected_packages.each(&:load_package_manifest)
|
1171
1195
|
end
|
1172
1196
|
|
1173
|
-
|
1197
|
+
# call-seq:
|
1198
|
+
# list_os_dependencies(packages) => required_packages, ospkg_to_pkg
|
1199
|
+
#
|
1200
|
+
# Returns the set of dependencies required by the listed packages.
|
1201
|
+
#
|
1202
|
+
# +required_packages+ is the set of osdeps names that are required for
|
1203
|
+
# +packages+ and +ospkg_to_pkg+ a mapping from the osdeps name to the
|
1204
|
+
# set of packages that require this OS package.
|
1205
|
+
def list_os_dependencies(packages)
|
1174
1206
|
required_os_packages = Set.new
|
1175
1207
|
package_os_deps = Hash.new { |h, k| h[k] = Array.new }
|
1176
1208
|
packages.each do |pkg_name|
|
@@ -1185,6 +1217,12 @@ module Autoproj
|
|
1185
1217
|
end
|
1186
1218
|
end
|
1187
1219
|
|
1220
|
+
return required_os_packages, package_os_deps
|
1221
|
+
end
|
1222
|
+
|
1223
|
+
# Installs the OS dependencies that are required by the given packages
|
1224
|
+
def install_os_dependencies(packages)
|
1225
|
+
required_os_packages, package_os_deps = list_os_dependencies(packages)
|
1188
1226
|
Autoproj.osdeps.install(required_os_packages, package_os_deps)
|
1189
1227
|
end
|
1190
1228
|
|
@@ -1218,7 +1256,7 @@ module Autoproj
|
|
1218
1256
|
expanded_packages |= (packages & all_layout_packages)
|
1219
1257
|
end
|
1220
1258
|
|
1221
|
-
!packages.empty?
|
1259
|
+
!packages.empty? || !sources.empty?
|
1222
1260
|
end
|
1223
1261
|
|
1224
1262
|
if selected_packages.empty?
|
@@ -1237,21 +1275,17 @@ module Autoproj
|
|
1237
1275
|
# Finally, check for package source directories
|
1238
1276
|
all_packages = self.all_package_names
|
1239
1277
|
selected_packages.delete_if do |sel|
|
1240
|
-
|
1278
|
+
match_dir = Regexp.new("^#{Regexp.quote(sel)}")
|
1279
|
+
match_pkg_name = Regexp.new(Regexp.quote(sel))
|
1241
1280
|
all_packages.each do |pkg_name|
|
1242
1281
|
pkg = Autobuild::Package[pkg_name]
|
1243
|
-
if pkg.srcdir =~
|
1282
|
+
if pkg_name =~ match_pkg_name || pkg.srcdir =~ match_dir
|
1244
1283
|
expanded_packages << pkg_name
|
1245
1284
|
end
|
1246
1285
|
end
|
1247
1286
|
end
|
1248
1287
|
|
1249
|
-
#
|
1250
|
-
# the layout (either un-defined or depended-upon by other packages).
|
1251
|
-
# Check for those by looking for root_dir/package_name
|
1252
|
-
|
1253
|
-
# Finally, remove packages that are explicitely excluded and/or
|
1254
|
-
# ignored
|
1288
|
+
# Remove packages that are explicitely excluded and/or ignored
|
1255
1289
|
expanded_packages.delete_if { |pkg_name| excluded?(pkg_name) || ignored?(pkg_name) }
|
1256
1290
|
expanded_packages.to_set
|
1257
1291
|
end
|