autoproj 1.4.4 → 1.5.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 +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
|
|