autoproj 1.6.2 → 1.7.0.b1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/History.txt +22 -1
- data/Rakefile +1 -1
- data/bin/autoproj +19 -6
- data/doc/guide/src/autoproj_bootstrap +68 -64
- data/lib/autoproj/autobuild.rb +38 -2
- data/lib/autoproj/base.rb +23 -1
- data/lib/autoproj/cmdline.rb +135 -61
- data/lib/autoproj/manifest.rb +441 -188
- data/lib/autoproj/options.rb +2 -2
- data/lib/autoproj/osdeps.rb +11 -10
- data/lib/autoproj/version.rb +1 -1
- metadata +19 -16
data/History.txt
CHANGED
@@ -1,3 +1,24 @@
|
|
1
|
+
= Version 1.7.0
|
2
|
+
* 1.6.2 should have been 1.7.0. Bump it now.
|
3
|
+
* introduced cross-package-set imports. A package set can now tell autoproj to
|
4
|
+
install another one in a recursive manner (see user's guide)
|
5
|
+
* added optional dependencies, which will not be considered if the
|
6
|
+
depended-upon package is either not existing or is explicitely excluded from
|
7
|
+
the build. It is specified in Ruby with
|
8
|
+
pkg.optional_dependency pkg_name
|
9
|
+
or in the package's manifest.xml files by setting the "optional" attribute to 1:
|
10
|
+
<depend package="pkg_name" optional="1" />
|
11
|
+
|
12
|
+
* added the #package toplevel method to get a package handle, i.e.
|
13
|
+
package('orocos/rtt')
|
14
|
+
is equivalent to the former
|
15
|
+
Autobuild::Package['orocos/rtt']
|
16
|
+
* added the --randomize-layout option which makes autoproj build each package
|
17
|
+
in a separate non-trivial subfolder, and install it in a separate folder as
|
18
|
+
well. This is meant to test the definition and handling of dependencies
|
19
|
+
between the different packages.
|
20
|
+
* added the autolocate tool, which returns the full path to a certain package
|
21
|
+
|
1
22
|
= Version 1.6.2
|
2
23
|
* overhauled osdeps fine-grained configuration. See
|
3
24
|
http://orocos.org/dfki/autoproj/osdeps.html
|
@@ -10,7 +31,7 @@
|
|
10
31
|
errors are properly presented at the end of the run.
|
11
32
|
* when boostrapping, check that the current directory is empty and warn the
|
12
33
|
user if it is not.
|
13
|
-
* a few minor bugfixes
|
34
|
+
* a few more minor bugfixes
|
14
35
|
|
15
36
|
= Version 1.6.1
|
16
37
|
* fix a limitation of giving directories on the command line. Before, only
|
data/Rakefile
CHANGED
data/bin/autoproj
CHANGED
@@ -1,5 +1,12 @@
|
|
1
1
|
#! /usr/bin/env ruby
|
2
2
|
|
3
|
+
if !ARGV.grep("--env").empty?
|
4
|
+
require 'autoproj/system'
|
5
|
+
puts File.join(Autoproj.root_dir, "env.sh")
|
6
|
+
exit
|
7
|
+
end
|
8
|
+
|
9
|
+
|
3
10
|
if RUBY_VERSION < "1.8.7"
|
4
11
|
STDERR.puts "autoproj requires Ruby >= 1.8.7"
|
5
12
|
exit 1
|
@@ -103,9 +110,13 @@ EOTEXT
|
|
103
110
|
Autobuild.do_update = Autoproj.auto_update?
|
104
111
|
end
|
105
112
|
|
113
|
+
selected_packages = Autoproj::CmdLine.resolve_user_selection(selected_packages)
|
114
|
+
Autoproj.manifest.explicit_selection = selected_packages
|
115
|
+
Autoproj::CmdLine.initial_package_setup
|
116
|
+
|
106
117
|
# If in verbose mode, or if we only update sources, list the sources
|
107
118
|
if Autoproj.verbose || Autoproj::CmdLine.display_configuration?
|
108
|
-
Autoproj::CmdLine.
|
119
|
+
Autoproj::CmdLine.display_configuration(manifest, selected_packages)
|
109
120
|
end
|
110
121
|
|
111
122
|
if Autoproj::CmdLine.bootstrap?
|
@@ -136,10 +147,6 @@ EOTEXT
|
|
136
147
|
exit(0)
|
137
148
|
end
|
138
149
|
|
139
|
-
selected_packages = Autoproj::CmdLine.resolve_user_selection(selected_packages)
|
140
|
-
Autoproj.manifest.explicit_selection = selected_packages
|
141
|
-
Autoproj::CmdLine.initial_package_setup
|
142
|
-
|
143
150
|
if Autoproj::CmdLine.only_status?
|
144
151
|
all_enabled_packages = Autoproj::CmdLine.import_packages(selected_packages)
|
145
152
|
Autoproj::CmdLine.status(all_enabled_packages)
|
@@ -180,7 +187,13 @@ EOTEXT
|
|
180
187
|
all_enabled_packages = Autoproj::CmdLine.import_packages(selected_packages)
|
181
188
|
|
182
189
|
if Autoproj::CmdLine.update_os_dependencies? && !all_enabled_packages.empty?
|
183
|
-
|
190
|
+
begin
|
191
|
+
update_mode = Autobuild.do_update
|
192
|
+
Autobuild.do_update ||= Autoproj::CmdLine.osdeps?
|
193
|
+
manifest.install_os_dependencies(all_enabled_packages)
|
194
|
+
ensure
|
195
|
+
Autobuild.do_update = update_mode
|
196
|
+
end
|
184
197
|
end
|
185
198
|
|
186
199
|
if all_enabled_packages.empty?
|
@@ -106,7 +106,7 @@ module Autoproj
|
|
106
106
|
data = YAML.load(File.read(file)) || Hash.new
|
107
107
|
verify_definitions(data)
|
108
108
|
rescue ArgumentError => e
|
109
|
-
raise ConfigError, "error in #{file}: #{e.message}"
|
109
|
+
raise ConfigError.new, "error in #{file}: #{e.message}"
|
110
110
|
end
|
111
111
|
|
112
112
|
OSDependencies.new(data, file)
|
@@ -243,8 +243,9 @@ module Autoproj
|
|
243
243
|
return @operating_system
|
244
244
|
elsif Autoproj.has_config_key?('operating_system')
|
245
245
|
os = Autoproj.user_config('operating_system')
|
246
|
-
if
|
247
|
-
@operating_system =
|
246
|
+
if os.respond_to?(:to_ary) # upgrade from previous format
|
247
|
+
@operating_system = os
|
248
|
+
return os
|
248
249
|
end
|
249
250
|
end
|
250
251
|
|
@@ -434,7 +435,7 @@ fi
|
|
434
435
|
elsif data.respond_to?(:to_str)
|
435
436
|
return [PACKAGES, [data.to_str]]
|
436
437
|
else
|
437
|
-
raise ConfigError, "invalid package specificiation #{data} in #{source_of(name)}"
|
438
|
+
raise ConfigError.new, "invalid package specificiation #{data} in #{source_of(name)}"
|
438
439
|
end
|
439
440
|
end
|
440
441
|
|
@@ -449,11 +450,11 @@ fi
|
|
449
450
|
dependencies.each do |name|
|
450
451
|
result = resolve_package(name)
|
451
452
|
if result == NO_PACKAGE
|
452
|
-
raise ConfigError, "there is no osdeps definition for #{name}"
|
453
|
+
raise ConfigError.new, "there is no osdeps definition for #{name}"
|
453
454
|
elsif result == WRONG_OS
|
454
|
-
raise ConfigError, "there is an osdeps definition for #{name}, but not for this operating system"
|
455
|
+
raise ConfigError.new, "there is an osdeps definition for #{name}, but not for this operating system"
|
455
456
|
elsif result == WRONG_OS_VERSION
|
456
|
-
raise ConfigError, "there is an osdeps definition for #{name}, but not for this particular operating system version"
|
457
|
+
raise ConfigError.new, "there is an osdeps definition for #{name}, but not for this particular operating system version"
|
457
458
|
elsif result == IGNORE
|
458
459
|
next
|
459
460
|
elsif result[0] == PACKAGES
|
@@ -462,7 +463,7 @@ fi
|
|
462
463
|
end
|
463
464
|
|
464
465
|
if !os_names.any? { |os_name| OS_AUTO_PACKAGE_INSTALL.has_key?(os_name) }
|
465
|
-
raise ConfigError, "I don't know how to install packages on #{os_names.first}"
|
466
|
+
raise ConfigError.new, "I don't know how to install packages on #{os_names.first}"
|
466
467
|
end
|
467
468
|
|
468
469
|
return os_packages
|
@@ -545,7 +546,7 @@ fi
|
|
545
546
|
# This is *not* handled later, as is the absence of a
|
546
547
|
# package definition. The reason is that it is a bad
|
547
548
|
# configuration file, and should be fixed by the user
|
548
|
-
raise ConfigError, "unknown OS-independent package management type #{pkg_def} for #{name}"
|
549
|
+
raise ConfigError.new, "unknown OS-independent package management type #{pkg_def} for #{name}"
|
549
550
|
end
|
550
551
|
else
|
551
552
|
pkg_def.delete_if do |distrib_name, defs|
|
@@ -609,7 +610,7 @@ fi
|
|
609
610
|
installed_version = installed.map(&:version).max
|
610
611
|
available_version = available.map { |(name, v), source| v }.max
|
611
612
|
if !available_version
|
612
|
-
raise ConfigError, "cannot find any gem with the name '#{name}'"
|
613
|
+
raise ConfigError.new, "cannot find any gem with the name '#{name}'"
|
613
614
|
end
|
614
615
|
needs_update = (available_version > installed_version)
|
615
616
|
!needs_update
|
@@ -950,7 +951,7 @@ module Autoproj
|
|
950
951
|
@name, @type, @options = name.to_str, type.to_str, options.to_hash
|
951
952
|
@validator = validator.to_proc if validator
|
952
953
|
if !BuildOption.respond_to?("validate_#{type}")
|
953
|
-
raise ConfigError, "invalid option type #{type}"
|
954
|
+
raise ConfigError.new, "invalid option type #{type}"
|
954
955
|
end
|
955
956
|
end
|
956
957
|
|
@@ -1023,9 +1024,12 @@ module Autoproj
|
|
1023
1024
|
if possible_values = options[:possible_values]
|
1024
1025
|
if options[:lowercase]
|
1025
1026
|
value = value.downcase
|
1027
|
+
elsif options[:uppercase]
|
1028
|
+
value = value.upcase
|
1026
1029
|
end
|
1030
|
+
|
1027
1031
|
if !possible_values.include?(value)
|
1028
|
-
raise InputError, "invalid value '#{value}', accepted values are '#{possible_values.join(", ")}'"
|
1032
|
+
raise InputError, "invalid value '#{value}', accepted values are '#{possible_values.join("', '")}' (without the quotes)"
|
1029
1033
|
end
|
1030
1034
|
end
|
1031
1035
|
value
|
@@ -1087,7 +1091,7 @@ module Autoproj
|
|
1087
1091
|
@user_config[option_name] = [value, true]
|
1088
1092
|
value
|
1089
1093
|
else
|
1090
|
-
raise ConfigError, "undeclared option '#{option_name}'"
|
1094
|
+
raise ConfigError.new, "undeclared option '#{option_name}'"
|
1091
1095
|
end
|
1092
1096
|
end
|
1093
1097
|
|
@@ -1315,85 +1319,85 @@ end
|
|
1315
1319
|
|
1316
1320
|
DEFS = <<EODEFS
|
1317
1321
|
---
|
1322
|
+
svn:
|
1323
|
+
arch: subversion
|
1324
|
+
gentoo: dev-util/subversion
|
1325
|
+
debian,ubuntu: subversion
|
1326
|
+
autobuild: gem
|
1327
|
+
zlib:
|
1328
|
+
debian,ubuntu: zlib1g-dev
|
1329
|
+
libxml2:
|
1330
|
+
arch: libxml2
|
1331
|
+
gentoo: dev-libs/libxml2
|
1332
|
+
debian,ubuntu: libxml2-dev
|
1318
1333
|
none: ignore
|
1334
|
+
autotools:
|
1335
|
+
arch: automake autoconf
|
1336
|
+
gentoo:
|
1337
|
+
- sys-devel/automake:1.9
|
1338
|
+
- sys-devel/autoconf
|
1339
|
+
debian,ubuntu:
|
1340
|
+
- automake1.9
|
1341
|
+
- autoconf
|
1342
|
+
autoproj: gem
|
1343
|
+
archive:
|
1344
|
+
arch:
|
1345
|
+
- tar
|
1346
|
+
- unzip
|
1347
|
+
gentoo:
|
1348
|
+
- app-arch/tar
|
1349
|
+
- app-arch/unzip
|
1350
|
+
debian,ubuntu:
|
1351
|
+
- tar
|
1352
|
+
- unzip
|
1353
|
+
lsb_release:
|
1354
|
+
arch:
|
1355
|
+
gentoo: sys-apps/lsb-release
|
1356
|
+
debian,ubuntu: lsb-release
|
1319
1357
|
ruby18:
|
1358
|
+
gentoo:
|
1359
|
+
- dev-lang/ruby:1.8
|
1320
1360
|
debian,ubuntu:
|
1321
1361
|
- ruby1.8-dev
|
1322
1362
|
- ruby1.8
|
1323
1363
|
- rubygems1.8
|
1324
1364
|
- ri1.8
|
1325
1365
|
- libopenssl-ruby1.8
|
1326
|
-
gentoo:
|
1327
|
-
- dev-lang/ruby:1.8
|
1328
1366
|
ruby19:
|
1329
1367
|
debian:
|
1330
1368
|
- ruby1.9.1
|
1331
1369
|
- ruby1.9.1-dev
|
1332
1370
|
- rubygems1.9.1
|
1371
|
+
arch:
|
1372
|
+
- ruby
|
1373
|
+
gentoo:
|
1374
|
+
- dev-lang/ruby:1.9
|
1333
1375
|
ubuntu:
|
1334
1376
|
- ruby1.9.1
|
1335
1377
|
- ruby1.9.1-dev
|
1336
1378
|
- rubygems1.9.1
|
1337
1379
|
- ri1.9.1
|
1338
1380
|
- libopenssl-ruby1.9.1
|
1339
|
-
gentoo:
|
1340
|
-
- dev-lang/ruby:1.9
|
1341
|
-
arch:
|
1342
|
-
- ruby
|
1343
|
-
rdoc: gem
|
1344
|
-
build-essential:
|
1345
|
-
debian,ubuntu: build-essential
|
1346
|
-
gentoo:
|
1347
|
-
arch:
|
1348
|
-
libxml2:
|
1349
|
-
debian,ubuntu: libxml2-dev
|
1350
|
-
gentoo: dev-libs/libxml2
|
1351
|
-
arch: libxml2
|
1352
|
-
libxslt:
|
1353
|
-
debian,ubuntu: libxslt1-dev
|
1354
|
-
gentoo: dev-libs/libxslt
|
1355
|
-
arch: libxslt
|
1356
|
-
zlib:
|
1357
|
-
debian,ubuntu: zlib1g-dev
|
1358
|
-
autobuild: gem
|
1359
|
-
autoproj: gem
|
1360
1381
|
git:
|
1361
1382
|
debian:
|
1362
1383
|
lenny: git
|
1363
1384
|
default: git-core
|
1364
|
-
ubuntu: git-core
|
1365
|
-
gentoo: dev-vcs/git
|
1366
1385
|
arch: git
|
1367
|
-
|
1368
|
-
|
1369
|
-
gentoo: dev-util/subversion
|
1370
|
-
arch: subversion
|
1386
|
+
gentoo: dev-vcs/git
|
1387
|
+
ubuntu: git-core
|
1371
1388
|
cmake:
|
1372
|
-
debian,ubuntu: cmake
|
1373
|
-
gentoo: dev-util/cmake
|
1374
1389
|
arch: cmake
|
1375
|
-
|
1376
|
-
debian,ubuntu:
|
1377
|
-
|
1378
|
-
- autoconf
|
1379
|
-
gentoo:
|
1380
|
-
- sys-devel/automake:1.9
|
1381
|
-
- sys-devel/autoconf
|
1382
|
-
arch: automake autoconf
|
1383
|
-
lsb_release:
|
1384
|
-
debian,ubuntu: lsb-release
|
1385
|
-
gentoo: sys-apps/lsb-release
|
1390
|
+
gentoo: dev-util/cmake
|
1391
|
+
debian,ubuntu: cmake
|
1392
|
+
build-essential:
|
1386
1393
|
arch:
|
1387
|
-
archive:
|
1388
|
-
debian,ubuntu:
|
1389
|
-
- tar
|
1390
|
-
- unzip
|
1391
1394
|
gentoo:
|
1392
|
-
|
1393
|
-
|
1394
|
-
arch:
|
1395
|
-
-
|
1396
|
-
-
|
1395
|
+
debian,ubuntu: build-essential
|
1396
|
+
libxslt:
|
1397
|
+
arch: libxslt
|
1398
|
+
gentoo: dev-libs/libxslt
|
1399
|
+
debian,ubuntu: libxslt1-dev
|
1400
|
+
rdoc: gem
|
1397
1401
|
|
1398
1402
|
EODEFS
|
1399
1403
|
|
data/lib/autoproj/autobuild.rb
CHANGED
@@ -74,6 +74,27 @@ module Autobuild
|
|
74
74
|
depends_on(name)
|
75
75
|
end
|
76
76
|
|
77
|
+
def optional_dependency(name)
|
78
|
+
optional_dependencies << name
|
79
|
+
end
|
80
|
+
|
81
|
+
def resolve_optional_dependencies
|
82
|
+
optional_dependencies.each do |name|
|
83
|
+
if Autobuild::Package[name] && Autoproj.manifest.package_enabled?(name)
|
84
|
+
if Autoproj.verbose
|
85
|
+
STDERR.puts "adding optional dependency #{self.name} => #{name}"
|
86
|
+
end
|
87
|
+
depends_on(name)
|
88
|
+
elsif Autoproj.verbose
|
89
|
+
STDERR.puts "NOT adding optional dependency #{self.name} => #{name}"
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
def optional_dependencies
|
95
|
+
@optional_dependencies ||= Set.new
|
96
|
+
end
|
97
|
+
|
77
98
|
def os_packages
|
78
99
|
@os_packages ||= Set.new
|
79
100
|
end
|
@@ -133,9 +154,9 @@ module Autoproj
|
|
133
154
|
end
|
134
155
|
|
135
156
|
if source.local?
|
136
|
-
raise ConfigError, "#{path}:#{line_number} #{error.message}", error.backtrace
|
157
|
+
raise ConfigError.new(path), "#{path}:#{line_number} #{error.message}", error.backtrace
|
137
158
|
else
|
138
|
-
raise ConfigError, "#{File.basename(path)}(source=#{source.name}):#{line_number} #{error.message}", error.backtrace
|
159
|
+
raise ConfigError.new(path), "#{File.basename(path)}(source=#{source.name}):#{line_number} #{error.message}", error.backtrace
|
139
160
|
end
|
140
161
|
else
|
141
162
|
raise error
|
@@ -443,3 +464,18 @@ class Autobuild::ArchiveImporter
|
|
443
464
|
end
|
444
465
|
end
|
445
466
|
|
467
|
+
def package(name)
|
468
|
+
Autobuild::Package[name]
|
469
|
+
end
|
470
|
+
|
471
|
+
# Returns true if +name+ is a valid package and is included in the build
|
472
|
+
def package_enabled?(name)
|
473
|
+
Autoproj.manifest.package_enabled?(name, false)
|
474
|
+
end
|
475
|
+
|
476
|
+
# If used in init.rb, allows to disable automatic imports from specific package
|
477
|
+
# sets
|
478
|
+
def disable_imports_from(name)
|
479
|
+
Autoproj.manifest.disable_imports_from(name)
|
480
|
+
end
|
481
|
+
|
data/lib/autoproj/base.rb
CHANGED
@@ -1,6 +1,28 @@
|
|
1
1
|
module Autoproj
|
2
|
-
class ConfigError < RuntimeError
|
2
|
+
class ConfigError < RuntimeError
|
3
|
+
attr_accessor :file
|
4
|
+
def initialize(file = nil)
|
5
|
+
super
|
6
|
+
@file = file
|
7
|
+
end
|
8
|
+
end
|
3
9
|
class InternalError < RuntimeError; end
|
10
|
+
|
11
|
+
# Yields, and if the given block raises a ConfigError with no file assigned,
|
12
|
+
# add that file to both the object and the exception message
|
13
|
+
def self.in_file(file, exception_t = ConfigError)
|
14
|
+
yield
|
15
|
+
|
16
|
+
rescue exception_t => e
|
17
|
+
if exception_t != ConfigError
|
18
|
+
raise ConfigError.new(file), "in #{file}: #{e.message}", e.backtrace
|
19
|
+
elsif !e.file
|
20
|
+
e.file = file
|
21
|
+
raise e, "in #{file}: #{e.message}", e.backtrace
|
22
|
+
else
|
23
|
+
raise e
|
24
|
+
end
|
25
|
+
end
|
4
26
|
end
|
5
27
|
|
6
28
|
|
data/lib/autoproj/cmdline.rb
CHANGED
@@ -42,10 +42,14 @@ module Autoproj
|
|
42
42
|
Autoproj.prefix = Autoproj.user_config('prefix')
|
43
43
|
end
|
44
44
|
|
45
|
+
if Autoproj.has_config_key?('randomize_layout')
|
46
|
+
@randomize_layout = Autoproj.user_config('randomize_layout')
|
47
|
+
end
|
48
|
+
|
45
49
|
# If we are under rubygems, check that the GEM_HOME is right ...
|
46
50
|
if $LOADED_FEATURES.any? { |l| l =~ /rubygems/ }
|
47
51
|
if ENV['GEM_HOME'] != Autoproj.gem_home
|
48
|
-
raise ConfigError, "RubyGems is already loaded with a different GEM_HOME, make sure you are loading the right env.sh script !"
|
52
|
+
raise ConfigError.new, "RubyGems is already loaded with a different GEM_HOME, make sure you are loading the right env.sh script !"
|
49
53
|
end
|
50
54
|
end
|
51
55
|
|
@@ -71,14 +75,16 @@ module Autoproj
|
|
71
75
|
Autoproj.env_add 'PATH', bindir
|
72
76
|
end
|
73
77
|
|
78
|
+
Autoproj.manifest = Manifest.new
|
79
|
+
|
74
80
|
# We load the local init.rb first so that the manifest loading
|
75
81
|
# process can use options defined there for the autoproj version
|
76
82
|
# control information (for instance)
|
77
|
-
local_source =
|
83
|
+
local_source = LocalPackageSet.new(Autoproj.manifest)
|
78
84
|
Autoproj.load_if_present(local_source, local_source.local_dir, "init.rb")
|
79
85
|
|
80
86
|
manifest_path = File.join(Autoproj.config_dir, 'manifest')
|
81
|
-
Autoproj.manifest
|
87
|
+
Autoproj.manifest.load(manifest_path)
|
82
88
|
|
83
89
|
# Once thing left to do: handle the Autoproj.auto_update
|
84
90
|
# configuration parameter. This has to be done here as the rest of
|
@@ -102,10 +108,10 @@ module Autoproj
|
|
102
108
|
end
|
103
109
|
# Do that AFTER we have properly setup Autoproj.osdeps as to avoid
|
104
110
|
# unnecessarily redetecting the operating system
|
105
|
-
Autoproj::OSDependencies.define_osdeps_mode_option
|
106
111
|
if update_os_dependencies? || osdeps?
|
107
112
|
Autoproj.reset_option('operating_system')
|
108
113
|
end
|
114
|
+
Autoproj::OSDependencies.define_osdeps_mode_option
|
109
115
|
Autoproj.osdeps.osdeps_mode
|
110
116
|
end
|
111
117
|
|
@@ -137,6 +143,7 @@ module Autoproj
|
|
137
143
|
|
138
144
|
def self.load_configuration(silent = false)
|
139
145
|
manifest = Autoproj.manifest
|
146
|
+
manifest.cache_package_sets
|
140
147
|
|
141
148
|
# Load init.rb files. each_source must not load the source.yml file, as
|
142
149
|
# init.rb may define configuration options that are used there
|
@@ -177,7 +184,7 @@ module Autoproj
|
|
177
184
|
if manifest.vcs
|
178
185
|
manifest.update_yourself
|
179
186
|
manifest_path = File.join(Autoproj.config_dir, 'manifest')
|
180
|
-
|
187
|
+
manifest.load(manifest_path)
|
181
188
|
end
|
182
189
|
|
183
190
|
source_os_dependencies = manifest.each_remote_source(false).
|
@@ -213,13 +220,20 @@ module Autoproj
|
|
213
220
|
# First, we allow to user to specify packages based on disk paths, so
|
214
221
|
# resolve those
|
215
222
|
seen = Set.new
|
216
|
-
manifest.
|
223
|
+
manifest.each_layout_level do |name, packages, enabled_packages|
|
217
224
|
packages -= seen
|
218
225
|
|
219
|
-
srcdir = File.join(Autoproj.root_dir, name)
|
220
|
-
prefix = File.join(Autoproj.build_dir, name)
|
221
|
-
logdir = File.join(prefix, "log")
|
222
226
|
packages.each do |pkg_name|
|
227
|
+
place =
|
228
|
+
if randomize_layout?
|
229
|
+
Digest::SHA256.hexdigest(pkg_name)[0, 12]
|
230
|
+
else name
|
231
|
+
end
|
232
|
+
|
233
|
+
srcdir = File.join(Autoproj.root_dir, place)
|
234
|
+
prefix = File.join(Autoproj.build_dir, place)
|
235
|
+
logdir = File.join(prefix, "log")
|
236
|
+
|
223
237
|
pkg = Autobuild::Package[pkg_name]
|
224
238
|
pkg.srcdir = File.join(srcdir, pkg_name)
|
225
239
|
pkg.prefix = prefix
|
@@ -237,6 +251,9 @@ module Autoproj
|
|
237
251
|
end
|
238
252
|
end
|
239
253
|
|
254
|
+
# Resolve optional dependencies
|
255
|
+
manifest.resolve_optional_dependencies
|
256
|
+
|
240
257
|
# Load the package's override files. each_source must not load the
|
241
258
|
# source.yml file, as init.rb may define configuration options that are used
|
242
259
|
# there
|
@@ -250,51 +267,97 @@ module Autoproj
|
|
250
267
|
end
|
251
268
|
|
252
269
|
|
253
|
-
def self.
|
270
|
+
def self.display_configuration(manifest, package_list = nil)
|
254
271
|
# We can't have the Manifest class load the source.yml file, as it
|
255
272
|
# cannot resolve all constants. So we need to do it ourselves to get
|
256
273
|
# the name ...
|
257
|
-
|
274
|
+
sets = manifest.each_package_set(false).to_a
|
258
275
|
|
259
|
-
if
|
276
|
+
if sets.empty?
|
260
277
|
Autoproj.progress("autoproj: no package sets defined in autoproj/manifest", :bold, :red)
|
278
|
+
return
|
279
|
+
end
|
280
|
+
|
281
|
+
all_packages = Hash.new
|
282
|
+
if package_list
|
283
|
+
package_sets = Set.new
|
284
|
+
package_list.each do |name|
|
285
|
+
pkg_set = manifest.definition_source(name)
|
286
|
+
package_sets << pkg_set
|
287
|
+
all_packages[name] = [manifest.package(name).autobuild, pkg_set.name]
|
288
|
+
end
|
261
289
|
else
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
if source.local?
|
267
|
-
Autoproj.progress " local source in #{source.local_dir}"
|
268
|
-
else
|
269
|
-
Autoproj.progress " from: #{source.vcs}"
|
270
|
-
Autoproj.progress " local: #{source.local_dir}"
|
290
|
+
package_sets = manifest.each_package_set
|
291
|
+
package_sets.each do |pkg_set|
|
292
|
+
pkg_set.each_package.each do |pkg|
|
293
|
+
all_packages[pkg.name] = [pkg, pkg_set.name]
|
271
294
|
end
|
295
|
+
end
|
296
|
+
end
|
272
297
|
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
298
|
+
Autoproj.progress
|
299
|
+
Autoproj.progress("autoproj: package sets", :bold)
|
300
|
+
package_sets.each do |pkg_set|
|
301
|
+
next if pkg_set.empty?
|
302
|
+
if pkg_set.imported_from
|
303
|
+
Autoproj.progress "#{pkg_set.name} (imported by #{pkg_set.imported_from.name})"
|
304
|
+
else
|
305
|
+
Autoproj.progress "#{pkg_set.name} (listed in manifest)"
|
306
|
+
end
|
307
|
+
if pkg_set.local?
|
308
|
+
Autoproj.progress " local set in #{pkg_set.local_dir}"
|
309
|
+
else
|
310
|
+
Autoproj.progress " from: #{pkg_set.vcs}"
|
311
|
+
Autoproj.progress " local: #{pkg_set.local_dir}"
|
312
|
+
end
|
286
313
|
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
314
|
+
imports = pkg_set.each_imported_set.to_a
|
315
|
+
if !imports.empty?
|
316
|
+
Autoproj.progress " imports #{imports.size} package sets"
|
317
|
+
if !pkg_set.auto_imports?
|
318
|
+
Autoproj.progress " automatic imports are DISABLED for this set"
|
291
319
|
end
|
292
|
-
|
293
|
-
|
294
|
-
lines.each do |col1, col2|
|
295
|
-
puts(format % [col1, col2])
|
320
|
+
imports.each do |imported_set|
|
321
|
+
Autoproj.progress " #{imported_set.name}"
|
296
322
|
end
|
297
323
|
end
|
324
|
+
|
325
|
+
set_packages = pkg_set.each_package.sort_by(&:name)
|
326
|
+
Autoproj.progress " defines: #{set_packages.map(&:name).join(", ")}"
|
327
|
+
end
|
328
|
+
|
329
|
+
Autoproj.progress
|
330
|
+
Autoproj.progress("autoproj: packages", :bold)
|
331
|
+
all_packages.to_a.sort_by(&:first).map(&:last).each do |pkg, pkg_set|
|
332
|
+
if File.exists?(File.join(pkg.srcdir, "manifest.xml"))
|
333
|
+
manifest.load_package_manifest(pkg.name)
|
334
|
+
manifest.resolve_optional_dependencies
|
335
|
+
end
|
336
|
+
|
337
|
+
pkg_manifest = manifest.package_manifests[pkg.name];
|
338
|
+
vcs_def = manifest.importer_definition_for(pkg.name)
|
339
|
+
Autoproj.progress "#{pkg.name}#{": #{pkg_manifest.short_documentation}" if pkg_manifest && pkg_manifest.short_documentation}", :bold
|
340
|
+
Autoproj.progress " defined in #{pkg_set}"
|
341
|
+
Autoproj.progress " #{vcs_def.to_s}"
|
342
|
+
|
343
|
+
if !File.directory?(pkg.srcdir)
|
344
|
+
Autoproj.progress " NOT checked out yet, reported dependencies will be partial"
|
345
|
+
end
|
346
|
+
|
347
|
+
optdeps = pkg.optional_dependencies.to_set
|
348
|
+
real_deps = pkg.dependencies.to_a
|
349
|
+
actual_real_deps = real_deps.find_all { |dep_name| !optdeps.include?(dep_name) }
|
350
|
+
if !actual_real_deps.empty?
|
351
|
+
Autoproj.progress " deps: #{actual_real_deps.join(", ")}"
|
352
|
+
end
|
353
|
+
|
354
|
+
selected_opt_deps, opt_deps = optdeps.partition { |dep_name| real_deps.include?(dep_name) }
|
355
|
+
if !selected_opt_deps.empty?
|
356
|
+
Autoproj.progress " enabled opt deps: #{selected_opt_deps.join(", ")}"
|
357
|
+
end
|
358
|
+
if !opt_deps.empty?
|
359
|
+
Autoproj.progress " disabled opt deps: #{opt_deps.join(", ")}"
|
360
|
+
end
|
298
361
|
end
|
299
362
|
end
|
300
363
|
|
@@ -325,11 +388,11 @@ module Autoproj
|
|
325
388
|
|
326
389
|
def self.verify_package_availability(pkg_name)
|
327
390
|
if reason = Autoproj.manifest.exclusion_reason(pkg_name)
|
328
|
-
raise ConfigError, "#{pkg_name} is excluded from the build: #{reason}"
|
391
|
+
raise ConfigError.new, "#{pkg_name} is excluded from the build: #{reason}"
|
329
392
|
end
|
330
393
|
pkg = Autobuild::Package[pkg_name]
|
331
394
|
if !pkg
|
332
|
-
raise ConfigError, "#{pkg_name} does not seem to exist"
|
395
|
+
raise ConfigError.new, "#{pkg_name} does not seem to exist"
|
333
396
|
end
|
334
397
|
|
335
398
|
# Verify that its dependencies are there, and add
|
@@ -349,7 +412,7 @@ module Autoproj
|
|
349
412
|
map do |pkg_name|
|
350
413
|
pkg = Autobuild::Package[pkg_name]
|
351
414
|
if !pkg
|
352
|
-
raise ConfigError, "selected package #{pkg_name} does not exist"
|
415
|
+
raise ConfigError.new, "selected package #{pkg_name} does not exist"
|
353
416
|
end
|
354
417
|
pkg
|
355
418
|
end.to_set
|
@@ -397,11 +460,13 @@ module Autoproj
|
|
397
460
|
# If the package has no importer, the source directory must
|
398
461
|
# be there
|
399
462
|
if !pkg.importer && !File.directory?(pkg.srcdir)
|
400
|
-
raise ConfigError, "#{pkg.name} has no VCS, but is not checked out in #{pkg.srcdir}"
|
463
|
+
raise ConfigError.new, "#{pkg.name} has no VCS, but is not checked out in #{pkg.srcdir}"
|
401
464
|
end
|
402
465
|
|
403
466
|
Rake::Task["#{pkg.name}-import"].invoke
|
404
467
|
manifest.load_package_manifest(pkg.name)
|
468
|
+
pkg.resolve_optional_dependencies
|
469
|
+
verify_package_availability(pkg.name)
|
405
470
|
end
|
406
471
|
|
407
472
|
current_packages.each do |pkg|
|
@@ -496,6 +561,7 @@ module Autoproj
|
|
496
561
|
def self.check?; !!@check end
|
497
562
|
def self.manifest_update?; !!@manifest_update end
|
498
563
|
def self.only_config?; !!@only_config end
|
564
|
+
def self.randomize_layout?; !!@randomize_layout end
|
499
565
|
def self.update_os_dependencies?
|
500
566
|
# Check if the mode disables osdeps anyway ...
|
501
567
|
if !@update_os_dependencies.nil? && !@update_os_dependencies
|
@@ -515,7 +581,7 @@ module Autoproj
|
|
515
581
|
def self.partial_build?; !!@partial_build end
|
516
582
|
def self.mail_config; @mail_config || Hash.new end
|
517
583
|
def self.update_packages?; @mode == "update" || @mode == "envsh" || build? end
|
518
|
-
def self.update_envsh?; @mode == "envsh" || build? end
|
584
|
+
def self.update_envsh?; @mode == "envsh" || build? || @mode == "update" end
|
519
585
|
def self.build?; @mode =~ /build/ end
|
520
586
|
def self.doc?; @mode == "doc" end
|
521
587
|
def self.snapshot?; @mode == "snapshot" end
|
@@ -531,7 +597,7 @@ module Autoproj
|
|
531
597
|
end
|
532
598
|
end
|
533
599
|
def self.list_newest?; @list_newest end
|
534
|
-
def self.parse_arguments(args)
|
600
|
+
def self.parse_arguments(args, with_mode = true)
|
535
601
|
@only_status = false
|
536
602
|
@only_local = false
|
537
603
|
@show_osdeps = false
|
@@ -680,6 +746,10 @@ where 'mode' is one of:
|
|
680
746
|
opts.on("--local", "for status, do not access the network") do
|
681
747
|
@only_local = true
|
682
748
|
end
|
749
|
+
opts.on('--randomize-layout', 'in build and full-build, generate a random layout') do
|
750
|
+
@randomize_layout = true
|
751
|
+
Autoproj.change_option('randomize_layout', true)
|
752
|
+
end
|
683
753
|
|
684
754
|
opts.on("--verbose", "verbose output") do
|
685
755
|
Autoproj.verbose = true
|
@@ -722,14 +792,16 @@ where 'mode' is one of:
|
|
722
792
|
parser.parse!(args)
|
723
793
|
@mail_config = mail_config
|
724
794
|
|
725
|
-
|
726
|
-
|
727
|
-
|
728
|
-
|
729
|
-
|
730
|
-
|
731
|
-
|
732
|
-
|
795
|
+
if with_mode
|
796
|
+
@mode = args.shift
|
797
|
+
unknown_mode = catch(:unknown) do
|
798
|
+
handle_mode(@mode, args)
|
799
|
+
end
|
800
|
+
if unknown_mode
|
801
|
+
STDERR.puts "unknown mode #{@mode}"
|
802
|
+
STDERR.puts "run autoproj --help for more documentation"
|
803
|
+
exit(1)
|
804
|
+
end
|
733
805
|
end
|
734
806
|
|
735
807
|
selection = args.dup
|
@@ -912,8 +984,8 @@ where 'mode' is one of:
|
|
912
984
|
console = Autoproj.console
|
913
985
|
|
914
986
|
sources = Autoproj.manifest.each_configuration_source.
|
915
|
-
map do |vcs, text_name,
|
916
|
-
Autoproj::Manifest.create_autobuild_package(vcs, text_name,
|
987
|
+
map do |vcs, text_name, local_dir|
|
988
|
+
Autoproj::Manifest.create_autobuild_package(vcs, text_name, local_dir)
|
917
989
|
end
|
918
990
|
|
919
991
|
if !sources.empty?
|
@@ -1010,7 +1082,7 @@ where 'mode' is one of:
|
|
1010
1082
|
|
1011
1083
|
FileUtils.mv config_dir, backup_name
|
1012
1084
|
end
|
1013
|
-
Autoproj::Manifest.
|
1085
|
+
Autoproj::Manifest.update_package_set(vcs, "autoproj main configuration", config_dir)
|
1014
1086
|
|
1015
1087
|
# Now write it in the config file
|
1016
1088
|
File.open(File.join(Autoproj.config_dir, "config.yml"), "a") do |io|
|
@@ -1035,7 +1107,7 @@ manifest_source:
|
|
1035
1107
|
|
1036
1108
|
def self.bootstrap(*args)
|
1037
1109
|
if File.exists?(File.join("autoproj", "manifest"))
|
1038
|
-
raise ConfigError, "this installation is already bootstrapped. Remove the autoproj directory if it is not the case"
|
1110
|
+
raise ConfigError.new, "this installation is already bootstrapped. Remove the autoproj directory if it is not the case"
|
1039
1111
|
end
|
1040
1112
|
|
1041
1113
|
require 'set'
|
@@ -1096,7 +1168,7 @@ manifest_source:
|
|
1096
1168
|
manifest_data =
|
1097
1169
|
begin open(manifest_url) { |file| file.read }
|
1098
1170
|
rescue
|
1099
|
-
raise ConfigError, "cannot read #{manifest_url}, did you mean 'autoproj bootstrap VCSTYPE #{manifest_url}' ?"
|
1171
|
+
raise ConfigError.new, "cannot read #{manifest_url}, did you mean 'autoproj bootstrap VCSTYPE #{manifest_url}' ?"
|
1100
1172
|
end
|
1101
1173
|
|
1102
1174
|
File.open(File.join(Autoproj.config_dir, "manifest"), "w") do |io|
|
@@ -1109,6 +1181,8 @@ manifest_source:
|
|
1109
1181
|
do_switch_config(false, type, url, *options)
|
1110
1182
|
end
|
1111
1183
|
|
1184
|
+
Autoproj.save_config
|
1185
|
+
|
1112
1186
|
# Finally, generate an env.sh script
|
1113
1187
|
File.open('env.sh', 'w') do |io|
|
1114
1188
|
io.write <<-EOSHELL
|