autoproj 2.0.0.rc37 → 2.0.0.rc38

Sign up to get free protection for your applications and to get access to all the features.
Files changed (65) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +4 -2
  3. data/Rakefile +1 -1
  4. data/bin/autoproj_bootstrap +34 -2
  5. data/bin/autoproj_bootstrap.in +4 -2
  6. data/bin/autoproj_install +34 -2
  7. data/bin/autoproj_install.in +4 -2
  8. data/lib/autoproj.rb +9 -2
  9. data/lib/autoproj/autobuild.rb +13 -742
  10. data/lib/autoproj/autobuild_extensions/archive_importer.rb +44 -0
  11. data/lib/autoproj/autobuild_extensions/dsl.rb +439 -0
  12. data/lib/autoproj/autobuild_extensions/git.rb +116 -0
  13. data/lib/autoproj/autobuild_extensions/package.rb +159 -0
  14. data/lib/autoproj/autobuild_extensions/svn.rb +11 -0
  15. data/lib/autoproj/cli/base.rb +17 -18
  16. data/lib/autoproj/cli/clean.rb +1 -2
  17. data/lib/autoproj/cli/envsh.rb +1 -2
  18. data/lib/autoproj/cli/inspection_tool.rb +12 -21
  19. data/lib/autoproj/cli/locate.rb +130 -73
  20. data/lib/autoproj/cli/main.rb +31 -5
  21. data/lib/autoproj/cli/main_plugin.rb +79 -0
  22. data/lib/autoproj/cli/main_test.rb +19 -5
  23. data/lib/autoproj/cli/osdeps.rb +1 -2
  24. data/lib/autoproj/cli/patcher.rb +21 -0
  25. data/lib/autoproj/cli/query.rb +34 -41
  26. data/lib/autoproj/cli/show.rb +121 -52
  27. data/lib/autoproj/cli/status.rb +4 -5
  28. data/lib/autoproj/cli/tag.rb +1 -1
  29. data/lib/autoproj/cli/test.rb +7 -6
  30. data/lib/autoproj/cli/update.rb +8 -22
  31. data/lib/autoproj/cli/versions.rb +1 -2
  32. data/lib/autoproj/configuration.rb +1 -1
  33. data/lib/autoproj/environment.rb +2 -7
  34. data/lib/autoproj/exceptions.rb +10 -8
  35. data/lib/autoproj/find_workspace.rb +46 -12
  36. data/lib/autoproj/installation_manifest.rb +34 -25
  37. data/lib/autoproj/local_package_set.rb +86 -0
  38. data/lib/autoproj/manifest.rb +448 -503
  39. data/lib/autoproj/metapackage.rb +31 -5
  40. data/lib/autoproj/ops/configuration.rb +46 -45
  41. data/lib/autoproj/ops/import.rb +150 -60
  42. data/lib/autoproj/ops/install.rb +25 -1
  43. data/lib/autoproj/ops/loader.rb +4 -1
  44. data/lib/autoproj/ops/main_config_switcher.rb +4 -4
  45. data/lib/autoproj/ops/snapshot.rb +4 -3
  46. data/lib/autoproj/os_package_installer.rb +105 -46
  47. data/lib/autoproj/os_package_resolver.rb +63 -36
  48. data/lib/autoproj/package_definition.rb +1 -0
  49. data/lib/autoproj/package_managers/apt_dpkg_manager.rb +30 -27
  50. data/lib/autoproj/package_managers/bundler_manager.rb +64 -18
  51. data/lib/autoproj/package_managers/gem_manager.rb +4 -2
  52. data/lib/autoproj/package_managers/manager.rb +26 -7
  53. data/lib/autoproj/package_managers/shell_script_manager.rb +4 -4
  54. data/lib/autoproj/package_managers/zypper_manager.rb +1 -1
  55. data/lib/autoproj/package_manifest.rb +154 -137
  56. data/lib/autoproj/package_selection.rb +16 -2
  57. data/lib/autoproj/package_set.rb +352 -309
  58. data/lib/autoproj/query.rb +13 -1
  59. data/lib/autoproj/system.rb +2 -2
  60. data/lib/autoproj/test.rb +164 -11
  61. data/lib/autoproj/variable_expansion.rb +15 -42
  62. data/lib/autoproj/vcs_definition.rb +93 -76
  63. data/lib/autoproj/version.rb +1 -1
  64. data/lib/autoproj/workspace.rb +116 -80
  65. metadata +10 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 38dcaa9a937d33e87b1d4136c4bc0befb3fc255f
4
- data.tar.gz: 635803a80d25313398842cc66d7a94ab993c613a
3
+ metadata.gz: 8b53d93cd01cc0b8c5e434458cb24c73edfd49c9
4
+ data.tar.gz: a1d11757027126a5fbb843bf96f040b3d54f5964
5
5
  SHA512:
6
- metadata.gz: 758be08ef7c75ab3df49d9c89c87563da1c4652b3c872afab3f2524d204a40d3683b21b7027959a62b43ad34b719496faf8d62b63c7eb27bce75e6f8e9a261a3
7
- data.tar.gz: c72e8c168365e6fba79aa9c36ff832a1c5b27cd9d7e94e76bf2e2913ff110fe815ffc9d8348fdbe3593e502661cf223e49ad3560d9ed078e9f2c35ca9deb6f1c
6
+ metadata.gz: ab152231c4aa64cb65edcc79ffb0bf17493b3e538bb6197218b04c6436c8ea5990155e9173f2b03354b69b96567177bbdc2a4613d0e652003ecfd91ba4bc1bc4
7
+ data.tar.gz: 7fd86ca99c09b5445af96e027abe5a01fab4aaaec6fc678241f7dae7b1d9fe318d22f6474db539d7f3cd521a2e94fae844fc4b9473055d2d127d1033b203d18c
data/.travis.yml CHANGED
@@ -12,8 +12,10 @@ matrix:
12
12
 
13
13
  cache: bundler
14
14
 
15
- # Some tests expect gems to be present in vendor/bundle
16
- install: bundler install --path vendor/bundle
15
+ install:
16
+ - gem install bundler
17
+ # Some tests expect gems to be present in vendor/bundle
18
+ - bundler install --path vendor/bundle
17
19
  script:
18
20
  - bundler exec rake
19
21
  - bundler exec rake test
data/Rakefile CHANGED
@@ -19,7 +19,7 @@ task 'bootstrap' do
19
19
 
20
20
  %w{bootstrap install}.each do |install_script|
21
21
  bootstrap_code = File.read(File.join(Dir.pwd, 'bin', "autoproj_#{install_script}.in")).
22
- gsub('AUTOPROJ_OPS_INSTALL', autoproj_ops_install)
22
+ gsub("require 'autoproj/ops/install'", autoproj_ops_install)
23
23
  File.open(File.join(Dir.pwd, 'bin', "autoproj_#{install_script}"), 'w') do |io|
24
24
  io.write bootstrap_code
25
25
  end
@@ -43,6 +43,7 @@ module Autoproj
43
43
  @root_dir = root_dir
44
44
  @gem_source = "https://rubygems.org"
45
45
  @gemfile = nil
46
+ @skip_stage2 = false
46
47
 
47
48
  @autoproj_options = Array.new
48
49
 
@@ -113,6 +114,11 @@ module Autoproj
113
114
  # @return [String]
114
115
  def autoproj_config_path; File.join(dot_autoproj, 'config.yml') end
115
116
 
117
+ # Whether the stage2 install should be called or not
118
+ def skip_stage2?; !!@skip_stage2 end
119
+ # (see #skip_stage2?)
120
+ def skip_stage2=(flag); @skip_stage2 = flag end
121
+
116
122
  # Whether we can access the network while installing
117
123
  def local?; !!@local end
118
124
  # (see #local?)
@@ -196,6 +202,9 @@ module Autoproj
196
202
  opt.on '--local', 'do not access the network (may fail)' do
197
203
  @local = true
198
204
  end
205
+ opt.on '--skip-stage2', 'do not run the stage2 install' do
206
+ @skip_stage2 = true
207
+ end
199
208
  opt.on '--gem-source=URL', String, "use this source for RubyGems instead of rubygems.org" do |url|
200
209
  @gem_source = url
201
210
  end
@@ -303,6 +312,8 @@ module Autoproj
303
312
  self.class.rewrite_shims(shims_path, ruby_executable, autoproj_gemfile_path, gems_gem_home)
304
313
  end
305
314
 
315
+ EXCLUDED_FROM_SHIMS = %w{rake thor}
316
+
306
317
  def self.rewrite_shims(shim_path, ruby_executable, autoproj_gemfile_path, gems_gem_home)
307
318
  FileUtils.mkdir_p shim_path
308
319
  File.open(File.join(shim_path, 'ruby'), 'w') do |io|
@@ -316,6 +327,10 @@ module Autoproj
316
327
  Dir.glob(File.join(shim_path, '*')) do |bin_script|
317
328
  next if !File.file?(bin_script)
318
329
  bin_name = File.basename(bin_script)
330
+ if EXCLUDED_FROM_SHIMS.include?(bin_name)
331
+ FileUtils.rm_f bin_script
332
+ next
333
+ end
319
334
  next if bin_name == 'ruby'
320
335
 
321
336
  bin_shim = File.join(shim_path, bin_name)
@@ -341,6 +356,7 @@ if defined?(Bundler)
341
356
  end
342
357
  end
343
358
 
359
+ ENV['BUNDLE_GEMFILE'] ||= '#{autoproj_gemfile_path}'
344
360
  ENV['GEM_HOME'] = '#{gems_gem_home}'
345
361
  ENV.delete('GEM_PATH')
346
362
  Gem.paths = Hash['GEM_HOME' => '#{gems_gem_home}', 'GEM_PATH' => '']
@@ -353,8 +369,10 @@ load Gem.bin_path('bundler', 'bundler')"
353
369
 
354
370
  if defined?(Bundler)
355
371
  Bundler.with_clean_env do
356
- exec($0, *ARGV)
372
+ exec(Hash['RUBYLIB' => nil], $0, *ARGV)
357
373
  end
374
+ elsif ENV['RUBYLIB']
375
+ exec(Hash['RUBYLIB' => nil], $0, *ARGV)
358
376
  end
359
377
 
360
378
  ENV['BUNDLE_GEMFILE'] = '#{autoproj_gemfile_path}'
@@ -401,6 +419,18 @@ require 'bundler/setup'
401
419
  default_gemfile_contents
402
420
  end
403
421
 
422
+ gemfile += [
423
+ "",
424
+ "config_path = File.join(__dir__, 'config.yml')",
425
+ "if File.file?(config_path)",
426
+ " require 'yaml'",
427
+ " config = YAML.load(File.read(config_path))",
428
+ " (config['plugins'] || Hash.new).each do |plugin_name, (version, options)|",
429
+ " gem plugin_name, version, **options",
430
+ " end",
431
+ "end"
432
+ ].join("\n")
433
+
404
434
  FileUtils.mkdir_p File.dirname(autoproj_gemfile_path)
405
435
  File.open(autoproj_gemfile_path, 'w') do |io|
406
436
  io.write gemfile
@@ -567,6 +597,8 @@ ENV.delete('RUBYLIB')
567
597
  ops = Autoproj::Ops::Install.new(Dir.pwd)
568
598
  bootstrap_options = ops.parse_options(ARGV)
569
599
  ops.stage1
570
- ops.call_stage2
600
+ if !ops.skip_stage2?
601
+ ops.call_stage2
602
+ end
571
603
  ops.run_autoproj 'bootstrap', *bootstrap_options
572
604
 
@@ -8,13 +8,15 @@ elsif ENV['AUTOPROJ_CURRENT_ROOT'] && (ENV['AUTOPROJ_CURRENT_ROOT'] != Dir.pwd)
8
8
  exit 1
9
9
  end
10
10
 
11
- AUTOPROJ_OPS_INSTALL
11
+ require 'autoproj/ops/install'
12
12
 
13
13
  ENV.delete('BUNDLE_GEMFILE')
14
14
  ENV.delete('RUBYLIB')
15
15
  ops = Autoproj::Ops::Install.new(Dir.pwd)
16
16
  bootstrap_options = ops.parse_options(ARGV)
17
17
  ops.stage1
18
- ops.call_stage2
18
+ if !ops.skip_stage2?
19
+ ops.call_stage2
20
+ end
19
21
  ops.run_autoproj 'bootstrap', *bootstrap_options
20
22
 
data/bin/autoproj_install CHANGED
@@ -43,6 +43,7 @@ module Autoproj
43
43
  @root_dir = root_dir
44
44
  @gem_source = "https://rubygems.org"
45
45
  @gemfile = nil
46
+ @skip_stage2 = false
46
47
 
47
48
  @autoproj_options = Array.new
48
49
 
@@ -113,6 +114,11 @@ module Autoproj
113
114
  # @return [String]
114
115
  def autoproj_config_path; File.join(dot_autoproj, 'config.yml') end
115
116
 
117
+ # Whether the stage2 install should be called or not
118
+ def skip_stage2?; !!@skip_stage2 end
119
+ # (see #skip_stage2?)
120
+ def skip_stage2=(flag); @skip_stage2 = flag end
121
+
116
122
  # Whether we can access the network while installing
117
123
  def local?; !!@local end
118
124
  # (see #local?)
@@ -196,6 +202,9 @@ module Autoproj
196
202
  opt.on '--local', 'do not access the network (may fail)' do
197
203
  @local = true
198
204
  end
205
+ opt.on '--skip-stage2', 'do not run the stage2 install' do
206
+ @skip_stage2 = true
207
+ end
199
208
  opt.on '--gem-source=URL', String, "use this source for RubyGems instead of rubygems.org" do |url|
200
209
  @gem_source = url
201
210
  end
@@ -303,6 +312,8 @@ module Autoproj
303
312
  self.class.rewrite_shims(shims_path, ruby_executable, autoproj_gemfile_path, gems_gem_home)
304
313
  end
305
314
 
315
+ EXCLUDED_FROM_SHIMS = %w{rake thor}
316
+
306
317
  def self.rewrite_shims(shim_path, ruby_executable, autoproj_gemfile_path, gems_gem_home)
307
318
  FileUtils.mkdir_p shim_path
308
319
  File.open(File.join(shim_path, 'ruby'), 'w') do |io|
@@ -316,6 +327,10 @@ module Autoproj
316
327
  Dir.glob(File.join(shim_path, '*')) do |bin_script|
317
328
  next if !File.file?(bin_script)
318
329
  bin_name = File.basename(bin_script)
330
+ if EXCLUDED_FROM_SHIMS.include?(bin_name)
331
+ FileUtils.rm_f bin_script
332
+ next
333
+ end
319
334
  next if bin_name == 'ruby'
320
335
 
321
336
  bin_shim = File.join(shim_path, bin_name)
@@ -341,6 +356,7 @@ if defined?(Bundler)
341
356
  end
342
357
  end
343
358
 
359
+ ENV['BUNDLE_GEMFILE'] ||= '#{autoproj_gemfile_path}'
344
360
  ENV['GEM_HOME'] = '#{gems_gem_home}'
345
361
  ENV.delete('GEM_PATH')
346
362
  Gem.paths = Hash['GEM_HOME' => '#{gems_gem_home}', 'GEM_PATH' => '']
@@ -353,8 +369,10 @@ load Gem.bin_path('bundler', 'bundler')"
353
369
 
354
370
  if defined?(Bundler)
355
371
  Bundler.with_clean_env do
356
- exec($0, *ARGV)
372
+ exec(Hash['RUBYLIB' => nil], $0, *ARGV)
357
373
  end
374
+ elsif ENV['RUBYLIB']
375
+ exec(Hash['RUBYLIB' => nil], $0, *ARGV)
358
376
  end
359
377
 
360
378
  ENV['BUNDLE_GEMFILE'] = '#{autoproj_gemfile_path}'
@@ -401,6 +419,18 @@ require 'bundler/setup'
401
419
  default_gemfile_contents
402
420
  end
403
421
 
422
+ gemfile += [
423
+ "",
424
+ "config_path = File.join(__dir__, 'config.yml')",
425
+ "if File.file?(config_path)",
426
+ " require 'yaml'",
427
+ " config = YAML.load(File.read(config_path))",
428
+ " (config['plugins'] || Hash.new).each do |plugin_name, (version, options)|",
429
+ " gem plugin_name, version, **options",
430
+ " end",
431
+ "end"
432
+ ].join("\n")
433
+
404
434
  FileUtils.mkdir_p File.dirname(autoproj_gemfile_path)
405
435
  File.open(autoproj_gemfile_path, 'w') do |io|
406
436
  io.write gemfile
@@ -567,4 +597,6 @@ ENV.delete('RUBYLIB')
567
597
  ops = Autoproj::Ops::Install.new(Dir.pwd)
568
598
  ops.parse_options(ARGV)
569
599
  ops.stage1
570
- ops.call_stage2
600
+ if !ops.skip_stage2?
601
+ ops.call_stage2
602
+ end
@@ -8,11 +8,13 @@ elsif ENV['AUTOPROJ_CURRENT_ROOT'] && (ENV['AUTOPROJ_CURRENT_ROOT'] != Dir.pwd)
8
8
  exit 1
9
9
  end
10
10
 
11
- AUTOPROJ_OPS_INSTALL
11
+ require 'autoproj/ops/install'
12
12
 
13
13
  ENV.delete('BUNDLE_GEMFILE')
14
14
  ENV.delete('RUBYLIB')
15
15
  ops = Autoproj::Ops::Install.new(Dir.pwd)
16
16
  ops.parse_options(ARGV)
17
17
  ops.stage1
18
- ops.call_stage2
18
+ if !ops.skip_stage2?
19
+ ops.call_stage2
20
+ end
data/lib/autoproj.rb CHANGED
@@ -1,8 +1,10 @@
1
+ require 'rexml/streamlistener'
1
2
  require "enumerator"
2
3
  require 'utilrb/module/attr_predicate'
3
4
  require 'pathname'
4
5
  require 'concurrent'
5
6
  require 'autobuild'
7
+ require 'autoproj/autobuild'
6
8
  require 'autoproj/base'
7
9
  require 'autoproj/exceptions'
8
10
  require 'autoproj/version'
@@ -12,6 +14,7 @@
12
14
  require 'autoproj/find_workspace'
13
15
  require 'autoproj/vcs_definition'
14
16
  require 'autoproj/package_set'
17
+ require 'autoproj/local_package_set'
15
18
  require 'autoproj/package_definition'
16
19
  require 'autoproj/package_selection'
17
20
  require 'autoproj/metapackage'
@@ -57,9 +60,13 @@ def self.warn_deprecated_level=(level)
57
60
  end
58
61
  @warn_deprecated_level = 1
59
62
 
60
- def self.warn_deprecated(method, msg, level = 0)
63
+ def self.warn_deprecated(method, msg = nil, level = 0)
61
64
  if level >= @warn_deprecated_level
62
- Autoproj.warn "#{method} is deprecated, #{msg}"
65
+ if msg
66
+ Autoproj.warn "#{method} is deprecated, #{msg}"
67
+ else
68
+ Autoproj.warn msg
69
+ end
63
70
  caller.each { |l| Autoproj.warn " #{l}" }
64
71
  end
65
72
  end
@@ -1,748 +1,19 @@
1
- require 'find'
2
- require 'fileutils'
3
- require 'autobuild'
4
- require 'set'
1
+ require 'autoproj/autobuild_extensions/package'
2
+ require 'autoproj/autobuild_extensions/archive_importer'
3
+ require 'autoproj/autobuild_extensions/git'
4
+ require 'autoproj/autobuild_extensions/svn'
5
+ require 'autoproj/autobuild_extensions/dsl'
5
6
 
6
- module Autoproj
7
- def self.ruby_executable
8
- Autoproj.workspace.config.ruby_executable
9
- end
10
-
11
- module CmdLine
12
- def self.ruby_executable
13
- Autoproj.workspace.config.ruby_executable
14
- end
15
- end
16
- end
17
-
18
- def explicit_osdeps_selection(name, config = Autoproj.config)
19
- if !config.declared?("osdeps_#{name}")
20
- if config.has_value_for?("osdeps_#{name}")
21
- doc_string = "install #{name} from source ?"
22
- else
23
- # Declare the option
24
- doc_string =<<-EOT
25
- The #{name} package is listed as a dependency of #{self.name}. It is listed as an operating
26
- system package for other operating systems than yours, and is also listed as a source package.
27
- Since you requested manual updates, I have to ask you:
28
-
29
- Do you want me to build #{name} from source ? If you say 'no', you will have to install it yourself.
30
- EOT
31
- end
32
-
33
- config.declare(
34
- "osdeps_#{name}", "boolean",
35
- :default => "yes",
36
- :doc => doc_string)
37
- end
38
- !config.get("osdeps_#{name}")
39
- end
40
-
41
- module Autobuild
42
- class Package
43
- attr_writer :ws
44
- def ws
45
- @ws ||= Autoproj.workspace
46
- end
47
-
48
- # The Autoproj::PackageManifest object that describes this package
49
- attr_accessor :description
50
- # The set of tags for this package. This is an union of the tags
51
- # contained in +description+ and the ones explicitely added with
52
- # #add_tag
53
- def tags
54
- result = (@added_tags || Set.new)
55
- if description
56
- result |= description.tags.to_set
57
- end
58
- result
59
- end
60
- # Tags explicitely added with #add_tag
61
- attr_reader :added_tags
62
- # Add a tag to the package. Use this if you don't want the tag to be
63
- # shared with everyone that uses the package (i.e. cannot go in
64
- # manifest.xml)
65
- def add_tag(tag)
66
- @added_tags ||= Set.new
67
- @added_tags << tag
68
- end
69
-
70
- # True if this package is tagged with the given tag string
71
- def has_tag?(tag)
72
- tags.include?(tag.to_s)
73
- end
74
-
75
- # Asks autoproj to remove references to the given obsolete oroGen
76
- # package
77
- def remove_obsolete_installed_orogen_package(name)
78
- post_install do
79
- path = File.join(prefix, 'lib', 'pkgconfig')
80
- Dir.glob(File.join(path, "#{name}-*.pc")) do |pcfile|
81
- Autoproj.message " removing obsolete file #{pcfile}", :bold
82
- FileUtils.rm_f pcfile
83
- end
84
- pcfile = File.join(path, "orogen-project-#{name}.pc")
85
- if File.exist?(pcfile)
86
- Autoproj.message " removing obsolete file #{pcfile}", :bold
87
- FileUtils.rm_f pcfile
88
- end
89
- end
90
- end
91
-
92
- # Asks autoproj to remove the given file in the package's installation
93
- # prefix
94
- def remove_obsolete_installed_file(*path)
95
- post_install do
96
- path = File.join(prefix, *path)
97
- if File.exist?(path)
98
- Autoproj.message " removing obsolete file #{path}", :bold
99
- FileUtils.rm_f path
100
- end
101
- end
102
- end
103
-
104
- # Ask autoproj to run the given block after this package has been
105
- # imported
106
- def post_import(&block)
107
- Autoproj.post_import(self, &block)
108
- end
109
-
110
- def autoproj_name # :nodoc:
111
- srcdir.gsub(/^#{Regexp.quote(Autoproj.root_dir)}\//, '')
112
- end
113
-
114
- alias __depends_on__ depends_on
115
- def depends_on(name)
116
- if name.respond_to?(:name) # probably a Package object
117
- name = name.name
118
- end
119
-
120
- @os_packages ||= Set.new
121
- pkg_autobuild, pkg_os = partition_package(name)
122
- pkg_autobuild.each do |pkg|
123
- __depends_on__(pkg)
124
- end
125
- @os_packages |= pkg_os.to_set
126
- end
127
-
128
- def depends_on_os_package(name)
129
- depends_on(name)
130
- end
131
-
132
- def remove_dependency(name)
133
- dependencies.delete name
134
- optional_dependencies.delete name
135
- os_packages.delete name
136
- end
137
-
138
- def optional_dependency(name)
139
- optional_dependencies << name
140
- end
141
-
142
- def partition_package(pkg_name)
143
- pkg_autobuild, pkg_osdeps = [], []
144
- ws.manifest.resolve_package_name(pkg_name).each do |type, dep_name|
145
- if type == :osdeps
146
- pkg_osdeps << dep_name
147
- elsif type == :package
148
- pkg_autobuild << dep_name
149
- else raise Autoproj::InternalError, "expected package type to be either :osdeps or :package, got #{type.inspect}"
150
- end
151
- end
152
- return pkg_autobuild, pkg_osdeps
153
- end
154
-
155
- def partition_optional_dependencies
156
- packages, osdeps = [], []
157
- optional_dependencies.each do |name|
158
- begin
159
- pkg_autobuild, pkg_osdeps = partition_package(name)
160
- packages.concat(pkg_autobuild)
161
- osdeps.concat(pkg_osdeps)
162
- rescue Autoproj::PackageNotFound
163
- # Simply ignore non-existent optional dependencies
164
- end
165
- end
166
- return packages, osdeps
167
- end
168
-
169
- def resolve_optional_dependencies
170
- packages, osdeps = partition_optional_dependencies
171
- packages.each { |pkg| __depends_on__(pkg) }
172
- os_packages.merge(osdeps.to_set)
173
- end
174
-
175
- def optional_dependencies
176
- @optional_dependencies ||= Set.new
177
- end
178
-
179
- def os_packages
180
- @os_packages ||= Set.new
181
- end
182
- end
183
-
184
- class Git
185
- # Reconfigures this importer to use an already existing checkout located
186
- # in the given autoproj root
187
- #
188
- # @param [Autobuild::Package] the package we are dealing with
189
- # @param [Autoproj::InstallationManifest] the other root's installation
190
- # manifest
191
- def pick_from_autoproj_root(package, installation_manifest)
192
- other_pkg = installation_manifest[package.name]
193
- return if !other_pkg || !File.directory?(other_pkg.srcdir)
194
- self.relocate(other_pkg.srcdir)
195
- true
196
- end
197
- end
198
-
199
- class ArchiveImporter
200
- # Reconfigures this importer to use an already existing checkout located
201
- # in the given autoproj root
202
- #
203
- # @param [Autobuild::Package] the package we are dealing with
204
- # @param [Autoproj::InstallationManifest] the other root's installation
205
- # manifest
206
- def pick_from_autoproj_root(package, installation_manifest)
207
- # Get the cachefile w.r.t. the autoproj root
208
- cachefile = Pathname.new(self.cachefile).
209
- relative_path_from(Pathname.new(Autoproj.root_dir)).to_s
210
-
211
- # The cachefile in the other autoproj installation
212
- other_cachefile = File.join(installation_manifest.path, cachefile)
213
- if File.file?(other_cachefile)
214
- self.relocate("file://" + other_cachefile)
215
- true
216
- end
217
- end
218
- end
219
- end
220
-
221
- module Autoproj
222
- @file_stack = Array.new
223
-
224
- def self.package_name_from_options(spec)
225
- if spec.kind_of?(Hash)
226
- spec.to_a.first.first.to_str
227
- else
228
- spec.to_str
229
- end
230
- end
231
-
232
- # @deprecated use Autoproj.workspace.in_package_set or add a proper Loader object to your
233
- # class
234
- def self.in_package_set(package_set, path, &block)
235
- Autoproj.workspace.in_package_set(package_set, path, &block)
236
- end
237
- # @deprecated use Autoproj.workspace.current_file or add a proper Loader object to your
238
- # class
239
- def self.current_file
240
- Autoproj.workspace.current_file
241
- end
242
- # @deprecated use Autoproj.workspace.current_package_set or add a proper Loader object to your
243
- # class
244
- def self.current_package_set
245
- Autoproj.workspace.current_package_set
246
- end
247
-
248
- def self.define(package_type, spec, &block)
249
- package = Autobuild.send(package_type, spec)
250
- Autoproj.workspace.manifest.register_package(package, block, *current_file)
251
- package
252
- end
253
-
254
- def self.loaded_autobuild_files
255
- Autoproj.workspace.loaded_autobuild_files
256
- end
257
-
258
- def self.import_autobuild_file(package_set, path)
259
- Autoproj.workspace.import_autobuild_file(package_set, path)
260
- end
261
-
262
- def self.find_topmost_directory_containing(dir, glob_pattern = nil)
263
- result = nil
264
- while dir != "/"
265
- match = false
266
- if glob_pattern
267
- if !Dir.glob(File.join(dir, glob_pattern)).empty?
268
- match = true
269
- end
270
- end
271
-
272
- if !match && block_given? && yield(dir)
273
- match = true
274
- end
275
- if !match && result
276
- return result
277
- elsif match
278
- result = dir
279
- end
280
-
281
- dir = File.dirname(dir)
282
- end
283
- end
284
-
285
- # Tries to find a handler automatically for 'full_path'
286
- def self.package_handler_for(full_path)
287
- if !Dir.enum_for(:glob, File.join(full_path, "*.orogen")).to_a.empty?
288
- return "orogen_package", full_path
289
- elsif File.file?(File.join(full_path, "CMakeLists.txt"))
290
- toplevel_dir = find_topmost_directory_containing(full_path) do |dir|
291
- cmakelists = File.join(dir, 'CMakeLists.txt')
292
- File.file?(cmakelists) &&
293
- (File.read(cmakelists) =~ /PROJECT/i)
294
- end
295
- toplevel_dir ||= find_topmost_directory_containing(full_path, 'CMakeLists.txt')
296
-
297
- return "cmake_package", toplevel_dir
298
- elsif dir = find_topmost_directory_containing(full_path, "Rakefile") ||
299
- find_topmost_directory_containing(full_path, "lib/*.rb")
300
-
301
- return "ruby_package", dir
302
- end
303
- end
304
- end
305
-
306
- def ignore(*paths)
307
- paths.each do |p|
308
- Autobuild.ignore(p)
309
- end
310
- end
311
-
312
- # Adds a new setup block to an existing package
313
- def setup_package(package_name, &block)
314
- if !block
315
- raise ConfigError.new, "you must give a block to #setup_package"
316
- end
317
-
318
- package_definition = Autoproj.workspace.manifest.package(package_name)
319
- if !package_definition
320
- raise ConfigError.new, "#{package_name} is not a known package"
321
- elsif package_definition.autobuild.kind_of?(Autobuild::DummyPackage)
322
- # Nothing to do!
323
- else
324
- package_definition.add_setup_block(block)
325
- end
326
- end
327
-
328
- # Common setup for packages
329
- def package_common(package_type, spec, &block)
330
- package_name = Autoproj.package_name_from_options(spec)
331
-
332
- if Autobuild::Package[package_name]
333
- current_file = Autoproj.current_file[1]
334
- old_file = Autoproj.workspace.manifest.definition_file(package_name)
335
- Autoproj.warn "#{package_name} from #{current_file} is overridden by the definition in #{old_file}"
336
-
337
- return Autobuild::Package[package_name]
338
- end
339
-
340
- pkg = Autoproj.define(package_type, spec, &block)
341
- pkg.srcdir = pkg.name
342
- pkg
343
- end
344
-
345
- def import_package(options, &block)
346
- package_common(:import, options, &block)
347
- end
348
-
349
- def common_make_based_package_setup(pkg)
350
- unless pkg.has_doc? && pkg.doc_dir
351
- pkg.with_doc do
352
- doc_html = File.join(pkg.builddir, 'doc', 'html')
353
- if File.directory?(doc_html)
354
- pkg.doc_dir = doc_html
355
- end
356
- end
357
- end
358
- if !pkg.test_utility.has_task?
359
- if !pkg.test_utility.source_dir
360
- test_dir = File.join(pkg.srcdir, 'test')
361
- if File.directory?(test_dir)
362
- pkg.test_utility.source_dir = test_dir
363
- end
364
- end
365
-
366
- if pkg.test_utility.source_dir
367
- pkg.with_tests
368
- end
369
- end
370
- end
371
-
372
- # Define a cmake package
373
- #
374
- # Example:
375
- #
376
- # cmake_package 'package_name' do |pkg|
377
- # pkg.define "CMAKE_BUILD_TYPE", "Release"
378
- # end
379
- #
380
- # +pkg+ is an Autobuild::CMake instance. See the Autobuild API for more
381
- # information.
382
- def cmake_package(options, &block)
383
- package_common(:cmake, options) do |pkg|
384
- pkg.depends_on 'cmake'
385
- common_make_based_package_setup(pkg)
386
- yield(pkg) if block_given?
387
- end
388
- end
389
-
390
- # Define an autotools package
391
- #
392
- # Example:
393
- # autotools_package 'package_name' do |pkg|
394
- # pkg.configureflags << "--enable-llvm"
395
- # end
396
- #
397
- # +pkg+ is an Autobuild::Autotools instance. See the Autobuild API for more
398
- # information.
399
- def autotools_package(options, &block)
400
- package_common(:autotools, options) do |pkg|
401
- pkg.depends_on 'autotools'
402
- common_make_based_package_setup(pkg)
403
- yield(pkg) if block_given?
404
- end
405
- end
406
-
407
- def env_set(name, value)
408
- Autoproj.env.set(name, value)
7
+ Autobuild::Package.class_eval do
8
+ prepend Autoproj::AutobuildExtensions::Package
409
9
  end
410
- def env_add(name, value)
411
- Autoproj.env.add(name, value)
10
+ Autobuild::ArchiveImporter.class_eval do
11
+ prepend Autoproj::AutobuildExtensions::ArchiveImporter
412
12
  end
413
-
414
-
415
- # Defines a Ruby package
416
- #
417
- # Example:
418
- #
419
- # ruby_package 'package_name' do |pkg|
420
- # pkg.doc_target = 'doc'
421
- # end
422
- #
423
- # +pkg+ is an Autobuild::Importer instance. See the Autobuild API for more
424
- # information.
425
- def ruby_package(options)
426
- package_common(:ruby, options) do |pkg|
427
- # Documentation code. Ignore if the user provided its own documentation
428
- # task, or disabled the documentation generation altogether by setting
429
- # rake_doc_task to nil
430
- if !pkg.has_doc? && pkg.rake_doc_task
431
- pkg.with_doc
432
- end
433
- if !pkg.test_utility.has_task?
434
- if !pkg.test_utility.source_dir
435
- test_dir = File.join(pkg.srcdir, 'test')
436
- if File.directory?(test_dir)
437
- pkg.test_utility.source_dir = test_dir
438
- end
439
- end
440
-
441
- if pkg.test_utility.source_dir
442
- pkg.with_tests
443
- end
444
- end
445
-
446
- yield(pkg) if block_given?
447
- end
13
+ Autobuild::Git.class_eval do
14
+ prepend Autoproj::AutobuildExtensions::Git
448
15
  end
449
-
450
- # Defines an oroGen package. By default, autoproj will look for an orogen file
451
- # called package_basename.orogen if the package is called dir/package_basename
452
- #
453
- # Example:
454
- # orogen_package 'package_name' do |pkg|
455
- # pkg.orogen_file = "my.orogen"
456
- # pkg.corba = false
457
- # end
458
- #
459
- # +pkg+ is an Autobuild::Orogen instance. See the Autobuild API for more
460
- # information.
461
- def orogen_package(options, &block)
462
- package_common(:orogen, options) do |pkg|
463
- common_make_based_package_setup(pkg)
464
- yield(pkg) if block_given?
465
- end
466
- end
467
-
468
- # Declare that the packages declared in the block should be built only on the
469
- # given operating system. OS descriptions are space-separated strings containing
470
- # OS name and version.
471
- #
472
- # The block will simply be ignored if run on another architecture
473
- def only_on(*architectures)
474
- architectures = architectures.map do |name|
475
- if name.respond_to?(:to_str)
476
- [name]
477
- else name
478
- end
479
- end
480
-
481
- os_names, os_versions = Autoproj.workspace.operating_system
482
- matching_archs = architectures.find_all { |arch| os_names.include?(arch[0].downcase) }
483
- if matching_archs.empty?
484
- return
485
- elsif matching_archs.none? { |arch| !arch[1] || os_versions.include?(arch[1].downcase) }
486
- return
487
- end
488
-
489
- yield
490
- end
491
-
492
- # Declare that the packages declared in the block should not be built in the
493
- # given operating system. OS descriptions are space-separated strings containing
494
- # OS name and version.
495
- #
496
- # An error will occur if the user tries to build it on one of those
497
- # architectures
498
- def not_on(*architectures)
499
- architectures = architectures.map do |name|
500
- if name.respond_to?(:to_str)
501
- [name]
502
- else name
503
- end
504
- end
505
-
506
- os_names, os_versions = Autoproj.workspace.operating_system
507
- matching_archs = architectures.find_all { |arch| os_names.include?(arch[0].downcase) }
508
- if matching_archs.empty?
509
- return yield
510
- elsif matching_archs.all? { |arch| arch[1] && !os_versions.include?(arch[1].downcase) }
511
- return yield
512
- end
513
-
514
- # Simply get the current list of packages, yield the block, and exclude all
515
- # packages that have been added
516
- current_packages = Autobuild::Package.each(true).map(&:last).map(&:name).to_set
517
- yield
518
- new_packages = Autobuild::Package.each(true).map(&:last).map(&:name).to_set -
519
- current_packages
520
-
521
- new_packages.each do |pkg_name|
522
- Autoproj.workspace.manifest.add_exclusion(pkg_name, "#{pkg_name} is disabled on this operating system")
523
- end
524
- end
525
-
526
- # Defines an import-only package, i.e. a package that is simply checked out but
527
- # not built in any way
528
- def source_package(options)
529
- package_common(options) do |pkg|
530
- pkg.srcdir = pkg.name
531
- yield(pkg) if block_given?
532
- end
533
- end
534
-
535
- # Define a configuration option
536
- #
537
- # @see Autoproj::Configuration#declare
538
- def configuration_option(*opts, &block)
539
- Autoproj.config.declare(*opts, &block)
540
- end
541
-
542
- # Retrieves the configuration value for the given option
543
- #
544
- # See Autoproj.user_config
545
- def user_config(key)
546
- Autoproj.user_config(key)
547
- end
548
-
549
- class Autobuild::Git
550
- # Get version information
551
- #
552
- # @option options [Boolean] local (true) whether the snapshot should access
553
- # the remote repository to determine if the local commit is there, and
554
- # determine what would be the best remote branch, or stick to information
555
- # that is present locally
556
- # @option options [Boolean] exact_state (true) whether the snapshot should
557
- # point to a specific commit (either with a tag or with a commit ID), or
558
- # only override the branch
559
- # @return [Hash] the snapshot information, in a format that can be used by
560
- # {#relocate}
561
- def snapshot(package, target_dir = nil, only_local: true, exact_state: true)
562
- if only_local
563
- snapshot_local(package, exact_state: exact_state)
564
- else
565
- snapshot_against_remote(package, exact_state: exact_state)
566
- end
567
- end
568
-
569
- def normalize_branch_name(name)
570
- if name =~ /^refs\/heads\//
571
- return name
572
- else
573
- "refs/heads/#{name}"
574
- end
575
- end
576
-
577
- # Returns true if the given snapshot information is different from the
578
- # configured importer state
579
- #
580
- # It tests only against the parameters returned by {#snapshot}
581
- def snapshot_overrides?(snapshot)
582
- # We have to normalize the branch and tag names
583
- if snapshot_local = (snapshot['local_branch'] || snapshot['branch'])
584
- snapshot_local = normalize_branch_name(snapshot_local)
585
- local_branch = normalize_branch_name(self.local_branch)
586
- return true if snapshot_local != local_branch
587
- end
588
- if snapshot_remote = (snapshot['remote_branch'] || snapshot['branch'])
589
- snapshot_remote = normalize_branch_name(snapshot_remote)
590
- remote_branch = normalize_branch_name(self.remote_branch)
591
- return true if snapshot_remote != remote_branch
592
- end
593
- if snapshot_id = snapshot['commit']
594
- return true if self.commit != snapshot_id
595
- end
596
- false
597
- end
598
-
599
- # @api private
600
- def snapshot_against_remote(package, options = Hash.new)
601
- info = Hash['tag' => nil, 'commit' => nil]
602
- remote_revname = describe_commit_on_remote(package, 'HEAD', tags: options[:exact_state])
603
-
604
- case remote_revname
605
- when /^refs\/heads\/(.*)/
606
- remote_branch = $1
607
- if local_branch == remote_branch
608
- info['branch'] = local_branch
609
- else
610
- info['local_branch'] = local_branch
611
- info['remote_branch'] = remote_branch
612
- end
613
- when /^refs\/tags\/(.*)/
614
- info['tag'] = $1
615
- else
616
- info['local_branch'] = local_branch
617
- info['remote_branch'] = remote_revname
618
- end
619
-
620
- if options[:exact_state] && !info['tag']
621
- info['commit'] = rev_parse(package, 'HEAD')
622
- end
623
- info
624
- end
625
-
626
- # @api private
627
- def snapshot_local(package, options = Hash.new)
628
- info = Hash.new
629
- if local_branch != remote_branch
630
- info['local_branch'] = local_branch
631
- info['remote_branch'] = remote_branch
632
- else
633
- info['branch'] = branch
634
- end
635
-
636
- if options[:exact_state]
637
- has_tag, described = describe_rev(package, 'HEAD')
638
- if has_tag
639
- info.merge('tag' => described, 'commit' => nil)
640
- else
641
- info.merge('tag' => nil, 'commit' => described)
642
- end
643
- else
644
- info
645
- end
646
- end
647
- end
648
-
649
- class Autobuild::SVN
650
- def snapshot(package, target_dir = nil, options = Hash.new)
651
- version = svn_revision(package)
652
- Hash['revision' => version]
653
- end
654
- end
655
-
656
- class Autobuild::ArchiveImporter
657
- def snapshot(package, target_dir = nil, options = Hash.new)
658
- result = Hash[
659
- 'mode' => mode,
660
- 'no_subdirectory' => !has_subdirectory?,
661
- 'archive_dir' => archive_dir || tardir]
662
-
663
- if target_dir
664
- archive_dir = File.join(target_dir, 'archives')
665
- FileUtils.mkdir_p archive_dir
666
- FileUtils.cp @cachefile, archive_dir
667
-
668
- result['url'] = "file://$AUTOPROJ_SOURCE_DIR/archives/#{File.basename(@cachefile)}"
669
- else
670
- result['url'] = @url.to_s
671
- end
672
-
673
- result
674
- end
675
- end
676
-
677
- def package(name)
678
- Autoproj.workspace.manifest.find_autobuild_package(name)
679
- end
680
-
681
- # Returns true if +name+ is a valid package and is neither excluded nor ignored
682
- # from the build
683
- def package_selected?(name)
684
- Autoproj.workspace.manifest.package_selected?(name, false)
685
- end
686
-
687
- # Returns true if +name+ is a valid package and is included in the build
688
- def package_enabled?(name)
689
- Autoproj.workspace.manifest.package_enabled?(name, false)
690
- end
691
-
692
- # If used in init.rb, allows to disable automatic imports from specific package
693
- # sets
694
- def disable_imports_from(name)
695
- Autoproj.workspace.manifest.disable_imports_from(name)
696
- end
697
-
698
- # Moves the given package to a new subdirectory
699
- def move_package(name, new_dir)
700
- Autoproj.workspace.manifest.move_package(name, new_dir)
701
- end
702
-
703
- # Removes all the packages currently added from the given metapackage
704
- #
705
- # Calling this function will make sure that the given metapackage is now empty.
706
- def clear_metapackage(name)
707
- meta = Autoproj.workspace.manifest.metapackage(name)
708
- meta.packages.clear
709
- end
710
-
711
- # Declares a new metapackage, or adds packages to an existing one
712
- def metapackage(name, *packages)
713
- Autoproj.workspace.manifest.metapackage(name, *packages)
714
- end
715
-
716
- # This can be used only during the load of a package set
717
- #
718
- # It defines the set of packages that will be built if 'package_set_name' is
719
- # used. By default, all of the package set's packages are included. After a call
720
- # to default_packages, only the packages listed (and their dependencies) are.
721
- def default_packages(*names)
722
- pkg_set = Autoproj.current_package_set
723
- clear_metapackage(pkg_set.name)
724
- metapackage(pkg_set.name, *names)
725
- end
726
-
727
- # This can be used only during the load of a package set
728
- #
729
- # It removes the given packages from the set of packages that will be built if
730
- # 'package_set_name' is used. By default, all of the package set's packages are
731
- # included. After a call to default_packages, only the packages listed (and
732
- # their dependencies) are.
733
- def remove_from_default(*names)
734
- pkg_set = Autoproj.current_package_set
735
- Autoproj.workspace.manifest.metapackage(pkg_set.name).packages.delete_if do |pkg|
736
- names.include?(pkg.name)
737
- end
738
- end
739
-
740
- def renamed_package(current_name, old_name, options)
741
- if options[:obsolete] && !Autoproj.workspace.manifest.explicitely_selected_in_layout?(old_name)
742
- import_package old_name
743
- Autoproj.workspace.manifest.add_exclusion old_name, "#{old_name} has been renamed to #{current_name}, you still have the option of using the old name by adding '- #{old_name}' explicitely in the layout in autoproj/manifest, but be warned that the name will stop being usable at all in the near future"
744
- else
745
- metapackage old_name, current_name
746
- end
16
+ Autobuild::SVN.class_eval do
17
+ prepend Autoproj::AutobuildExtensions::SVN
747
18
  end
748
19