autoproj 1.2.6 → 1.3.0
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 +4 -0
- data/Manifest.txt +1 -0
- data/README.txt +32 -9
- data/bin/autoproj +225 -176
- data/doc/guide/src/autobuild.page +1 -1
- data/doc/guide/src/customization.page +5 -5
- data/doc/guide/src/error_messages.page +16 -0
- data/doc/guide/src/index.page +32 -9
- data/doc/guide/src/source_yml.page +38 -17
- data/doc/guide/src/structure.page +1 -1
- data/lib/autoproj/autobuild.rb +6 -0
- data/lib/autoproj/default.osdeps +6 -0
- data/lib/autoproj/manifest.rb +147 -42
- data/lib/autoproj/osdeps.rb +16 -7
- data/lib/autoproj/system.rb +8 -2
- data/lib/autoproj/version.rb +1 -1
- data/samples/autoproj/manifest +5 -1
- metadata +3 -2
@@ -54,7 +54,7 @@ cmake_package "package_name" do |pkg|
|
|
54
54
|
end
|
55
55
|
{coderay}
|
56
56
|
|
57
|
-
The
|
57
|
+
The <tt>doc_dir</tt> assignment above is needed if the package installs its documentation
|
58
58
|
elsewhere than "doc".
|
59
59
|
|
60
60
|
Defining dependencies
|
@@ -65,7 +65,7 @@ Removing packages from the build
|
|
65
65
|
--------------------------------
|
66
66
|
Instead of having to list all packages that you do want to build, it is possible
|
67
67
|
to list the packages that you don't want to build. Simply list them in the
|
68
|
-
<tt>
|
68
|
+
<tt>exclude_packages</tt> section of the manifest file. In the following example, all
|
69
69
|
of the rubim.orocos package set will be built *but* the pocosim-log package.
|
70
70
|
|
71
71
|
{coderay:: yaml}
|
@@ -81,7 +81,7 @@ Using packages that are already installed
|
|
81
81
|
|
82
82
|
If some packages are already installed elsewhere, and you want to use that
|
83
83
|
version instead of the one listed in the package sets, list them in the
|
84
|
-
<tt>
|
84
|
+
<tt>ignore_packages</tt> section of the manifest. In the following example, the
|
85
85
|
<tt>orocos/rtt</tt> package will *not* be built by autoproj.
|
86
86
|
|
87
87
|
{coderay:: yaml}
|
@@ -95,9 +95,9 @@ ignore_packages:
|
|
95
95
|
- orocos/rtt
|
96
96
|
{coderay}
|
97
97
|
|
98
|
-
This differs from the <tt>
|
99
|
-
<tt>
|
100
|
-
them, while packages in <tt>
|
98
|
+
This differs from the <tt>exclude_packages</tt> mechanism: packages listed in
|
99
|
+
<tt>ignore_packages</tt> are assumed to be present even though autoproj does not manage
|
100
|
+
them, while packages in <tt>exclude_packages</tt> are assumed to be absent and therefore
|
101
101
|
issue an error if another package in the installation depend on them.
|
102
102
|
|
103
103
|
Local overrides of version control information
|
@@ -0,0 +1,16 @@
|
|
1
|
+
---
|
2
|
+
title: Understanding autoproj error messages
|
3
|
+
sort_info: 800
|
4
|
+
---
|
5
|
+
|
6
|
+
I know nothing about a prepackaged package called 'XXXX', ...
|
7
|
+
------------------------------------------
|
8
|
+
_Short explanation_: an OS dependency is listed by one of the packages, but no
|
9
|
+
definition exists in one of the osdeps files.
|
10
|
+
|
11
|
+
_Long explanation_: XXXX is listed as an operating system dependency by one of
|
12
|
+
the packages that you requested to build. Two solutions: (i) the package should
|
13
|
+
*not* depend on it, and you should modify the package's manifest.xml file. (ii)
|
14
|
+
the package should depend on it and you should list the OS package in [the
|
15
|
+
relevant osdeps file](osdeps.html)
|
16
|
+
|
data/doc/guide/src/index.page
CHANGED
@@ -32,14 +32,16 @@ Components of an Autoproj installation
|
|
32
32
|
-------------------------------------
|
33
33
|
A autoproj installation is seeded by _package sets_. A package set is a local or remote
|
34
34
|
directory in which there is:
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
*
|
40
|
-
packages
|
41
|
-
|
42
|
-
|
35
|
+
|
36
|
+
* a list of available packages, and information on how to build these packages.
|
37
|
+
This list, and the build information, are Ruby scripts that use the autobuild
|
38
|
+
API. [More ...](autobuild.html)
|
39
|
+
* version control information: where to get the source code for each of the
|
40
|
+
packages defined in the set.
|
41
|
+
|
42
|
+
Then, an autoproj configuration is simply a list of package sets (i.e. a list of
|
43
|
+
packages that are available to build), and a file that selects which packages
|
44
|
+
should be built. This file is the <tt>manifest</tt>.
|
43
45
|
|
44
46
|
Bootstrapping
|
45
47
|
-------------
|
@@ -59,7 +61,28 @@ The canonical way is the following:
|
|
59
61
|
ruby autoproj\_bootstrap
|
60
62
|
{.cmdline}
|
61
63
|
|
62
|
-
* follow the instructions printed by the script
|
64
|
+
* follow the instructions printed by the script<tt>manifest</tt>.
|
65
|
+
|
66
|
+
Additionally, if you are given a reference to a source code repository in which
|
67
|
+
an autoproj configuration is stored (i.e. a directory in which a manifest is
|
68
|
+
present), you can bootstrap this configuration directly:
|
69
|
+
|
70
|
+
wget http://doudou.github.com/autoproj/autoproj\_bootstrap <br />
|
71
|
+
ruby autoproj\_bootstrap VCS
|
72
|
+
{.cmdline}
|
73
|
+
|
74
|
+
For instance, to build all packages made available by the RubyInMotion project,
|
75
|
+
do
|
76
|
+
|
77
|
+
wget http://doudou.github.com/autoproj/autoproj\_bootstrap <br />
|
78
|
+
ruby autoproj\_bootstrap git git://github.com/doudou/rubim.all.git
|
79
|
+
{.cmdline}
|
80
|
+
|
81
|
+
Additional options can be given for the version control system. For instance,
|
82
|
+
|
83
|
+
wget http://doudou.github.com/autoproj/autoproj\_bootstrap <br />
|
84
|
+
ruby autoproj\_bootstrap git git://github.com/doudou/rubim.all.git branch=stable
|
85
|
+
{.cmdline}
|
63
86
|
|
64
87
|
Software packages in Autoproj
|
65
88
|
-----------------------------
|
@@ -15,7 +15,7 @@ Starting a new package set
|
|
15
15
|
Create a subdirectory in autoproj/ and add a source.yml file that looks like:
|
16
16
|
|
17
17
|
{coderay:: yaml}
|
18
|
-
name my_package_set_name
|
18
|
+
name: my_package_set_name
|
19
19
|
{coderay}
|
20
20
|
|
21
21
|
Et voila ! You have a new empty package set
|
@@ -40,7 +40,13 @@ orogen_package "my/package" # for orogen packages
|
|
40
40
|
The package name will be used to refer to this particular package later on --
|
41
41
|
especially for version control definition. If subdirectories are used, like "my"
|
42
42
|
in the above example, the package source will be checked out and built in the
|
43
|
-
corresponding subdirectory.
|
43
|
+
corresponding subdirectory. For instance, with
|
44
|
+
|
45
|
+
{coderay:: ruby}
|
46
|
+
cmake_package "drivers/hokuyo"
|
47
|
+
{coderay}
|
48
|
+
|
49
|
+
the hokuyo driver will _always_ be built in a <tt>drivers/</tt> subdirectory.
|
44
50
|
|
45
51
|
Now that the package is declared, we need to add version control information to
|
46
52
|
the source.yml file. This needs to be done in the version\_control section of
|
@@ -62,6 +68,14 @@ version_control:
|
|
62
68
|
url: svn+ssh://svnhosting.com/blabla/trunk/my/package
|
63
69
|
{coderay}
|
64
70
|
|
71
|
+
For testing purposes, it is possible to tell autoproj to *not* take into account
|
72
|
+
any VCS information:
|
73
|
+
|
74
|
+
{coderay:: yaml}
|
75
|
+
version_control:
|
76
|
+
- my/package: none
|
77
|
+
{coderay}
|
78
|
+
|
65
79
|
The remaining of this page is a more in-depth description of this process.
|
66
80
|
|
67
81
|
Autobuild scripts
|
@@ -107,9 +121,14 @@ The name field gives a name for the set. It is arbitrary, but the guideline
|
|
107
121
|
is to give a name that is java-like for namespaces, i.e. origin.name.
|
108
122
|
|
109
123
|
The <tt>constants:</tt> section lists values that can be reused for different
|
110
|
-
packages. Autoproj defines
|
111
|
-
|
112
|
-
|
124
|
+
packages. Autoproj defines two constants:
|
125
|
+
|
126
|
+
* HOME is the user's home directory,
|
127
|
+
* PACKAGE is the actual package name, useful when using wildcards in package
|
128
|
+
names (see below)
|
129
|
+
|
130
|
+
It is also possible to use configuration variables, that get asked to the user
|
131
|
+
during the build (see below).
|
113
132
|
|
114
133
|
Finally, the <tt>version_control:</tt> section describes how to import each
|
115
134
|
software package. Its general format is:
|
@@ -119,11 +138,10 @@ package_name:
|
|
119
138
|
url: repository_url
|
120
139
|
{coderay}
|
121
140
|
|
122
|
-
Where package\_name is a regular expression that matches the package name
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
"drivers/imu".
|
141
|
+
Where package\_name is a regular expression that matches the package name (for
|
142
|
+
instance, ".\*" will match all packages and "drivers/.\*" will match packages
|
143
|
+
whose name starts with 'drivers'). The package name is the one given to the
|
144
|
+
<tt>blabla_package</tt> stanza in the autobuild file.
|
127
145
|
|
128
146
|
For the git importer, one of 'branch' or 'tag' options can be provided as well:
|
129
147
|
{coderay:: yaml}
|
@@ -132,18 +150,18 @@ package_name:
|
|
132
150
|
tag: tag_to_stick_to # it is branch OR tag
|
133
151
|
{coderay}
|
134
152
|
|
135
|
-
The options are applied in order, meaning that the
|
136
|
-
lower
|
137
|
-
packages, and then override for specific packages:
|
153
|
+
The options are applied in order, meaning that the top entries will be overriden
|
154
|
+
by the lower ones. In general, one will have a ".\*" entry to give options for
|
155
|
+
all packages, and then override for specific packages:
|
138
156
|
|
139
157
|
{coderay:: yaml}
|
140
158
|
version_control:
|
141
|
-
- "modules/logger": # we don't follow master on this module
|
142
|
-
branch: imoby
|
143
|
-
|
144
159
|
- .*: # common options for all packages
|
145
160
|
type: git
|
146
161
|
url: $ROOT_DIR/$PACKAGE.git
|
162
|
+
|
163
|
+
- "modules/logger": # we don't follow master on this module
|
164
|
+
branch: imoby
|
147
165
|
{coderay}
|
148
166
|
|
149
167
|
Interaction between package sets definition files
|
@@ -179,13 +197,16 @@ where the option\_type field can either be "string" or "boolean".
|
|
179
197
|
|
180
198
|
Then, you can use the option\_name as an expansion in the source.yml file.
|
181
199
|
|
182
|
-
For instance,
|
200
|
+
For instance, at my lab we are using an share filesystem to store the git
|
201
|
+
repositories. Our project's init.rb file has the following option definition:
|
183
202
|
{coderay:: ruby}
|
184
203
|
configuration_option "MOUNT_POINT", "string",
|
185
204
|
:default => "$HOME/nfs",
|
186
205
|
:doc => "mount point of the NFS server"
|
187
206
|
{coderay}
|
188
207
|
|
208
|
+
And the source.yml uses it with:
|
209
|
+
|
189
210
|
{coderay:: yaml}
|
190
211
|
version_control:
|
191
212
|
".*":
|
@@ -34,7 +34,7 @@ generated to set up your shell for the use of the installed software.
|
|
34
34
|
|
35
35
|
Listing and adding package sets
|
36
36
|
-------------------------------
|
37
|
-
Package sets are listed in the <tt>
|
37
|
+
Package sets are listed in the <tt>package_sets</tt> section of
|
38
38
|
<tt>autoproj/manifest</tt> file. This section looks like this:
|
39
39
|
|
40
40
|
{coderay:: yaml}
|
data/lib/autoproj/autobuild.rb
CHANGED
data/lib/autoproj/default.osdeps
CHANGED
@@ -1,4 +1,6 @@
|
|
1
1
|
# The following definitions are needed to bootstrap autoproj
|
2
|
+
none: ignore
|
3
|
+
|
2
4
|
ruby:
|
3
5
|
debian,ubuntu:
|
4
6
|
- ruby1.8-dev
|
@@ -42,5 +44,9 @@ lsb_release:
|
|
42
44
|
debian,ubuntu: lsb-release
|
43
45
|
gentoo: sys-apps/lsb-release
|
44
46
|
|
47
|
+
archive:
|
48
|
+
debian,ubuntu: [tar, unzip]
|
49
|
+
gentoo: [app-arch/tar, app-arch/unzip]
|
50
|
+
|
45
51
|
# vim: expandtab
|
46
52
|
|
data/lib/autoproj/manifest.rb
CHANGED
@@ -95,7 +95,17 @@ module Autoproj
|
|
95
95
|
Autobuild.send(type, url, options)
|
96
96
|
end
|
97
97
|
|
98
|
-
def to_s
|
98
|
+
def to_s
|
99
|
+
if type == "none"
|
100
|
+
"none"
|
101
|
+
else
|
102
|
+
desc = "#{type}:#{url}"
|
103
|
+
if !options.empty?
|
104
|
+
desc = "#{desc} #{options.map { |key, value| "#{key}=#{value}" }.join(" ")}"
|
105
|
+
end
|
106
|
+
desc
|
107
|
+
end
|
108
|
+
end
|
99
109
|
end
|
100
110
|
|
101
111
|
def self.vcs_definition_to_hash(spec)
|
@@ -126,7 +136,7 @@ module Autoproj
|
|
126
136
|
# This method normalizes the three forms into a VCSDefinition object
|
127
137
|
def self.normalize_vcs_definition(spec)
|
128
138
|
spec = vcs_definition_to_hash(spec)
|
129
|
-
if !(spec[:type] && spec[:url])
|
139
|
+
if !(spec[:type] && (spec[:type] == 'none' || spec[:url]))
|
130
140
|
raise ConfigError, "the source specification #{spec.inspect} misses either the VCS type or an URL"
|
131
141
|
end
|
132
142
|
|
@@ -167,7 +177,9 @@ module Autoproj
|
|
167
177
|
# True if this source defines nothing
|
168
178
|
def empty?
|
169
179
|
!source_definition['version_control'] &&
|
170
|
-
!each_package.find { true }
|
180
|
+
!each_package.find { true } &&
|
181
|
+
!File.exists?(File.join(local_dir, "overrides.rb")) &&
|
182
|
+
!File.exists?(File.join(local_dir, "init.rb"))
|
171
183
|
end
|
172
184
|
|
173
185
|
# The directory in which data for this source will be checked out
|
@@ -342,16 +354,24 @@ module Autoproj
|
|
342
354
|
spec = { $1 => spec }
|
343
355
|
name = name.gsub(/ \w+$/, '')
|
344
356
|
end
|
357
|
+
|
358
|
+
if spec.respond_to?(:to_str)
|
359
|
+
if spec == "none"
|
360
|
+
spec = { :type => "none" }
|
361
|
+
else
|
362
|
+
raise ConfigError, "invalid VCS specification '#{name}: #{spec}'"
|
363
|
+
end
|
364
|
+
end
|
345
365
|
end
|
346
366
|
|
347
|
-
if Regexp.new(name) =~ package_name
|
367
|
+
if Regexp.new("^" + name) =~ package_name
|
348
368
|
vcs_spec = vcs_spec.merge(spec)
|
349
369
|
end
|
350
370
|
end
|
351
371
|
end
|
352
372
|
|
353
373
|
if !vcs_spec.empty?
|
354
|
-
expansions = Hash["PACKAGE" => package_name]
|
374
|
+
expansions = Hash["PACKAGE" => package_name, "PACKAGE_BASENAME" => File.basename(package_name)]
|
355
375
|
|
356
376
|
vcs_spec = expand(vcs_spec, expansions)
|
357
377
|
vcs_spec = Autoproj.vcs_definition_to_hash(vcs_spec)
|
@@ -407,7 +427,28 @@ module Autoproj
|
|
407
427
|
end
|
408
428
|
|
409
429
|
class Manifest
|
410
|
-
FakePackage = Struct.new :name, :srcdir
|
430
|
+
FakePackage = Struct.new :text_name, :name, :srcdir, :importer
|
431
|
+
class FakePackage
|
432
|
+
def autoproj_name; name end
|
433
|
+
def import
|
434
|
+
importer.import(self)
|
435
|
+
end
|
436
|
+
|
437
|
+
def progress(msg)
|
438
|
+
Autobuild.progress(msg % [text_name])
|
439
|
+
end
|
440
|
+
|
441
|
+
# Display a progress message, and later on update it with a progress
|
442
|
+
# value. %s in the string is replaced by the package name
|
443
|
+
def progress_with_value(msg)
|
444
|
+
Autobuild.progress_with_value(msg % [text_name])
|
445
|
+
end
|
446
|
+
|
447
|
+
def progress_value(value)
|
448
|
+
Autobuild.progress_value(value)
|
449
|
+
end
|
450
|
+
end
|
451
|
+
|
411
452
|
def self.load(file)
|
412
453
|
begin
|
413
454
|
data = YAML.load(File.read(file))
|
@@ -478,7 +519,7 @@ module Autoproj
|
|
478
519
|
#
|
479
520
|
# And honestly I don't think someone will have 20 000 package sets
|
480
521
|
done_something = false
|
481
|
-
each_source do |source|
|
522
|
+
each_source(false) do |source|
|
482
523
|
next if source_name && source.name != source_name
|
483
524
|
done_something = true
|
484
525
|
|
@@ -561,8 +602,6 @@ module Autoproj
|
|
561
602
|
return @sources.each(&block)
|
562
603
|
end
|
563
604
|
|
564
|
-
return if !data['package_sets']
|
565
|
-
|
566
605
|
# Load the local source first ...
|
567
606
|
local = LocalSource.new
|
568
607
|
if load_description
|
@@ -572,22 +611,27 @@ module Autoproj
|
|
572
611
|
end
|
573
612
|
if load_description
|
574
613
|
if !local.empty?
|
575
|
-
|
576
|
-
|
577
|
-
|
578
|
-
end
|
614
|
+
@sources = [local]
|
615
|
+
else
|
616
|
+
@sources = []
|
579
617
|
end
|
580
|
-
@sources ||= []
|
581
618
|
else
|
582
619
|
yield(local)
|
583
620
|
end
|
584
621
|
|
622
|
+
return if !data['package_sets']
|
623
|
+
|
585
624
|
data['package_sets'].each do |spec|
|
586
625
|
source = source_from_spec(spec, load_description)
|
587
626
|
if load_description
|
588
627
|
@sources << source
|
628
|
+
else
|
629
|
+
yield(source)
|
589
630
|
end
|
590
|
-
|
631
|
+
end
|
632
|
+
|
633
|
+
if load_description
|
634
|
+
@sources.each(&block)
|
591
635
|
end
|
592
636
|
end
|
593
637
|
|
@@ -611,36 +655,70 @@ module Autoproj
|
|
611
655
|
packages.each_value { |package, _| yield(package) }
|
612
656
|
end
|
613
657
|
|
614
|
-
|
615
|
-
|
616
|
-
|
617
|
-
|
658
|
+
# The VCS object for the main configuration itself
|
659
|
+
attr_reader :vcs
|
660
|
+
|
661
|
+
def each_configuration_source
|
662
|
+
if !block_given?
|
663
|
+
return enum_for(:each_configuration_source)
|
664
|
+
end
|
618
665
|
|
619
|
-
|
620
|
-
|
621
|
-
|
666
|
+
if vcs
|
667
|
+
yield(vcs, "autoproj main configuration", "autoproj_config", Autoproj.config_dir)
|
668
|
+
end
|
669
|
+
|
670
|
+
each_remote_source(false) do |source|
|
671
|
+
yield(source.vcs, source.name || source.vcs.url, source.automatic_name, source.local_dir)
|
672
|
+
end
|
673
|
+
self
|
622
674
|
end
|
623
675
|
|
624
|
-
|
625
|
-
def self.import_whole_installation(vcs, into)
|
676
|
+
def self.create_autobuild_package(vcs, text_name, pkg_name, into)
|
626
677
|
importer = vcs.create_autobuild_importer
|
627
|
-
return if !importer # updates
|
628
|
-
|
629
|
-
|
678
|
+
return if !importer # updates have been disabled by using the 'none' type
|
679
|
+
|
680
|
+
fake_package = FakePackage.new(text_name, pkg_name, into)
|
681
|
+
fake_package.importer = importer
|
682
|
+
fake_package
|
683
|
+
|
684
|
+
rescue Autobuild::ConfigException => e
|
685
|
+
raise ConfigError, "cannot import #{name}: #{e.message}", e.backtrace
|
686
|
+
end
|
687
|
+
|
688
|
+
def self.update_source(vcs, text_name, pkg_name, into)
|
689
|
+
fake_package = create_autobuild_package(vcs, text_name, pkg_name, into)
|
690
|
+
fake_package.import
|
691
|
+
|
630
692
|
rescue Autobuild::ConfigException => e
|
631
|
-
raise ConfigError, "cannot import
|
693
|
+
raise ConfigError, "cannot import #{name}: #{e.message}", e.backtrace
|
632
694
|
end
|
633
695
|
|
634
696
|
def update_yourself
|
635
|
-
Manifest.
|
697
|
+
Manifest.update_source(vcs, "autoproj main configuration", "autoproj_conf", Autoproj.config_dir)
|
636
698
|
end
|
637
699
|
|
638
700
|
def update_remote_sources
|
639
701
|
# Iterate on the remote sources, without loading the source.yml
|
640
702
|
# file (we're not ready for that yet)
|
641
703
|
each_remote_source(false) do |source|
|
642
|
-
Manifest.
|
704
|
+
Manifest.update_source(source.vcs, source.name || source.vcs.url, source.automatic_name, source.local_dir)
|
705
|
+
end
|
706
|
+
end
|
707
|
+
|
708
|
+
def importer_definition_for(package_name, package_source = nil)
|
709
|
+
if !package_source
|
710
|
+
_, package_source, _ = packages.values.find { |pkg, pkg_source, _| pkg.name == package_name }
|
711
|
+
end
|
712
|
+
|
713
|
+
each_source.each do |source|
|
714
|
+
vcs = source.importer_definition_for(package_name)
|
715
|
+
if vcs
|
716
|
+
return vcs
|
717
|
+
elsif package_source.name == source.name
|
718
|
+
return
|
719
|
+
end
|
643
720
|
end
|
721
|
+
nil
|
644
722
|
end
|
645
723
|
|
646
724
|
# Sets up the package importers based on the information listed in
|
@@ -661,14 +739,7 @@ module Autoproj
|
|
661
739
|
# by S1
|
662
740
|
def load_importers
|
663
741
|
packages.each_value do |package, package_source, package_source_file|
|
664
|
-
vcs =
|
665
|
-
vcs = source.importer_definition_for(package.name)
|
666
|
-
if vcs
|
667
|
-
break(vcs)
|
668
|
-
elsif package_source.name == source.name
|
669
|
-
break
|
670
|
-
end
|
671
|
-
end
|
742
|
+
vcs = importer_definition_for(package.name, package_source)
|
672
743
|
|
673
744
|
if vcs
|
674
745
|
Autoproj.add_build_system_dependency vcs.type
|
@@ -728,7 +799,7 @@ module Autoproj
|
|
728
799
|
|
729
800
|
# Looks into the layout setup in the manifest, and yields each layout
|
730
801
|
# and sublayout in order
|
731
|
-
def each_package_set(selection, layout_name = '/', layout_def = data['layout'], &block)
|
802
|
+
def each_package_set(selection = nil, layout_name = '/', layout_def = data['layout'], &block)
|
732
803
|
if !layout_def
|
733
804
|
yield(layout_name, default_packages, default_packages)
|
734
805
|
return nil
|
@@ -756,6 +827,36 @@ module Autoproj
|
|
756
827
|
end
|
757
828
|
end
|
758
829
|
|
830
|
+
def in_sublayout(name, packages)
|
831
|
+
srcdir = File.join(Autoproj.root_dir, name)
|
832
|
+
prefix = File.join(Autoproj.build_dir, name)
|
833
|
+
logdir = File.join(prefix, "log")
|
834
|
+
Autobuild.logdir = logdir
|
835
|
+
packages.each do |pkg_name|
|
836
|
+
pkg = Autobuild::Package[pkg_name]
|
837
|
+
pkg.srcdir = File.join(srcdir, pkg_name)
|
838
|
+
pkg.prefix = prefix
|
839
|
+
pkg.logdir = logdir
|
840
|
+
end
|
841
|
+
|
842
|
+
yield
|
843
|
+
end
|
844
|
+
|
845
|
+
def handle_enabled_packages(selected_packages)
|
846
|
+
handled_packages = Set.new
|
847
|
+
each_package_set(selected_packages) do |name, packages, enabled_packages|
|
848
|
+
packages -= handled_packages
|
849
|
+
enabled_packages -= handled_packages
|
850
|
+
|
851
|
+
in_sublayout(name, packages) do
|
852
|
+
if !packages.empty?
|
853
|
+
yield(name, packages, enabled_packages)
|
854
|
+
end
|
855
|
+
end
|
856
|
+
handled_packages |= packages
|
857
|
+
end
|
858
|
+
end
|
859
|
+
|
759
860
|
def default_packages
|
760
861
|
names = if layout = data['layout']
|
761
862
|
layout_packages(layout, true)
|
@@ -821,16 +922,20 @@ module Autoproj
|
|
821
922
|
end
|
822
923
|
|
823
924
|
def install_os_dependencies(packages)
|
824
|
-
osdeps = known_os_packages
|
825
925
|
|
826
926
|
required_os_packages = Set.new
|
927
|
+
package_os_deps = Hash.new { |h, k| h[k] = Array.new }
|
827
928
|
packages.each do |pkg_name|
|
828
929
|
if manifest = package_manifests[pkg_name]
|
829
|
-
|
930
|
+
pkg_osdeps = manifest.each_os_dependency.to_set
|
931
|
+
pkg_osdeps.each do |osdep_name|
|
932
|
+
package_os_deps[osdep_name] << pkg_name
|
933
|
+
end
|
934
|
+
required_os_packages |= pkg_osdeps
|
830
935
|
end
|
831
936
|
end
|
832
937
|
|
833
|
-
|
938
|
+
known_os_packages.install(required_os_packages, package_os_deps)
|
834
939
|
end
|
835
940
|
|
836
941
|
# Package selection can be done in three ways:
|