autoproj 1.0.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 +2 -0
- data/Manifest.txt +37 -0
- data/README.txt +79 -0
- data/Rakefile +84 -0
- data/bin/autoproj +465 -0
- data/doc/guide/config.yaml +30 -0
- data/doc/guide/ext/init.rb +17 -0
- data/doc/guide/ext/previous_next.rb +40 -0
- data/doc/guide/ext/rdoc_links.rb +33 -0
- data/doc/guide/src/autobuild.page +111 -0
- data/doc/guide/src/autoproj_bootstrap +218 -0
- data/doc/guide/src/default.css +325 -0
- data/doc/guide/src/default.template +74 -0
- data/doc/guide/src/htmldoc.metainfo +4 -0
- data/doc/guide/src/images/bodybg.png +0 -0
- data/doc/guide/src/images/contbg.png +0 -0
- data/doc/guide/src/images/footerbg.png +0 -0
- data/doc/guide/src/images/gradient1.png +0 -0
- data/doc/guide/src/images/gradient2.png +0 -0
- data/doc/guide/src/index.page +79 -0
- data/doc/guide/src/source_yml.page +139 -0
- data/doc/guide/src/structure.page +153 -0
- data/lib/autoproj.rb +23 -0
- data/lib/autoproj/autobuild.rb +173 -0
- data/lib/autoproj/default.osdeps +12 -0
- data/lib/autoproj/manifest.rb +697 -0
- data/lib/autoproj/options.rb +137 -0
- data/lib/autoproj/osdeps.rb +134 -0
- data/lib/autoproj/system.rb +66 -0
- data/lib/autoproj/version.rb +3 -0
- data/samples/manifest +9 -0
- data/samples/manifest.xml +20 -0
- data/samples/osdeps.yml +65 -0
- data/test/data/test_manifest/autoproj/local/local.autobuild +0 -0
- data/test/data/test_manifest/autoproj/manifest +8 -0
- data/test/test_debian.rb +16 -0
- data/test/test_manifest.rb +40 -0
- metadata +199 -0
data/History.txt
ADDED
data/Manifest.txt
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
History.txt
|
2
|
+
Manifest.txt
|
3
|
+
README.txt
|
4
|
+
Rakefile
|
5
|
+
bin/autoproj
|
6
|
+
doc/guide/config.yaml
|
7
|
+
doc/guide/ext/init.rb
|
8
|
+
doc/guide/ext/previous_next.rb
|
9
|
+
doc/guide/ext/rdoc_links.rb
|
10
|
+
doc/guide/src/autobuild.page
|
11
|
+
doc/guide/src/autoproj_bootstrap
|
12
|
+
doc/guide/src/default.css
|
13
|
+
doc/guide/src/default.template
|
14
|
+
doc/guide/src/htmldoc.metainfo
|
15
|
+
doc/guide/src/images/bodybg.png
|
16
|
+
doc/guide/src/images/contbg.png
|
17
|
+
doc/guide/src/images/footerbg.png
|
18
|
+
doc/guide/src/images/gradient1.png
|
19
|
+
doc/guide/src/images/gradient2.png
|
20
|
+
doc/guide/src/index.page
|
21
|
+
doc/guide/src/source_yml.page
|
22
|
+
doc/guide/src/structure.page
|
23
|
+
lib/autoproj.rb
|
24
|
+
lib/autoproj/autobuild.rb
|
25
|
+
lib/autoproj/default.osdeps
|
26
|
+
lib/autoproj/manifest.rb
|
27
|
+
lib/autoproj/options.rb
|
28
|
+
lib/autoproj/osdeps.rb
|
29
|
+
lib/autoproj/system.rb
|
30
|
+
lib/autoproj/version.rb
|
31
|
+
samples/manifest
|
32
|
+
samples/manifest.xml
|
33
|
+
samples/osdeps.yml
|
34
|
+
test/data/test_manifest/autoproj/local/local.autobuild
|
35
|
+
test/data/test_manifest/autoproj/manifest
|
36
|
+
test/test_debian.rb
|
37
|
+
test/test_manifest.rb
|
data/README.txt
ADDED
@@ -0,0 +1,79 @@
|
|
1
|
+
What is Autoproj
|
2
|
+
----------------
|
3
|
+
Autoproj allows to easily install and maintain software that is under source
|
4
|
+
code form (usually from a version control system). It has been designed to support a
|
5
|
+
package-oriented development process, where each package can have its own
|
6
|
+
version control repository (think "distributed version control"). It also
|
7
|
+
provides an easy integration of the local operating system (Debian, Ubuntu,
|
8
|
+
Fedora, maybe MacOSX at some point).
|
9
|
+
|
10
|
+
This tool has been developped in the frame of the RubyInMotion project
|
11
|
+
(http://sites.google.com/site/rubyinmotion), to install robotics-related
|
12
|
+
software -- that is often bleeding edge. Unlike [the ROS build
|
13
|
+
system](http://ros.org), it is not bound to one build system, one VCS and one
|
14
|
+
integration framework. The philosophy behind autoproj
|
15
|
+
is:
|
16
|
+
* supports both CMake and autotools, and can be adapted to other tools
|
17
|
+
* supports different VCS: cvs, svn, git, plain tarballs.
|
18
|
+
* software packages are plain packages, meaning that they can be built and
|
19
|
+
installed /outside/ an autoproj tree, and are not tied *at all* to the
|
20
|
+
autoproj build system.
|
21
|
+
* leverage the actual OS package management system. Right now, only Debian-like
|
22
|
+
systems (like Ubuntu) are supported, simply because it is the only one I have
|
23
|
+
access to.
|
24
|
+
* handle code generation properly
|
25
|
+
|
26
|
+
It tries as much as possible to follow the lead of Willow Garage on the package
|
27
|
+
specification. More specifically, the package manifest files are common between
|
28
|
+
ROS package management and autoproj (more details in the following of this
|
29
|
+
document).
|
30
|
+
|
31
|
+
Components of an Autoproj installation
|
32
|
+
-------------------------------------
|
33
|
+
A autoproj installation is seeded by _package sets_. A package set is a local or remote
|
34
|
+
directory in which there is:
|
35
|
+
* autobuild scripts that describe what can be built and how it should be built.
|
36
|
+
These scripts an also list a set of configuration options that allow to
|
37
|
+
parametrize the build. In general, there should be only a limited number of
|
38
|
+
such options.
|
39
|
+
* a source.yml file which describes the package set itself, and where the software
|
40
|
+
packages are located (what version control system and what URL).
|
41
|
+
* optionally, a file that describe prepackaged dependencies that can be
|
42
|
+
installed by using the operating system package management system.
|
43
|
+
|
44
|
+
Bootstrapping
|
45
|
+
-------------
|
46
|
+
"Bootstrapping" means getting autoproj itself before it can work its magic ...
|
47
|
+
The canonical way is the following:
|
48
|
+
|
49
|
+
* install Ruby by yourself. On Debian or Ubuntu, this is done with
|
50
|
+
done with
|
51
|
+
|
52
|
+
sudo apt-get install wget ruby
|
53
|
+
{.cmdline}
|
54
|
+
|
55
|
+
* then, [download this script](autoproj_bootstrap) *in the directory where
|
56
|
+
you want to create an autoproj installation*, and run it. This can be done with
|
57
|
+
|
58
|
+
wget http://doudou.github.com/autoproj/autoproj\_bootstrap <br />
|
59
|
+
ruby autoproj\_bootstrap
|
60
|
+
{.cmdline}
|
61
|
+
|
62
|
+
* follow the instructions printed by the script above :)
|
63
|
+
|
64
|
+
Software packages in Autoproj
|
65
|
+
-----------------------------
|
66
|
+
In the realm of autoproj, a software package should be a self-contained build
|
67
|
+
system, that could be built outside of an autoproj tree. In practice, it means
|
68
|
+
that the package writer should leverage its build system (for instance, cmake)
|
69
|
+
to discover if the package dependencies are installed, and what are the
|
70
|
+
appropriate build options that should be given (for instance, include
|
71
|
+
directories or library names).
|
72
|
+
|
73
|
+
As a guideline, we recommend that inter-package dependencies are managed by
|
74
|
+
using pkg-config.
|
75
|
+
|
76
|
+
To describe the package, and more importantly to setup cross-package
|
77
|
+
dependencies, an optional manifest file can be added. This manifest file is
|
78
|
+
named manifest.xml. Its format is described later in this user's guide.
|
79
|
+
|
data/Rakefile
ADDED
@@ -0,0 +1,84 @@
|
|
1
|
+
$LOAD_PATH.unshift File.join(Dir.pwd, 'lib')
|
2
|
+
|
3
|
+
begin
|
4
|
+
require 'hoe'
|
5
|
+
namespace 'dist' do
|
6
|
+
config = Hoe.spec 'autoproj' do
|
7
|
+
self.developer "Sylvain Joyeux", "sylvain.joyeux@dfki.de"
|
8
|
+
|
9
|
+
self.rubyforge_name = 'autobuild'
|
10
|
+
self.summary = 'Easy installation and management of robotics software'
|
11
|
+
self.description = paragraphs_of('README.txt', 0..1).join("\n\n")
|
12
|
+
self.changes = paragraphs_of('History.txt', 0..1).join("\n\n")
|
13
|
+
|
14
|
+
extra_deps <<
|
15
|
+
['autobuild', '>= 1.3.0'] <<
|
16
|
+
['rmail', '>= 1.0.0'] <<
|
17
|
+
['utilrb', '>= 1.3.3'] <<
|
18
|
+
['nokogiri', '>= 1.3.3'] <<
|
19
|
+
['highline', '>= 1.5.0']
|
20
|
+
|
21
|
+
extra_dev_deps <<
|
22
|
+
['webgen', '>= 0.5.9'] <<
|
23
|
+
['rdoc', '>= 2.4.0']
|
24
|
+
end
|
25
|
+
|
26
|
+
desc "generate the bootstrap script"
|
27
|
+
task 'bootstrap' do
|
28
|
+
osdeps_code = File.read(File.join(Dir.pwd, 'lib', 'autoproj', 'osdeps.rb'))
|
29
|
+
bootstrap_code = File.read(File.join(Dir.pwd, 'bin', 'autoproj_bootstrap.in')).
|
30
|
+
gsub('OSDEPS_CODE', osdeps_code)
|
31
|
+
File.open(File.join(Dir.pwd, 'doc', 'guide', 'src', 'autoproj_bootstrap'), 'w') do |io|
|
32
|
+
io.write bootstrap_code
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
# Define our own documentation handling. Rake.clear_tasks is defined by Hoe
|
38
|
+
Rake.clear_tasks(/dist:(re|clobber_|)docs/)
|
39
|
+
|
40
|
+
rescue LoadError
|
41
|
+
STDERR.puts "cannot load the Hoe gem. Distribution is disabled"
|
42
|
+
rescue Exception => e
|
43
|
+
STDERR.puts "cannot load the Hoe gem, or Hoe fails. Distribution is disabled"
|
44
|
+
STDERR.puts "error message is: #{e.message}"
|
45
|
+
end
|
46
|
+
|
47
|
+
do_doc = begin
|
48
|
+
require 'webgen/webgentask'
|
49
|
+
require 'rdoc/task'
|
50
|
+
true
|
51
|
+
rescue LoadError => e
|
52
|
+
STDERR.puts "ERROR: cannot load webgen and/or RDoc, documentation generation disabled"
|
53
|
+
STDERR.puts "ERROR: #{e.message}"
|
54
|
+
end
|
55
|
+
|
56
|
+
if do_doc
|
57
|
+
task 'doc' => 'doc:all'
|
58
|
+
task 'clobber_docs' => 'doc:clobber'
|
59
|
+
task 'redocs' do
|
60
|
+
Rake::Task['doc:clobber'].invoke
|
61
|
+
Rake::Task['doc'].invoke
|
62
|
+
end
|
63
|
+
|
64
|
+
namespace 'doc' do
|
65
|
+
task 'all' => %w{guide api}
|
66
|
+
task 'clobber' => 'clobber_guide'
|
67
|
+
Webgen::WebgenTask.new('guide') do |website|
|
68
|
+
website.clobber_outdir = true
|
69
|
+
website.directory = File.join(Dir.pwd, 'doc', 'guide')
|
70
|
+
website.config_block = lambda do |config|
|
71
|
+
config['output'] = ['Webgen::Output::FileSystem', File.join(Dir.pwd, 'doc', 'html')]
|
72
|
+
end
|
73
|
+
end
|
74
|
+
task 'guide' => 'dist:bootstrap'
|
75
|
+
RDoc::Task.new("api") do |rdoc|
|
76
|
+
rdoc.rdoc_dir = 'doc/html/api'
|
77
|
+
rdoc.title = "oroGen"
|
78
|
+
rdoc.options << '--show-hash'
|
79
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
|
data/bin/autoproj
ADDED
@@ -0,0 +1,465 @@
|
|
1
|
+
#! /usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'autoproj'
|
4
|
+
require 'autoproj/autobuild'
|
5
|
+
require 'open-uri'
|
6
|
+
|
7
|
+
require 'highline'
|
8
|
+
include Autoproj
|
9
|
+
|
10
|
+
InputError = Autoproj::InputError
|
11
|
+
module Autoproj
|
12
|
+
@verbose = false
|
13
|
+
@console = HighLine.new
|
14
|
+
|
15
|
+
class << self
|
16
|
+
attr_accessor :verbose
|
17
|
+
attr_reader :console
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
# Some configuration variables
|
22
|
+
mail_config = Hash.new
|
23
|
+
only_update_sources = false
|
24
|
+
only_do_status = false
|
25
|
+
no_os_deps = false
|
26
|
+
debug = false
|
27
|
+
|
28
|
+
# Parse the configuration options
|
29
|
+
parser = OptionParser.new do |opts|
|
30
|
+
opts.banner = <<-EOBANNER
|
31
|
+
autoproj mode [options]
|
32
|
+
where 'mode' is one of:
|
33
|
+
build: import, build and install all selected packages
|
34
|
+
doc: generate and install documentation for packages that have some
|
35
|
+
update: only import/update packages, do not build them
|
36
|
+
status: displays the state of the packages w.r.t. their source VCS
|
37
|
+
bootstrap: starts a new autoproj installation. Usage:
|
38
|
+
autoproj bootstrap [manifest_url|source_vcs source_url opt1=value1 opt2=value2 ...]
|
39
|
+
|
40
|
+
list-sources: list all available sources
|
41
|
+
update-sources: update all remote sources, but do not build
|
42
|
+
|
43
|
+
Additional options:
|
44
|
+
EOBANNER
|
45
|
+
opts.on("--reconfigure", "re-ask all configuration options (build mode only)") do
|
46
|
+
Autoproj.reconfigure = true
|
47
|
+
end
|
48
|
+
opts.on("--no-update", "do not update already checked-out sources (build mode only)") do
|
49
|
+
Autobuild.do_update = false
|
50
|
+
end
|
51
|
+
|
52
|
+
opts.on("--no-osdeps", "do not install prepackaged dependencies") do
|
53
|
+
no_os_deps = true
|
54
|
+
end
|
55
|
+
|
56
|
+
opts.on("--verbose", "verbose output") do
|
57
|
+
Autoproj.verbose = true
|
58
|
+
Autobuild.verbose = true
|
59
|
+
Rake.application.options.trace = false
|
60
|
+
end
|
61
|
+
opts.on("--debug", "debugging output") do
|
62
|
+
Autoproj.verbose = true
|
63
|
+
Autobuild.verbose = true
|
64
|
+
Rake.application.options.trace = true
|
65
|
+
debug = true
|
66
|
+
end
|
67
|
+
opts.on('--nice NICE', Integer, 'nice the subprocesses to the given value') do |value|
|
68
|
+
Autobuild.nice = value
|
69
|
+
end
|
70
|
+
opts.on("-h", "--help", "Show this message") do
|
71
|
+
puts opts
|
72
|
+
exit
|
73
|
+
end
|
74
|
+
opts.on("--mail-from EMAIL", String, "From: field of the sent mails") do |from_email|
|
75
|
+
mail[:from] = from_email
|
76
|
+
end
|
77
|
+
opts.on("--mail-to EMAILS", String, "comma-separated list of emails to which the reports should be sent") do |emails|
|
78
|
+
mail[:to] ||= []
|
79
|
+
mail[:to] += emails.split(',')
|
80
|
+
end
|
81
|
+
opts.on("--mail-subject SUBJECT", String, "Subject: field of the sent mails") do |subject_email|
|
82
|
+
mail[:subject] = subject_email
|
83
|
+
end
|
84
|
+
opts.on("--mail-smtp HOSTNAME", String, " address of the mail server written as hostname[:port]") do |smtp|
|
85
|
+
raise "invalid SMTP specification #{smtp}" unless smtp =~ /^([^:]+)(?::(\d+))?$/
|
86
|
+
mail[:smtp] = $1
|
87
|
+
mail[:port] = Integer($2) if $2 && !$2.empty?
|
88
|
+
end
|
89
|
+
opts.on("--mail-only-errors", "send mail only on errors") do
|
90
|
+
mail[:only_errors] = true
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
args = ARGV.dup
|
95
|
+
parser.parse!(args)
|
96
|
+
mode = args.shift
|
97
|
+
selected_packages = args.dup
|
98
|
+
|
99
|
+
def color(*args)
|
100
|
+
Autoproj.console.color(*args)
|
101
|
+
end
|
102
|
+
|
103
|
+
def do_status(packages)
|
104
|
+
console = Autoproj.console
|
105
|
+
|
106
|
+
Autobuild::Reporting.report do
|
107
|
+
last_was_in_sync = false
|
108
|
+
packages.sort.each do |pkg|
|
109
|
+
pkg = Autobuild::Package[pkg]
|
110
|
+
|
111
|
+
if !pkg.importer.respond_to?(:status)
|
112
|
+
# This importer does not support status display
|
113
|
+
STDERR.puts color(" this package's importer does not support status display", :bold, :red)
|
114
|
+
next
|
115
|
+
end
|
116
|
+
|
117
|
+
lines = []
|
118
|
+
status = pkg.importer.status(pkg)
|
119
|
+
if status.uncommitted_code
|
120
|
+
lines << color(" contains uncommitted modifications", :red)
|
121
|
+
end
|
122
|
+
|
123
|
+
case status.status
|
124
|
+
when Autobuild::Importer::Status::UP_TO_DATE
|
125
|
+
if !status.uncommitted_code
|
126
|
+
if last_was_in_sync
|
127
|
+
STDERR.print ", #{pkg.name}"
|
128
|
+
else
|
129
|
+
STDERR.print pkg.name
|
130
|
+
end
|
131
|
+
last_was_in_sync = true
|
132
|
+
next
|
133
|
+
else
|
134
|
+
lines << color(" local and remote are in sync", :green)
|
135
|
+
end
|
136
|
+
when Autobuild::Importer::Status::ADVANCED
|
137
|
+
lines << color(" local contains #{status.local_commits.size} commit that remote does not have:", :magenta)
|
138
|
+
status.local_commits.each do |line|
|
139
|
+
lines << color(" #{line}", :magenta)
|
140
|
+
end
|
141
|
+
when Autobuild::Importer::Status::SIMPLE_UPDATE
|
142
|
+
lines << color(" remote contains #{status.remote_commits.size} commit that local does not have:", :magenta)
|
143
|
+
status.remote_commits.each do |line|
|
144
|
+
lines << color(" #{line}", :magenta)
|
145
|
+
end
|
146
|
+
when Autobuild::Importer::Status::NEEDS_MERGE
|
147
|
+
lines << color(" local and remote have diverged with respectively #{status.local_commits.size} and #{status.remote_commits.size} commits each", :magenta)
|
148
|
+
lines << " -- local commits --"
|
149
|
+
status.local_commits.each do |line|
|
150
|
+
lines << color(" #{line}", :magenta)
|
151
|
+
end
|
152
|
+
lines << " -- remote commits --"
|
153
|
+
status.remote_commits.each do |line|
|
154
|
+
lines << color(" #{line}", :magenta)
|
155
|
+
end
|
156
|
+
end
|
157
|
+
|
158
|
+
if last_was_in_sync
|
159
|
+
STDERR.puts color(": local and remote are in sync", :green)
|
160
|
+
end
|
161
|
+
|
162
|
+
last_was_in_sync = false
|
163
|
+
STDERR.print "#{pkg.name}:"
|
164
|
+
|
165
|
+
if lines.size == 1
|
166
|
+
STDERR.puts lines.first
|
167
|
+
else
|
168
|
+
STDERR.puts
|
169
|
+
STDERR.puts lines.join("\n")
|
170
|
+
end
|
171
|
+
end
|
172
|
+
if last_was_in_sync
|
173
|
+
STDERR.puts color(": local and remote are in sync", :green)
|
174
|
+
end
|
175
|
+
end
|
176
|
+
end
|
177
|
+
|
178
|
+
|
179
|
+
def do_bootstrap(*args)
|
180
|
+
if args.empty? # no argument, simply add a manifest template
|
181
|
+
sample_dir = File.expand_path(File.join("..", "samples"), File.dirname(__FILE__))
|
182
|
+
FileUtils.mkdir_p "autoproj"
|
183
|
+
manifest_data = File.read(File.join(sample_dir, "manifest"))
|
184
|
+
|
185
|
+
elsif args.size == 1 # must be a manifest file
|
186
|
+
manifest_url = args.first
|
187
|
+
STDERR.puts color("autoproj: downloading manifest file #{manifest_url}", :bold)
|
188
|
+
manifest_data = open(manifest_url) { |file| file.read }
|
189
|
+
|
190
|
+
else # must be a source definition
|
191
|
+
manifest_data = <<-EOF
|
192
|
+
sources:
|
193
|
+
- type: #{args.shift}
|
194
|
+
url: #{args.shift}
|
195
|
+
EOF
|
196
|
+
while !args.empty?
|
197
|
+
name, value = args.shift.split("=")
|
198
|
+
manifest_data << " #{name}: #{value}\n"
|
199
|
+
end
|
200
|
+
|
201
|
+
end
|
202
|
+
|
203
|
+
File.open(File.join(Autoproj.config_dir, "manifest"), "w") do |io|
|
204
|
+
io.write(manifest_data)
|
205
|
+
end
|
206
|
+
end
|
207
|
+
|
208
|
+
case mode
|
209
|
+
when "bootstrap"
|
210
|
+
# If there is no argument, We need one more argument. It is either a VCS type or a path to a
|
211
|
+
# manifest.
|
212
|
+
#
|
213
|
+
# In the first case, we create a new manifest and add the source given on
|
214
|
+
# the command line to it. In the second case, we simply use it as a
|
215
|
+
# manifest.
|
216
|
+
do_bootstrap(*args)
|
217
|
+
only_update_sources = true
|
218
|
+
|
219
|
+
when "build"
|
220
|
+
when "update"
|
221
|
+
Autobuild.do_build = false
|
222
|
+
when "status"
|
223
|
+
only_do_status = true
|
224
|
+
Autobuild.do_update = false
|
225
|
+
no_os_deps = true
|
226
|
+
when "update-sources"
|
227
|
+
only_update_sources = true
|
228
|
+
when "list-sources"
|
229
|
+
only_update_sources = true
|
230
|
+
Autobuild.do_update = false
|
231
|
+
|
232
|
+
when "doc"
|
233
|
+
Autobuild.do_update = false
|
234
|
+
Autobuild.do_doc = true
|
235
|
+
Autobuild.only_doc = true
|
236
|
+
else
|
237
|
+
puts parser
|
238
|
+
exit(1)
|
239
|
+
end
|
240
|
+
|
241
|
+
# Find the autoproj root dir
|
242
|
+
root_dir = Autoproj.root_dir
|
243
|
+
# Load user configuration
|
244
|
+
Autoproj.load_config
|
245
|
+
# Set the initial environment
|
246
|
+
Autoproj.set_initial_env
|
247
|
+
# Set up some important autobuild parameters
|
248
|
+
Autobuild.prefix = Autoproj.build_dir
|
249
|
+
Autobuild.srcdir = root_dir
|
250
|
+
Autobuild.doc_errors = false
|
251
|
+
Autobuild.do_doc = false
|
252
|
+
Autobuild::Reporting << Autoproj::Reporter.new
|
253
|
+
if mail_config[:to]
|
254
|
+
Autobuild::Reporting << MailReporter.new(mail_config)
|
255
|
+
end
|
256
|
+
|
257
|
+
|
258
|
+
Dir.chdir(root_dir)
|
259
|
+
begin
|
260
|
+
# Load the installation's manifest
|
261
|
+
manifest = Autoproj.manifest = Manifest.load(File.join('autoproj', 'manifest'))
|
262
|
+
source_os_dependencies = manifest.each_remote_source(false).
|
263
|
+
inject(Set.new) do |set, source|
|
264
|
+
set << source.vcs.type if !source.local?
|
265
|
+
end
|
266
|
+
|
267
|
+
# If we need to install some packages to import our remote sources, do it
|
268
|
+
if !no_os_deps && !source_os_dependencies.empty?
|
269
|
+
STDERR.puts color("autoproj: installing prepackaged dependencies to access the source definitions", :bold)
|
270
|
+
osdeps = manifest.known_os_packages
|
271
|
+
osdeps.install(source_os_dependencies)
|
272
|
+
end
|
273
|
+
|
274
|
+
# Update the remote sources if there are any
|
275
|
+
if manifest.has_remote_sources?
|
276
|
+
STDERR.puts color("autoproj: updating remote sources", :bold)
|
277
|
+
Autobuild::Reporting.report do
|
278
|
+
manifest.update_remote_sources
|
279
|
+
end
|
280
|
+
STDERR.puts
|
281
|
+
end
|
282
|
+
|
283
|
+
# If in verbose mode, or if we only update sources, list the sources
|
284
|
+
#
|
285
|
+
# Note that we can't have the Manifest class load the source.yml file, as it
|
286
|
+
# cannot resolve all constants. So we need to do it ourselves to get the
|
287
|
+
# name ...
|
288
|
+
if Autoproj.verbose || only_update_sources
|
289
|
+
sources = manifest.each_source(false).to_a
|
290
|
+
|
291
|
+
if sources.empty?
|
292
|
+
STDERR.puts color("autoproj: no sources defined in autoproj/manifest", :bold, :red)
|
293
|
+
else
|
294
|
+
STDERR.puts color("autoproj: available sources", :bold)
|
295
|
+
manifest.each_source(false) do |source|
|
296
|
+
source_yml = source.raw_description_file
|
297
|
+
STDERR.puts " #{source_yml['name']}"
|
298
|
+
if source.local?
|
299
|
+
STDERR.puts " local source in #{source.local_dir}"
|
300
|
+
else
|
301
|
+
STDERR.puts " vcs: #{source.vcs}, #{source.vcs.options.inspect}"
|
302
|
+
STDERR.puts " local: #{source.local_dir}"
|
303
|
+
end
|
304
|
+
end
|
305
|
+
end
|
306
|
+
end
|
307
|
+
if only_update_sources
|
308
|
+
exit(0)
|
309
|
+
end
|
310
|
+
|
311
|
+
# Load init.rb files. each_source must not load the source.yml file, as
|
312
|
+
# init.rb may define configuration options that are used there
|
313
|
+
manifest.each_source(false) do |source|
|
314
|
+
init_rb = File.join(source.local_dir, "init.rb")
|
315
|
+
if File.exists?(init_rb)
|
316
|
+
load init_rb
|
317
|
+
end
|
318
|
+
end
|
319
|
+
|
320
|
+
# Load the required autobuild definitions
|
321
|
+
STDERR.puts color("autoproj: loading build files and configuring build", :bold)
|
322
|
+
if !Autoproj.reconfigure?
|
323
|
+
STDERR.puts color("run 'autoproj --reconfigure' to change configuration values", :bold)
|
324
|
+
end
|
325
|
+
manifest.each_autobuild_file do |source, name|
|
326
|
+
Autoproj.import_autobuild_file source, name
|
327
|
+
end
|
328
|
+
|
329
|
+
# The user is asked for configuration values both during the manifest
|
330
|
+
# loading and the loading of autobuild files. Save it now.
|
331
|
+
Autoproj.save_config
|
332
|
+
|
333
|
+
# Now, load the package's importer configurations (from the various
|
334
|
+
# source.yml files)
|
335
|
+
manifest.load_importers
|
336
|
+
if Autoproj.verbose
|
337
|
+
# List defined packages, and in which autobuild files they are defined
|
338
|
+
STDERR.puts "Available packages:"
|
339
|
+
Autoproj.manifest.packages.each_value do |package, source, file|
|
340
|
+
STDERR.puts " #{package.name}: #{file} from #{source.name}"
|
341
|
+
end
|
342
|
+
end
|
343
|
+
|
344
|
+
# Create the build target from the manifest if the user did not provide an
|
345
|
+
# explicit one
|
346
|
+
if selected_packages.empty?
|
347
|
+
selected_packages = Autoproj.manifest.default_packages
|
348
|
+
end
|
349
|
+
if Autoproj.verbose
|
350
|
+
STDERR.puts "will install #{selected_packages.to_a.join(", ")}"
|
351
|
+
end
|
352
|
+
if selected_packages.empty? # no packages, terminate
|
353
|
+
STDERR.puts
|
354
|
+
STDERR.puts color("autoproj: no packages defined", :red)
|
355
|
+
exit 0
|
356
|
+
end
|
357
|
+
selected_packages = selected_packages.to_set
|
358
|
+
|
359
|
+
# Install prepackaged dependencies needed to import and build the packages
|
360
|
+
if !no_os_deps
|
361
|
+
STDERR.puts
|
362
|
+
STDERR.puts color("autoproj: installing prepackaged dependencies for build system & version control", :bold)
|
363
|
+
osdeps = manifest.known_os_packages
|
364
|
+
osdeps.install(Autoproj.build_system_dependencies - source_os_dependencies)
|
365
|
+
end
|
366
|
+
|
367
|
+
# Now starts a different stage of the whole build. Until now, we were
|
368
|
+
# working on the whole package set. Starting from now, we need to build the
|
369
|
+
# package sets based on the layout file
|
370
|
+
Autoproj.manifest.each_package_set(selected_packages) do |name, packages, enabled_packages|
|
371
|
+
srcdir = File.join(Autoproj.root_dir, name)
|
372
|
+
prefix = File.join(Autoproj.build_dir, name)
|
373
|
+
logdir = File.join(prefix, "log")
|
374
|
+
Autobuild.logdir = logdir
|
375
|
+
packages.each do |pkg_name|
|
376
|
+
pkg = Autobuild::Package[pkg_name]
|
377
|
+
pkg.srcdir = File.join(srcdir, pkg_name)
|
378
|
+
pkg.prefix = prefix
|
379
|
+
pkg.logdir = logdir
|
380
|
+
end
|
381
|
+
|
382
|
+
# We are doing a status, now is the right time
|
383
|
+
STDERR.puts
|
384
|
+
if only_do_status
|
385
|
+
do_status(packages)
|
386
|
+
next
|
387
|
+
end
|
388
|
+
|
389
|
+
|
390
|
+
# ... but build only the selected packages (and avoid display of
|
391
|
+
# progress messages if there is nothing to build)
|
392
|
+
if !enabled_packages.empty?
|
393
|
+
STDERR.puts
|
394
|
+
STDERR.puts color("autoproj: now building #{name}", :bold)
|
395
|
+
|
396
|
+
STDERR.puts color(" updating packages", :bold)
|
397
|
+
Autobuild::Reporting.report do
|
398
|
+
import_targets = enabled_packages.map { |pkg| "#{pkg}-import" }
|
399
|
+
task "autoproj-#{name}-import" => import_targets
|
400
|
+
Rake::Task["autoproj-#{name}-import"].invoke
|
401
|
+
end
|
402
|
+
|
403
|
+
# Load package manifests, apply dependencies to the autobuild definitions
|
404
|
+
# and install OS packages
|
405
|
+
manifest.load_package_manifests(packages)
|
406
|
+
if !no_os_deps
|
407
|
+
STDERR.puts color(" installing prepackaged dependencies", :bold)
|
408
|
+
manifest.install_os_dependencies
|
409
|
+
end
|
410
|
+
|
411
|
+
# Call the prepare target now, after we did the import *and* loaded
|
412
|
+
# the manifests
|
413
|
+
Autobuild::Reporting.report do
|
414
|
+
prepare_targets = enabled_packages.map { |pkg| "#{pkg}-prepare" }
|
415
|
+
task "autoproj-#{name}-prepare" => prepare_targets
|
416
|
+
Rake::Task["autoproj-#{name}-prepare"].invoke
|
417
|
+
end
|
418
|
+
|
419
|
+
# And now build
|
420
|
+
if Autobuild.only_doc
|
421
|
+
STDERR.puts color(" building and installing documentation", :bold)
|
422
|
+
else
|
423
|
+
STDERR.puts color(" building and installing packages", :bold)
|
424
|
+
end
|
425
|
+
|
426
|
+
Autobuild::Reporting.report do
|
427
|
+
Autobuild.apply(enabled_packages, "autoproj-#{name}")
|
428
|
+
Autobuild::Reporting.success
|
429
|
+
end
|
430
|
+
end
|
431
|
+
|
432
|
+
# Now call the prepare target for all packages as it may be useful for
|
433
|
+
# the rest of the builds and for the generation of the env.sh file
|
434
|
+
#
|
435
|
+
# Note that we don't really have to care about dependencies, but we do
|
436
|
+
# it anyway
|
437
|
+
old_update_flag = Autobuild.do_update
|
438
|
+
begin
|
439
|
+
Autobuild.do_update = false
|
440
|
+
Autobuild::Reporting.report do
|
441
|
+
prepare_targets = (packages - enabled_packages).map { |pkg_name| "#{pkg_name}-prepare" }
|
442
|
+
task "autoproj-#{name}-prepare" => prepare_targets
|
443
|
+
Rake::Task["autoproj-#{name}-prepare"].invoke
|
444
|
+
end
|
445
|
+
ensure
|
446
|
+
Autobuild.do_update = old_update_flag
|
447
|
+
end
|
448
|
+
|
449
|
+
Autoproj.export_env_sh(name)
|
450
|
+
end
|
451
|
+
|
452
|
+
rescue ConfigError => e
|
453
|
+
STDERR.puts
|
454
|
+
STDERR.puts color(e.message, :red, :bold)
|
455
|
+
if debug then raise
|
456
|
+
else exit 1
|
457
|
+
end
|
458
|
+
rescue Interrupt
|
459
|
+
STDERR.puts
|
460
|
+
STDERR.puts color("Interrupted by user", :red, :bold)
|
461
|
+
if debug then raise
|
462
|
+
else exit 1
|
463
|
+
end
|
464
|
+
end
|
465
|
+
|