autoproj 1.4.4 → 1.5.0
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +15 -0
- data/Manifest.txt +5 -1
- data/README.txt +1 -41
- data/Rakefile +1 -1
- data/bin/autoproj +62 -747
- data/doc/guide/src/autoproj_bootstrap +54 -9
- data/doc/guide/src/customization.page +5 -4
- data/doc/guide/src/index.page +1 -41
- data/doc/guide/src/overview.png +0 -0
- data/doc/guide/src/overview.svg +537 -0
- data/doc/guide/src/package_sets/autobuild.page +37 -13
- data/doc/guide/src/package_sets/importers.page +1 -1
- data/doc/guide/src/package_sets/manifest-xml.page +2 -2
- data/doc/guide/src/package_sets/osdeps.page +14 -9
- data/doc/guide/src/quick_start.page +110 -0
- data/doc/guide/src/{structure.page → writing_manifest.page} +47 -57
- data/lib/autoproj.rb +1 -0
- data/lib/autoproj/autobuild.rb +74 -32
- data/lib/autoproj/cmdline.rb +912 -0
- data/lib/autoproj/default.osdeps +12 -2
- data/lib/autoproj/manifest.rb +141 -88
- data/lib/autoproj/osdeps.rb +42 -7
- data/lib/autoproj/version.rb +1 -1
- metadata +90 -53
data/History.txt
CHANGED
@@ -1,3 +1,18 @@
|
|
1
|
+
= Version 1.5.0
|
2
|
+
* the "clean up this mess" release. Autoproj's main logic is now properly
|
3
|
+
split into separate methods instead of being all in a monolitic bin/autoproj
|
4
|
+
* autoproj build does not update by default anymore. This was a behaviour
|
5
|
+
change that was requested by quite a few users.
|
6
|
+
* OS dependencies and normal dependencies are unified. An OS dependency will
|
7
|
+
have priority, if one is available on the OS. Otherwise, an autoproj package
|
8
|
+
will be searched for.
|
9
|
+
* remote package sets have become first-class citizens. The package sets are
|
10
|
+
still checked out in .remotes/WEIRD_NAME, but they are then symlinked to
|
11
|
+
autoproj/remotes/package_set_name for manipulation and inspection.
|
12
|
+
* a lot of fixes related to partial builds and partial package selections
|
13
|
+
* fixed wrong generation of env.sh files in some cases (mostly related to
|
14
|
+
partial builds)
|
15
|
+
|
1
16
|
= Version 1.4.4
|
2
17
|
* really fix the bug mentioned in 1.4.3
|
3
18
|
|
data/Manifest.txt
CHANGED
@@ -21,14 +21,18 @@ doc/guide/src/images/gradient1.png
|
|
21
21
|
doc/guide/src/images/gradient2.png
|
22
22
|
doc/guide/src/index.page
|
23
23
|
doc/guide/src/manifest.xml
|
24
|
+
doc/guide/src/overview.png
|
25
|
+
doc/guide/src/overview.svg
|
24
26
|
doc/guide/src/package_sets/autobuild.page
|
25
27
|
doc/guide/src/package_sets/importers.page
|
26
28
|
doc/guide/src/package_sets/index.page
|
27
29
|
doc/guide/src/package_sets/manifest-xml.page
|
28
30
|
doc/guide/src/package_sets/osdeps.page
|
29
|
-
doc/guide/src/
|
31
|
+
doc/guide/src/quick_start.page
|
32
|
+
doc/guide/src/writing_manifest.page
|
30
33
|
lib/autoproj.rb
|
31
34
|
lib/autoproj/autobuild.rb
|
35
|
+
lib/autoproj/cmdline.rb
|
32
36
|
lib/autoproj/default.osdeps
|
33
37
|
lib/autoproj/manifest.rb
|
34
38
|
lib/autoproj/options.rb
|
data/README.txt
CHANGED
@@ -43,48 +43,8 @@ Each package definition includes:
|
|
43
43
|
* on what the package depends. This can be either another package built by
|
44
44
|
autoproj, or an operating system package.
|
45
45
|
|
46
|
-
See [this page](
|
46
|
+
See [this page](writing_manifest.html) for more information.
|
47
47
|
|
48
|
-
Bootstrapping
|
49
|
-
-------------
|
50
|
-
"Bootstrapping" means getting autoproj itself before it can work its magic ...
|
51
|
-
The canonical way is the following:
|
52
|
-
|
53
|
-
* install Ruby by yourself. On Debian or Ubuntu, this is done with
|
54
|
-
done with
|
55
|
-
|
56
|
-
sudo apt-get install wget ruby
|
57
|
-
{.cmdline}
|
58
|
-
|
59
|
-
* then, [download this script](autoproj_bootstrap) *in the directory where
|
60
|
-
you want to create an autoproj installation*, and run it. This can be done with
|
61
|
-
|
62
|
-
wget http://doudou.github.com/autoproj/autoproj\_bootstrap <br />
|
63
|
-
ruby autoproj\_bootstrap
|
64
|
-
{.cmdline}
|
65
|
-
|
66
|
-
* follow the instructions printed by the script<tt>manifest</tt>.
|
67
|
-
|
68
|
-
Additionally, if you are given a reference to a source code repository in which
|
69
|
-
an autoproj configuration is stored (i.e. a directory in which a manifest is
|
70
|
-
present), you can bootstrap this configuration directly:
|
71
|
-
|
72
|
-
wget http://doudou.github.com/autoproj/autoproj\_bootstrap <br />
|
73
|
-
ruby autoproj\_bootstrap VCS
|
74
|
-
{.cmdline}
|
75
|
-
|
76
|
-
For instance, to build all packages made available by the RubyInMotion project,
|
77
|
-
do
|
78
|
-
|
79
|
-
wget http://doudou.github.com/autoproj/autoproj\_bootstrap <br />
|
80
|
-
ruby autoproj\_bootstrap git git://github.com/doudou/rubim.all.git
|
81
|
-
{.cmdline}
|
82
|
-
|
83
|
-
Additional options can be given for the version control system. For instance,
|
84
|
-
|
85
|
-
wget http://doudou.github.com/autoproj/autoproj\_bootstrap <br />
|
86
|
-
ruby autoproj\_bootstrap git git://github.com/doudou/rubim.all.git branch=stable
|
87
|
-
{.cmdline}
|
88
48
|
|
89
49
|
Software packages in Autoproj
|
90
50
|
-----------------------------
|
data/Rakefile
CHANGED
data/bin/autoproj
CHANGED
@@ -8,6 +8,7 @@ end
|
|
8
8
|
require 'autoproj'
|
9
9
|
require 'autoproj/autobuild'
|
10
10
|
require 'open-uri'
|
11
|
+
require 'autoproj/cmdline'
|
11
12
|
|
12
13
|
require 'highline'
|
13
14
|
include Autoproj
|
@@ -23,351 +24,12 @@ module Autoproj
|
|
23
24
|
end
|
24
25
|
end
|
25
26
|
|
26
|
-
|
27
|
-
mail_config = Hash.new
|
28
|
-
only_update_sources = false
|
29
|
-
only_do_status = false
|
30
|
-
no_os_deps = false
|
31
|
-
force_re_build_with_depends = false
|
32
|
-
debug = false
|
33
|
-
|
34
|
-
# Parse the configuration options
|
35
|
-
parser = OptionParser.new do |opts|
|
36
|
-
opts.banner = <<-EOBANNER
|
37
|
-
autoproj mode [options]
|
38
|
-
where 'mode' is one of:
|
39
|
-
|
40
|
-
-- Build
|
41
|
-
build: import, build and install all packages that need it. A package or package
|
42
|
-
set name can be given, in which case only this package and its dependencies
|
43
|
-
will be taken into account. Example:
|
44
|
-
|
45
|
-
autoproj build drivers/hokuyo
|
46
|
-
|
47
|
-
fast-build: builds without updating and without considering OS dependencies
|
48
|
-
force-build: triggers all build commands, i.e. don't be lazy like in "build".
|
49
|
-
If packages are selected on the command line, only those packages
|
50
|
-
will be affected unless the --with-depends option is used.
|
51
|
-
rebuild: clean and then rebuild. If packages are selected on the command line,
|
52
|
-
only those packages will be affected unless the --with-depends option
|
53
|
-
is used.
|
54
|
-
doc: generate and install documentation for packages that have some
|
55
|
-
|
56
|
-
-- Status & Update
|
57
|
-
envsh: update the env.sh script
|
58
|
-
status: displays the state of the packages w.r.t. their source VCS
|
59
|
-
list-sets: list all available package sets
|
60
|
-
update: only import/update packages, do not build them
|
61
|
-
update-sets: update the package sets definitions, but not the packages themselves
|
62
|
-
|
63
|
-
-- Autoproj Configuration
|
64
|
-
bootstrap: starts a new autoproj installation. Usage:
|
65
|
-
autoproj bootstrap [manifest_url|source_vcs source_url opt1=value1 opt2=value2 ...]
|
66
|
-
switch-config: change where the configuration should be taken from. Syntax:
|
67
|
-
autoproj switch-config source_vcs source_url opt1=value1 opt2=value2 ...
|
68
|
-
|
69
|
-
For example:
|
70
|
-
autoproj switch-config git git://github.com/doudou/rubim-all.git branch=all
|
71
|
-
|
72
|
-
-- Additional options:
|
73
|
-
EOBANNER
|
74
|
-
opts.on("--reconfigure", "re-ask all configuration options (build modes only)") do
|
75
|
-
Autoproj.reconfigure = true
|
76
|
-
end
|
77
|
-
opts.on("--no-update", "do not update already checked-out packages (build mode only)") do
|
78
|
-
Autobuild.do_update = false
|
79
|
-
end
|
80
|
-
|
81
|
-
opts.on("--no-osdeps", "do not install prepackaged dependencies") do
|
82
|
-
no_os_deps = true
|
83
|
-
end
|
84
|
-
opts.on("--with-depends", "apply rebuild and force-build to both packages selected on the command line and their dependencies") do
|
85
|
-
force_re_build_with_depends = true
|
86
|
-
end
|
87
|
-
|
88
|
-
opts.on("--verbose", "verbose output") do
|
89
|
-
Autoproj.verbose = true
|
90
|
-
Autobuild.verbose = true
|
91
|
-
Rake.application.options.trace = false
|
92
|
-
end
|
93
|
-
opts.on("--debug", "debugging output") do
|
94
|
-
Autoproj.verbose = true
|
95
|
-
Autobuild.verbose = true
|
96
|
-
Rake.application.options.trace = true
|
97
|
-
debug = true
|
98
|
-
Autobuild.debug = true
|
99
|
-
end
|
100
|
-
opts.on('--nice NICE', Integer, 'nice the subprocesses to the given value') do |value|
|
101
|
-
Autobuild.nice = value
|
102
|
-
end
|
103
|
-
opts.on("-h", "--help", "Show this message") do
|
104
|
-
puts opts
|
105
|
-
exit
|
106
|
-
end
|
107
|
-
opts.on("--mail-from EMAIL", String, "From: field of the sent mails") do |from_email|
|
108
|
-
mail_config[:from] = from_email
|
109
|
-
end
|
110
|
-
opts.on("--mail-to EMAILS", String, "comma-separated list of emails to which the reports should be sent") do |emails|
|
111
|
-
mail_config[:to] ||= []
|
112
|
-
mail_config[:to] += emails.split(',')
|
113
|
-
end
|
114
|
-
opts.on("--mail-subject SUBJECT", String, "Subject: field of the sent mails") do |subject_email|
|
115
|
-
mail_config[:subject] = subject_email
|
116
|
-
end
|
117
|
-
opts.on("--mail-smtp HOSTNAME", String, " address of the mail server written as hostname[:port]") do |smtp|
|
118
|
-
raise "invalid SMTP specification #{smtp}" unless smtp =~ /^([^:]+)(?::(\d+))?$/
|
119
|
-
mail_config[:smtp] = $1
|
120
|
-
mail_config[:port] = Integer($2) if $2 && !$2.empty?
|
121
|
-
end
|
122
|
-
opts.on("--mail-only-errors", "send mail only on errors") do
|
123
|
-
mail_config[:only_errors] = true
|
124
|
-
end
|
125
|
-
end
|
126
|
-
|
127
|
-
args = ARGV.dup
|
128
|
-
parser.parse!(args)
|
129
|
-
mode = args.shift
|
130
|
-
selected_packages = args.dup
|
131
|
-
Autobuild::Reporting << Autoproj::Reporter.new
|
27
|
+
selected_packages = Autoproj::CmdLine.parse_arguments(ARGV.dup)
|
132
28
|
|
133
29
|
def color(*args)
|
134
30
|
Autoproj.console.color(*args)
|
135
31
|
end
|
136
32
|
|
137
|
-
def display_status(packages)
|
138
|
-
last_was_in_sync = false
|
139
|
-
|
140
|
-
packages.each do |pkg|
|
141
|
-
lines = []
|
142
|
-
|
143
|
-
if !pkg.importer.respond_to?(:status)
|
144
|
-
lines << color(" the #{pkg.importer.class.name.gsub(/.*::/, '')} importer does not support status display", :bold, :red)
|
145
|
-
elsif !File.directory?(pkg.srcdir)
|
146
|
-
lines << color(" is not imported yet", :magenta)
|
147
|
-
else
|
148
|
-
status = pkg.importer.status(pkg)
|
149
|
-
if status.uncommitted_code
|
150
|
-
lines << color(" contains uncommitted modifications", :red)
|
151
|
-
end
|
152
|
-
|
153
|
-
case status.status
|
154
|
-
when Autobuild::Importer::Status::UP_TO_DATE
|
155
|
-
if !status.uncommitted_code
|
156
|
-
if last_was_in_sync
|
157
|
-
STDERR.print ", #{pkg.autoproj_name}"
|
158
|
-
else
|
159
|
-
STDERR.print pkg.autoproj_name
|
160
|
-
end
|
161
|
-
last_was_in_sync = true
|
162
|
-
next
|
163
|
-
else
|
164
|
-
lines << color(" local and remote are in sync", :green)
|
165
|
-
end
|
166
|
-
when Autobuild::Importer::Status::ADVANCED
|
167
|
-
lines << color(" local contains #{status.local_commits.size} commit that remote does not have:", :magenta)
|
168
|
-
status.local_commits.each do |line|
|
169
|
-
lines << color(" #{line}", :magenta)
|
170
|
-
end
|
171
|
-
when Autobuild::Importer::Status::SIMPLE_UPDATE
|
172
|
-
lines << color(" remote contains #{status.remote_commits.size} commit that local does not have:", :magenta)
|
173
|
-
status.remote_commits.each do |line|
|
174
|
-
lines << color(" #{line}", :magenta)
|
175
|
-
end
|
176
|
-
when Autobuild::Importer::Status::NEEDS_MERGE
|
177
|
-
lines << color(" local and remote have diverged with respectively #{status.local_commits.size} and #{status.remote_commits.size} commits each", :magenta)
|
178
|
-
lines << " -- local commits --"
|
179
|
-
status.local_commits.each do |line|
|
180
|
-
lines << color(" #{line}", :magenta)
|
181
|
-
end
|
182
|
-
lines << " -- remote commits --"
|
183
|
-
status.remote_commits.each do |line|
|
184
|
-
lines << color(" #{line}", :magenta)
|
185
|
-
end
|
186
|
-
end
|
187
|
-
end
|
188
|
-
|
189
|
-
if last_was_in_sync
|
190
|
-
STDERR.puts color(": local and remote are in sync", :green)
|
191
|
-
end
|
192
|
-
|
193
|
-
last_was_in_sync = false
|
194
|
-
if pkg.respond_to?(:text_name)
|
195
|
-
STDERR.print "#{pkg.text_name}:"
|
196
|
-
else
|
197
|
-
STDERR.print "#{pkg.autoproj_name}:"
|
198
|
-
end
|
199
|
-
|
200
|
-
if lines.size == 1
|
201
|
-
STDERR.puts lines.first
|
202
|
-
else
|
203
|
-
STDERR.puts
|
204
|
-
STDERR.puts lines.join("\n")
|
205
|
-
end
|
206
|
-
end
|
207
|
-
if last_was_in_sync
|
208
|
-
STDERR.puts color(": local and remote are in sync", :green)
|
209
|
-
end
|
210
|
-
end
|
211
|
-
def do_status(packages)
|
212
|
-
console = Autoproj.console
|
213
|
-
|
214
|
-
sources = Autoproj.manifest.each_configuration_source.
|
215
|
-
map do |vcs, text_name, pkg_name, local_dir|
|
216
|
-
Autoproj::Manifest.create_autobuild_package(vcs, text_name, pkg_name, local_dir)
|
217
|
-
end
|
218
|
-
|
219
|
-
if !sources.empty?
|
220
|
-
STDERR.puts color("autoproj: displaying status of configuration", :bold)
|
221
|
-
display_status(sources)
|
222
|
-
STDERR.puts
|
223
|
-
end
|
224
|
-
|
225
|
-
|
226
|
-
STDERR.puts color("autoproj: displaying status of packages", :bold)
|
227
|
-
packages = packages.sort.map do |pkg_name|
|
228
|
-
Autobuild::Package[pkg_name]
|
229
|
-
end
|
230
|
-
display_status(packages)
|
231
|
-
|
232
|
-
end
|
233
|
-
|
234
|
-
def switch_config(*args)
|
235
|
-
Autoproj.load_config
|
236
|
-
if Autoproj.has_config_key?('manifest_source')
|
237
|
-
vcs = Autoproj.normalize_vcs_definition(Autoproj.user_config('manifest_source'))
|
238
|
-
end
|
239
|
-
|
240
|
-
if vcs && (vcs.type == args[0] && vcs.url == args[1])
|
241
|
-
# Don't need to do much: simply change the options and save the config
|
242
|
-
# file, the VCS handler will take care of the actual switching
|
243
|
-
else
|
244
|
-
# We will have to delete the current autoproj directory. Ask the user.
|
245
|
-
opt = Autoproj::BuildOption.new("delete current config", "boolean",
|
246
|
-
Hash[:default => "false",
|
247
|
-
:doc => "delete the current configuration ? (required to switch)"], nil)
|
248
|
-
|
249
|
-
return if !opt.ask(nil)
|
250
|
-
|
251
|
-
Dir.chdir(Autoproj.root_dir) do
|
252
|
-
do_switch_config(true, *args)
|
253
|
-
end
|
254
|
-
end
|
255
|
-
|
256
|
-
# And now save the options: note that we keep the current option set even
|
257
|
-
# though we switched configuration. This is not a problem as undefined
|
258
|
-
# options will not be reused
|
259
|
-
#
|
260
|
-
# TODO: cleanup the options to only keep the relevant ones
|
261
|
-
vcs_def = Hash['type' => args.shift, 'url' => args.shift]
|
262
|
-
args.each do |opt|
|
263
|
-
opt_name, opt_val = opt.split '='
|
264
|
-
vcs_def[opt_name] = opt_val
|
265
|
-
end
|
266
|
-
# Validate the option hash, just in case
|
267
|
-
Autoproj.normalize_vcs_definition(vcs_def)
|
268
|
-
# Save the new options
|
269
|
-
Autoproj.change_option('manifest_source', vcs_def, true)
|
270
|
-
Autoproj.save_config
|
271
|
-
end
|
272
|
-
|
273
|
-
def do_switch_config(delete_current, *args)
|
274
|
-
vcs_def = Hash.new
|
275
|
-
vcs_def[:type] = args.shift
|
276
|
-
vcs_def[:url] = args.shift
|
277
|
-
while !args.empty?
|
278
|
-
name, value = args.shift.split("=")
|
279
|
-
vcs_def[name] = value
|
280
|
-
end
|
281
|
-
|
282
|
-
vcs = Autoproj.normalize_vcs_definition(vcs_def)
|
283
|
-
|
284
|
-
# Install the OS dependencies required for this VCS
|
285
|
-
osdeps = Autoproj::OSDependencies.load_default
|
286
|
-
osdeps.install([vcs.type])
|
287
|
-
|
288
|
-
# Now check out the actual configuration
|
289
|
-
config_dir = File.join(Dir.pwd, "autoproj")
|
290
|
-
if delete_current
|
291
|
-
FileUtils.rm_rf config_dir
|
292
|
-
end
|
293
|
-
Autoproj::Manifest.update_source(vcs, "autoproj main configuration", 'autoproj_config', config_dir)
|
294
|
-
|
295
|
-
# Now write it in the config file
|
296
|
-
File.open(File.join(Autoproj.config_dir, "config.yml"), "a") do |io|
|
297
|
-
io.puts <<-EOTEXT
|
298
|
-
manifest_source:
|
299
|
-
type: #{vcs_def.delete(:type)}
|
300
|
-
url: #{vcs_def.delete(:url)}
|
301
|
-
#{vcs_def.map { |k, v| "#{k}: #{v}" }.join("\n ")}
|
302
|
-
EOTEXT
|
303
|
-
end
|
304
|
-
end
|
305
|
-
|
306
|
-
def do_bootstrap(*args)
|
307
|
-
if File.exists?(File.join("autoproj", "manifest"))
|
308
|
-
raise ConfigError, "this installation is already bootstrapped. Remove the autoproj directory if it is not the case"
|
309
|
-
end
|
310
|
-
Autobuild.logdir = File.join('build', 'log')
|
311
|
-
|
312
|
-
# Check if we are being called from another GEM_HOME. If it is the case,
|
313
|
-
# assume that we are bootstrapping from another installation directory and
|
314
|
-
# start by copying the .gems directory
|
315
|
-
if ENV['GEM_HOME'] && ENV['GEM_HOME'] =~ /\.gems\/?$/ && ENV['GEM_HOME'] != File.join(Dir.pwd, ".gems")
|
316
|
-
STDERR.puts "autoproj: reusing bootstrap from #{File.dirname(ENV['GEM_HOME'])}"
|
317
|
-
FileUtils.cp_r ENV['GEM_HOME'], ".gems"
|
318
|
-
ENV['GEM_HOME'] = File.join(Dir.pwd, ".gems")
|
319
|
-
|
320
|
-
require 'rbconfig'
|
321
|
-
ruby = RbConfig::CONFIG['RUBY_INSTALL_NAME']
|
322
|
-
exec ruby, $0, *ARGV
|
323
|
-
end
|
324
|
-
|
325
|
-
# If we are not getting the installation setup from a VCS, copy the template
|
326
|
-
# files
|
327
|
-
if args.empty? || args.size == 1
|
328
|
-
sample_dir = File.expand_path(File.join("..", "samples"), File.dirname(__FILE__))
|
329
|
-
FileUtils.cp_r File.join(sample_dir, "autoproj"), "autoproj"
|
330
|
-
end
|
331
|
-
|
332
|
-
if args.size == 1 # the user asks us to download a manifest
|
333
|
-
manifest_url = args.first
|
334
|
-
STDERR.puts color("autoproj: downloading manifest file #{manifest_url}", :bold)
|
335
|
-
manifest_data =
|
336
|
-
begin open(manifest_url) { |file| file.read }
|
337
|
-
rescue
|
338
|
-
raise ConfigError, "cannot read #{manifest_url}, did you mean 'autoproj bootstrap VCSTYPE #{manifest_url}' ?"
|
339
|
-
end
|
340
|
-
|
341
|
-
File.open(File.join(Autoproj.config_dir, "manifest"), "w") do |io|
|
342
|
-
io.write(manifest_data)
|
343
|
-
end
|
344
|
-
|
345
|
-
elsif args.size >= 2 # is a VCS definition for the manifest itself ...
|
346
|
-
do_switch_config(false, *args)
|
347
|
-
end
|
348
|
-
|
349
|
-
# Finally, generate an env.sh script
|
350
|
-
File.open('env.sh', 'w') do |io|
|
351
|
-
io.write <<-EOSHELL
|
352
|
-
export RUBYOPT=-rubygems
|
353
|
-
export GEM_HOME=#{Dir.pwd}/.gems
|
354
|
-
export PATH=$GEM_HOME/bin:$PATH
|
355
|
-
EOSHELL
|
356
|
-
end
|
357
|
-
|
358
|
-
STDERR.puts <<EOTEXT
|
359
|
-
|
360
|
-
add the following line at the bottom of your .bashrc:
|
361
|
-
source #{Dir.pwd}/env.sh
|
362
|
-
|
363
|
-
WARNING: autoproj will not work until your restart all
|
364
|
-
your consoles, or run the following in them:
|
365
|
-
$ source #{Dir.pwd}/env.sh
|
366
|
-
|
367
|
-
EOTEXT
|
368
|
-
|
369
|
-
end
|
370
|
-
|
371
33
|
def report(debug)
|
372
34
|
Autobuild::Reporting.report do
|
373
35
|
yield
|
@@ -388,72 +50,17 @@ rescue Interrupt
|
|
388
50
|
end
|
389
51
|
end
|
390
52
|
|
391
|
-
Autobuild.doc_errors = false
|
392
|
-
Autobuild.do_doc = false
|
393
|
-
|
394
53
|
Autoproj::OSDependencies.autodetect_ruby
|
395
54
|
|
396
55
|
# Find the autoproj root dir
|
397
|
-
report(debug) do
|
398
|
-
case mode
|
399
|
-
when "bootstrap"
|
400
|
-
# If there is no argument, We need one more argument. It is either a VCS type or a path to a
|
401
|
-
# manifest.
|
402
|
-
#
|
403
|
-
# In the first case, we create a new manifest and add the source given on
|
404
|
-
# the command line to it. In the second case, we simply use it as a
|
405
|
-
# manifest.
|
406
|
-
do_bootstrap(*args)
|
407
|
-
if args.empty?
|
408
|
-
# no package sets defined, we're done
|
409
|
-
exit(0)
|
410
|
-
end
|
411
|
-
only_update_sources = true
|
412
|
-
|
413
|
-
when "build"
|
414
|
-
when "force-build"
|
415
|
-
Autobuild.do_forced_build = true
|
416
|
-
when "rebuild"
|
417
|
-
Autobuild.do_rebuild = true
|
418
|
-
when "fast-build"
|
419
|
-
Autobuild.do_update = false
|
420
|
-
no_os_deps = true
|
421
|
-
when "update"
|
422
|
-
Autobuild.do_build = false
|
423
|
-
when "status"
|
424
|
-
only_do_status = true
|
425
|
-
Autobuild.do_update = false
|
426
|
-
no_os_deps = true
|
427
|
-
when "envsh"
|
428
|
-
Autobuild.do_build = false
|
429
|
-
Autobuild.do_update = false
|
430
|
-
no_os_deps = true
|
431
|
-
when "update-sets"
|
432
|
-
only_update_sources = true
|
433
|
-
when "list-sets"
|
434
|
-
only_update_sources = true
|
435
|
-
Autobuild.do_update = false
|
436
|
-
when "switch-config"
|
437
|
-
if switch_config(*args)
|
438
|
-
exit 0
|
439
|
-
else
|
440
|
-
exit 1
|
441
|
-
end
|
442
|
-
when "doc"
|
443
|
-
Autobuild.do_update = false
|
444
|
-
no_os_deps = true
|
445
|
-
Autobuild.do_doc = true
|
446
|
-
Autobuild.only_doc = true
|
447
|
-
else
|
448
|
-
puts parser
|
449
|
-
exit(1)
|
450
|
-
end
|
56
|
+
report(Autobuild.debug) do
|
451
57
|
|
452
|
-
# Expand directories in the selected_packages set
|
58
|
+
# Expand directories in the selected_packages set, before we chdir to the
|
59
|
+
# autoproj root
|
453
60
|
root_dir = Autoproj.root_dir
|
454
61
|
selected_packages.map! do |name|
|
455
62
|
if File.directory?(name)
|
456
|
-
File.expand_path(name)
|
63
|
+
File.expand_path(name)
|
457
64
|
else
|
458
65
|
name
|
459
66
|
end
|
@@ -461,380 +68,88 @@ report(debug) do
|
|
461
68
|
|
462
69
|
Dir.chdir(root_dir)
|
463
70
|
|
464
|
-
#
|
465
|
-
Autoproj.
|
466
|
-
|
467
|
-
|
468
|
-
|
469
|
-
|
470
|
-
end
|
471
|
-
end
|
472
|
-
|
473
|
-
# Set up some important autobuild parameters
|
474
|
-
Autoproj.env_inherit 'PATH', 'PKG_CONFIG_PATH', 'RUBYLIB', 'LD_LIBRARY_PATH'
|
475
|
-
Autoproj.env_set 'GEM_HOME', Autoproj.gem_home
|
476
|
-
Autoproj.env_add 'PATH', File.join(Autoproj.gem_home, 'bin')
|
477
|
-
Autoproj.env_set 'RUBYOPT', "-rubygems"
|
478
|
-
Autobuild.prefix = Autoproj.build_dir
|
479
|
-
Autobuild.srcdir = root_dir
|
480
|
-
Autobuild.logdir = File.join(Autobuild.prefix, 'log')
|
481
|
-
if mail_config[:to]
|
482
|
-
Autobuild::Reporting << Autobuild::MailReporter.new(mail_config)
|
483
|
-
end
|
484
|
-
|
485
|
-
|
486
|
-
ruby = RbConfig::CONFIG['RUBY_INSTALL_NAME']
|
487
|
-
if ruby != 'ruby'
|
488
|
-
bindir = File.join(Autoproj.build_dir, 'bin')
|
489
|
-
FileUtils.mkdir_p bindir
|
490
|
-
File.open(File.join(bindir, 'ruby'), 'w') do |io|
|
491
|
-
io.puts "#! /bin/sh"
|
492
|
-
io.puts "exec #{ruby} \"$@\""
|
493
|
-
end
|
494
|
-
FileUtils.chmod 0755, File.join(bindir, 'ruby')
|
495
|
-
|
496
|
-
Autoproj.env_add 'PATH', bindir
|
497
|
-
end
|
498
|
-
|
499
|
-
# First things first, see if we need to update ourselves
|
500
|
-
osdeps = Autoproj::OSDependencies.load_default
|
501
|
-
if osdeps.install(%w{autobuild autoproj})
|
502
|
-
# We updated autobuild or autoproj themselves ... Restart !
|
503
|
-
require 'rbconfig'
|
504
|
-
ruby = RbConfig::CONFIG['RUBY_INSTALL_NAME']
|
505
|
-
if mode == "bootstrap"
|
506
|
-
exec(ruby, $0, 'list-sets')
|
507
|
-
else
|
508
|
-
exec(ruby, $0, *ARGV)
|
509
|
-
end
|
510
|
-
end
|
511
|
-
|
512
|
-
manifest_path = File.join(Autoproj.config_dir, 'manifest')
|
513
|
-
# Load the installation's manifest a first time, to check if we should
|
514
|
-
# update it ... We assume that the OS dependencies for this VCS is already
|
515
|
-
# installed (i.e. that the user did not remove it)
|
516
|
-
manifest = Manifest.load(manifest_path)
|
517
|
-
if manifest.vcs && mode != "bootstrap"
|
518
|
-
manifest.update_yourself
|
519
|
-
manifest = Manifest.load(manifest_path)
|
520
|
-
end
|
521
|
-
Autoproj.manifest = manifest
|
522
|
-
|
523
|
-
source_os_dependencies = manifest.each_remote_source(false).
|
524
|
-
inject(Set.new) do |set, source|
|
525
|
-
set << source.vcs.type if !source.local?
|
526
|
-
end
|
527
|
-
|
528
|
-
# Update the remote sources if there are any
|
529
|
-
if manifest.has_remote_sources?
|
530
|
-
STDERR.puts color("autoproj: updating remote definitions of package sets", :bold)
|
531
|
-
# If we need to install some packages to import our remote sources, do it
|
532
|
-
if !no_os_deps
|
533
|
-
osdeps = manifest.known_os_packages
|
534
|
-
osdeps.install(source_os_dependencies)
|
535
|
-
end
|
536
|
-
|
537
|
-
manifest.update_remote_sources
|
538
|
-
STDERR.puts
|
539
|
-
end
|
540
|
-
|
541
|
-
# Load init.rb files. each_source must not load the source.yml file, as
|
542
|
-
# init.rb may define configuration options that are used there
|
543
|
-
manifest.each_source(false) do |source|
|
544
|
-
Autoproj.load_if_present(source, source.local_dir, "init.rb")
|
545
|
-
end
|
546
|
-
|
547
|
-
# Load the required autobuild definitions
|
548
|
-
STDERR.puts color("autoproj: loading ...", :bold)
|
549
|
-
if !Autoproj.reconfigure?
|
550
|
-
STDERR.puts color("run 'autoproj --reconfigure' to change configuration values", :bold)
|
551
|
-
end
|
552
|
-
manifest.each_autobuild_file do |source, name|
|
553
|
-
Autoproj.import_autobuild_file source, name
|
554
|
-
end
|
555
|
-
|
556
|
-
# Load the package's override files. each_source must not load the
|
557
|
-
# source.yml file, as init.rb may define configuration options that are used
|
558
|
-
# there
|
559
|
-
manifest.each_source(false).to_a.reverse.each do |source|
|
560
|
-
Autoproj.load_if_present(source, source.local_dir, "overrides.rb")
|
561
|
-
end
|
71
|
+
# Basic initialization
|
72
|
+
Autoproj::CmdLine.initialize
|
73
|
+
Autoproj::CmdLine.update_myself
|
74
|
+
Autoproj::CmdLine.update_configuration
|
75
|
+
Autoproj::CmdLine.load_configuration
|
76
|
+
manifest = Autoproj.manifest
|
562
77
|
|
563
|
-
#
|
564
|
-
#
|
565
|
-
manifest.load_importers
|
566
|
-
|
567
|
-
# Configuration is finished, so all relevant configuration options should
|
568
|
-
# have been asked to the user. Save it.
|
569
|
-
Autoproj.save_config
|
570
|
-
|
571
|
-
if Autoproj.verbose
|
572
|
-
# List defined packages, and in which autobuild files they are defined
|
573
|
-
STDERR.puts "Available packages:"
|
574
|
-
manifest.packages.each_value do |pkg|
|
575
|
-
STDERR.puts " #{pkg.autobuild.name}: #{pkg.file} from #{pkg.package_set.name}"
|
576
|
-
end
|
577
|
-
end
|
578
|
-
|
579
|
-
# If in verbose mode, or if we only update sources, list the sources
|
78
|
+
# Once thing left to do: handle the Autoproj.auto_update configuration
|
79
|
+
# parameter
|
580
80
|
#
|
581
|
-
#
|
582
|
-
#
|
583
|
-
#
|
584
|
-
if
|
585
|
-
|
586
|
-
|
587
|
-
if sources.empty?
|
588
|
-
STDERR.puts color("autoproj: no package sets defined in autoproj/manifest", :bold, :red)
|
589
|
-
else
|
590
|
-
STDERR.puts color("autoproj: available package sets", :bold)
|
591
|
-
manifest.each_source(false) do |source|
|
592
|
-
source_yml = source.raw_description_file
|
593
|
-
STDERR.puts " #{source_yml['name']}"
|
594
|
-
if source.local?
|
595
|
-
STDERR.puts " local source in #{source.local_dir}"
|
596
|
-
else
|
597
|
-
STDERR.puts " from: #{source.vcs}"
|
598
|
-
STDERR.puts " local: #{source.local_dir}"
|
599
|
-
end
|
600
|
-
|
601
|
-
lines = []
|
602
|
-
source.each_package.
|
603
|
-
map { |pkg| [pkg.name, manifest.package_manifests[pkg.name]] }.
|
604
|
-
sort_by { |name, _| name }.
|
605
|
-
each do |name, source_manifest|
|
606
|
-
vcs_def = manifest.importer_definition_for(name)
|
607
|
-
if source_manifest
|
608
|
-
lines << [name, source_manifest.short_documentation]
|
609
|
-
lines << ["", vcs_def.to_s]
|
610
|
-
else
|
611
|
-
lines << [name, vcs_def.to_s]
|
612
|
-
end
|
613
|
-
end
|
614
|
-
|
615
|
-
w_col1, w_col2 = nil
|
616
|
-
lines.each do |col1, col2|
|
617
|
-
w_col1 = col1.size if !w_col1 || col1.size > w_col1
|
618
|
-
w_col2 = col2.size if !w_col2 || col2.size > w_col2
|
619
|
-
end
|
620
|
-
STDERR.puts " packages:"
|
621
|
-
format = " | %-#{w_col1}s | %-#{w_col2}s |"
|
622
|
-
lines.each do |col1, col2|
|
623
|
-
STDERR.puts(format % [col1, col2])
|
624
|
-
end
|
625
|
-
end
|
626
|
-
end
|
627
|
-
end
|
628
|
-
if only_update_sources
|
629
|
-
exit(0)
|
81
|
+
# Namely, we must check if Autobuild.do_update has been explicitely set to
|
82
|
+
# true or false. If that is the case, don't do anything. Otherwise, set it
|
83
|
+
# to the value of Autoproj.auto_update
|
84
|
+
if Autobuild.do_update.nil?
|
85
|
+
Autobuild.do_update = Autoproj.auto_update?
|
630
86
|
end
|
631
87
|
|
632
|
-
#
|
633
|
-
|
634
|
-
|
635
|
-
selected_packages = manifest.default_packages
|
636
|
-
end
|
637
|
-
if selected_packages.empty? # no packages, terminate
|
638
|
-
STDERR.puts
|
639
|
-
STDERR.puts color("autoproj: no packages defined", :red)
|
640
|
-
exit 0
|
88
|
+
# If in verbose mode, or if we only update sources, list the sources
|
89
|
+
if Autoproj.verbose || Autoproj::CmdLine.display_configuration?
|
90
|
+
Autoproj::CmdLine.display_sources(manifest)
|
641
91
|
end
|
642
|
-
selected_packages = selected_packages.to_set
|
643
92
|
|
644
|
-
|
645
|
-
|
646
|
-
# package sets based on the layout file
|
647
|
-
#
|
648
|
-
# First, we allow to user to specify packages based on disk paths, so
|
649
|
-
# resolve those
|
650
|
-
selected_packages = manifest.expand_package_selection(selected_packages)
|
651
|
-
if selected_packages.empty?
|
652
|
-
STDERR.puts color("autoproj: wrong packages selection on command line", :red)
|
653
|
-
exit 0
|
654
|
-
elsif Autoproj.verbose
|
655
|
-
STDERR.puts "will install #{selected_packages.to_a.join(", ")}"
|
93
|
+
if Autoproj::CmdLine.only_config?
|
94
|
+
exit(0)
|
656
95
|
end
|
657
|
-
seen = Set.new
|
658
|
-
manifest.each_package_set do |name, packages, enabled_packages|
|
659
|
-
packages -= seen
|
660
96
|
|
661
|
-
|
662
|
-
|
663
|
-
logdir = File.join(prefix, "log")
|
664
|
-
packages.each do |pkg_name|
|
665
|
-
pkg = Autobuild::Package[pkg_name]
|
666
|
-
pkg.srcdir = File.join(srcdir, pkg_name)
|
667
|
-
pkg.prefix = prefix
|
668
|
-
pkg.doc_target_dir = File.join(Autoproj.build_dir, 'doc', name, pkg_name)
|
669
|
-
pkg.logdir = logdir
|
670
|
-
end
|
671
|
-
seen |= packages
|
672
|
-
end
|
97
|
+
selected_packages = Autoproj::CmdLine.resolve_user_selection(selected_packages)
|
98
|
+
Autoproj::CmdLine.initial_package_setup
|
673
99
|
|
674
|
-
|
675
|
-
# now so that the various package directories are properly setup
|
676
|
-
manifest.packages.each_value do |pkg|
|
677
|
-
if pkg.user_block
|
678
|
-
pkg.user_block[pkg.autobuild]
|
679
|
-
end
|
680
|
-
end
|
681
|
-
|
682
|
-
if only_do_status
|
100
|
+
if Autoproj::CmdLine.only_status?
|
683
101
|
STDERR.puts
|
684
|
-
|
685
|
-
|
686
|
-
|
687
|
-
|
688
|
-
|
102
|
+
all_enabled_packages = Autoproj::CmdLine.import_packages(selected_packages)
|
103
|
+
Autoproj::CmdLine.status(all_enabled_packages)
|
104
|
+
exit(0)
|
105
|
+
elsif Autoproj::CmdLine.check?
|
106
|
+
all_enabled_packages = Autoproj::CmdLine.import_packages(selected_packages)
|
107
|
+
Autoproj::CmdLine.check(all_enabled_packages)
|
108
|
+
exit(0)
|
109
|
+
elsif Autoproj::CmdLine.manifest_update?
|
110
|
+
all_enabled_packages = Autoproj::CmdLine.import_packages(selected_packages)
|
111
|
+
Autoproj::CmdLine.manifest_update(all_enabled_packages)
|
689
112
|
exit(0)
|
690
113
|
end
|
691
114
|
|
692
115
|
STDERR.puts
|
693
116
|
STDERR.puts color("autoproj: importing and loading selected packages", :bold)
|
694
117
|
|
695
|
-
# Install prepackaged dependencies needed to import and build the packages
|
696
|
-
|
118
|
+
# Install prepackaged dependencies needed to import and build the packages.
|
119
|
+
# The required information is in the package sets configuration.
|
120
|
+
if Autoproj::CmdLine.update_os_dependencies?
|
697
121
|
osdeps = manifest.known_os_packages
|
698
|
-
osdeps.install(Autoproj.build_system_dependencies
|
699
|
-
end
|
700
|
-
|
701
|
-
# First thing: do the import. We are handling the imports ourselves as it
|
702
|
-
# allows us to complete the enabled_packages set with the package
|
703
|
-
# dependencies. The scheme is as follows:
|
704
|
-
# * we import a package, prepare it and load its manifest
|
705
|
-
# * we look at its dependencies. Dependencies are either already handled
|
706
|
-
# (and nothing needs to be done) or are to-be-handled at this level.
|
707
|
-
# Otherwise, it is considered as an error
|
708
|
-
#
|
709
|
-
seen = Set.new
|
710
|
-
manifest.each_package_set do |name, packages, enabled_packages|
|
711
|
-
packages -= seen
|
712
|
-
|
713
|
-
old_update_flag = Autobuild.do_update
|
714
|
-
begin
|
715
|
-
Autobuild.do_update = false
|
716
|
-
packages.each do |pkg_name|
|
717
|
-
pkg = Autobuild::Package[pkg_name]
|
718
|
-
if File.directory?(pkg.srcdir)
|
719
|
-
Rake::Task["#{pkg_name}-import"].invoke
|
720
|
-
end
|
721
|
-
end
|
722
|
-
ensure
|
723
|
-
Autobuild.do_update = old_update_flag
|
724
|
-
end
|
725
|
-
|
726
|
-
seen |= packages
|
122
|
+
osdeps.install(Autoproj.build_system_dependencies)
|
727
123
|
end
|
728
124
|
|
729
|
-
|
730
|
-
|
731
|
-
|
732
|
-
|
733
|
-
|
734
|
-
enabled_packages -= all_enabled_packages
|
735
|
-
all_sublayouts << name
|
125
|
+
# Now, we actually do the import. Unfortunately, at this stage, we need to
|
126
|
+
# import the package and its dependencies ourselves so that we are able to
|
127
|
+
# build the list of packages that have actually been selected on the command
|
128
|
+
# line.
|
129
|
+
all_enabled_packages = Autoproj::CmdLine.import_packages(selected_packages)
|
736
130
|
|
737
|
-
|
738
|
-
|
739
|
-
|
740
|
-
|
741
|
-
|
742
|
-
|
743
|
-
|
744
|
-
# Not handled already. Import.
|
745
|
-
Autobuild::Package[pkg_name].import
|
746
|
-
manifest.load_package_manifest(pkg_name)
|
747
|
-
all_enabled_packages << pkg_name
|
748
|
-
|
749
|
-
# Add its dependencies to the next import set
|
750
|
-
Autobuild::Package[pkg_name].dependencies.each do |dep_name|
|
751
|
-
if !Autobuild::Package[dep_name]
|
752
|
-
raise ConfigError, "#{pkg_name} depends on #{dep_name}, but it does not seem to exist"
|
753
|
-
elsif all_enabled_packages.include?(dep_name)
|
754
|
-
next
|
755
|
-
end
|
756
|
-
packages_to_import << dep_name
|
757
|
-
end
|
758
|
-
end
|
759
|
-
end
|
760
|
-
all_packages.merge(packages)
|
761
|
-
end
|
762
|
-
|
763
|
-
old_update_flag = Autobuild.do_update
|
764
|
-
begin
|
765
|
-
Autobuild.do_update = false
|
766
|
-
prepare_targets = all_packages.
|
767
|
-
find_all { |pkg_name| File.directory?(Autobuild::Package[pkg_name].srcdir) }.
|
768
|
-
map { |pkg_name| "#{pkg_name}-prepare" }
|
769
|
-
task "autoproj-prepare" => prepare_targets
|
770
|
-
Rake::Task["autoproj-prepare"].invoke
|
771
|
-
ensure
|
772
|
-
Autobuild.do_update = old_update_flag
|
773
|
-
end
|
774
|
-
|
775
|
-
missing_packages = all_packages.
|
776
|
-
find_all do |pkg_name|
|
777
|
-
!File.directory?(Autobuild::Package[pkg_name].srcdir)
|
778
|
-
end
|
779
|
-
|
780
|
-
if missing_packages.empty?
|
781
|
-
# Backward compatibility: check if name/env.sh exists, and if it is
|
782
|
-
# the case, simply replace it with a link to the root one. And issue
|
783
|
-
# a warning
|
784
|
-
all_sublayouts.each do |name|
|
785
|
-
env_file = File.join(Autoproj.root_dir, name, "env.sh")
|
786
|
-
if name != '/' && File.file?(env_file)
|
787
|
-
File.open(env_file, 'w') do |io|
|
788
|
-
io.puts "source #{Autoproj.root_dir}/env.sh"
|
789
|
-
end
|
790
|
-
end
|
791
|
-
end
|
792
|
-
Autoproj.export_env_sh
|
793
|
-
STDERR.puts color("autoproj: updated #{Autoproj.root_dir}/env.sh", :green)
|
794
|
-
else
|
795
|
-
STDERR.puts color("autoproj: #{missing_packages.join(", ")} are not yet imported, #{Autoproj.root_dir}/env.sh might not be up to date", :red)
|
796
|
-
end
|
797
|
-
|
798
|
-
if all_enabled_packages.empty?
|
799
|
-
STDERR.puts color("autoproj: nothing to do", :bold)
|
800
|
-
elsif Autobuild.do_build
|
801
|
-
if Autobuild.only_doc
|
802
|
-
STDERR.puts color("autoproj: building and installing documentation", :bold)
|
803
|
-
else
|
804
|
-
STDERR.puts color("autoproj: building and installing packages", :bold)
|
805
|
-
end
|
806
|
-
|
807
|
-
if !no_os_deps
|
131
|
+
if Autoproj::CmdLine.build? || Autoproj::CmdLine.doc? || Autoproj::CmdLine.update_os_dependencies?
|
132
|
+
if all_enabled_packages.empty?
|
133
|
+
STDERR.puts color("autoproj: nothing to do", :bold)
|
134
|
+
elsif Autoproj::CmdLine.build? || Autoproj::CmdLine.doc?
|
135
|
+
Autoproj::CmdLine.build_packages(selected_packages, all_enabled_packages)
|
136
|
+
elsif Autoproj::CmdLine.update_os_dependencies?
|
808
137
|
manifest.install_os_dependencies(all_enabled_packages)
|
809
138
|
end
|
810
139
|
|
811
|
-
|
812
|
-
|
813
|
-
|
814
|
-
|
815
|
-
|
816
|
-
|
817
|
-
|
818
|
-
|
819
|
-
Autobuild::Package[pkg_name].prepare_for_forced_build
|
820
|
-
end
|
821
|
-
Autobuild.do_forced_build = false
|
140
|
+
# Now, do some sanity checks on the result
|
141
|
+
prefixes = all_enabled_packages.inject(Set.new) do |set, pkg_name|
|
142
|
+
set << Autobuild::Package[pkg_name].prefix
|
143
|
+
end
|
144
|
+
prefixes.each do |prefix|
|
145
|
+
libdir = File.join(prefix, "lib")
|
146
|
+
if File.directory?(libdir)
|
147
|
+
Autoproj.validate_solib_dependencies(libdir)
|
822
148
|
end
|
823
149
|
end
|
824
|
-
|
825
|
-
Autobuild.apply(all_enabled_packages, "autoproj-build")
|
826
|
-
elsif !no_os_deps
|
827
|
-
manifest.install_os_dependencies(all_enabled_packages)
|
828
150
|
end
|
829
151
|
|
830
|
-
|
831
|
-
|
832
|
-
end
|
833
|
-
prefixes.each do |prefix|
|
834
|
-
libdir = File.join(prefix, "lib")
|
835
|
-
if File.directory?(libdir)
|
836
|
-
Autoproj.validate_solib_dependencies(libdir)
|
837
|
-
end
|
838
|
-
end
|
152
|
+
Autoproj.export_env_sh
|
153
|
+
STDERR.puts color("autoproj: updated #{Autoproj.root_dir}/env.sh", :green)
|
839
154
|
end
|
840
155
|
|