autobuild 1.10.0.rc14 → 1.10.0.rc15

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 9e04850122480c75777d04748145ca9415f084cc
4
- data.tar.gz: 8d0247d6239a8d2847c36dee651484b5de6f4698
3
+ metadata.gz: 0bfbc713367f1cd0d1935302128f639b649cdf3a
4
+ data.tar.gz: a57057547ba73f4d15ee253d8e385ae548a0bc42
5
5
  SHA512:
6
- metadata.gz: 3824e574d80cf76b09eff053bd5aa870d10975dfdcc6c9f4e5c5da5869bd4a83d845c828357d3202cf7cf5da141c7ea6182f62cba61931f6bb19c845ebcdf1c4
7
- data.tar.gz: 4b22b978f8205df7ad38e08e9f7923abd02ef9bcea670a29b71518a36c9a0b301fdbfbff36990653a9f4826d4a25a7a8311775c3ae77608ddf0206b53ef4cf5a
6
+ metadata.gz: eb3752c3e4c69d1c82bc3de46913d56bb8ec96a5259b332a9abc2c0bd18c3833ad7bfd15087c9cb1fb3767588d67d4245793d0ea8e47c5aa2561a2f2e5d3f918
7
+ data.tar.gz: 576d86ebb48163f35cfac3c06dc7a46ab4fa5c828015a4d5e000be96e44b5ef2cb08901427ffc5ad4fca41e3ae6a36442ca505ab488a5f9354d547d149ec5760
data/lib/autobuild.rb CHANGED
@@ -38,6 +38,7 @@ module Autobuild
38
38
  require 'autobuild/timestamps'
39
39
  require 'autobuild/parallel'
40
40
  require 'autobuild/utility'
41
+ require 'autobuild/test_utility'
41
42
  require 'autobuild/config'
42
43
 
43
44
  require 'autobuild/importer'
@@ -83,7 +83,7 @@ def full_build?
83
83
  end
84
84
  @utilities = Hash.new
85
85
  register_utility_class 'doc', Utility, disabled_by_default: false
86
- register_utility_class 'test', Utility, disabled_by_default: true, install_on_error: true
86
+ register_utility_class 'test', TestUtility, disabled_by_default: true
87
87
 
88
88
  @colorizer = Pastel.new
89
89
  class << self
@@ -255,7 +255,7 @@ def self.add_post_hook(&hook)
255
255
 
256
256
  # Enumerate the post-import hooks defined for all instances of this class
257
257
  def self.each_post_hook(&hook)
258
- (@post_hooks || Array.new).each(&hook)
258
+ (@post_hooks ||= Array.new).each(&hook)
259
259
  end
260
260
 
261
261
  # @api private
@@ -318,7 +318,7 @@ def perform_update(package,only_local=false)
318
318
  cur_patches = currently_applied_patches(package)
319
319
  if !cur_patches.empty?
320
320
  package.progress_done
321
- package.message "update failed and some patches are applied, retrying after removing all patches first"
321
+ package.message "update failed and some patches are applied, removing all patches and retrying"
322
322
  begin
323
323
  patch(package, [])
324
324
  return perform_update(package,only_local)
@@ -455,8 +455,6 @@ def fallback(error, package, *args, &block)
455
455
  raise error
456
456
  end
457
457
 
458
- private
459
-
460
458
  def patchdir(package)
461
459
  File.join(package.importdir, ".autobuild-patches")
462
460
  end
@@ -162,7 +162,7 @@ def initialize(spec = Hash.new)
162
162
  end
163
163
  task :prepare => "#{name}-prepare"
164
164
 
165
- task "#{name}-build" => "#{name}-prepare"
165
+ task "#{name}-build"
166
166
  task :build => "#{name}-build"
167
167
 
168
168
  task(name) do
@@ -180,6 +180,11 @@ def initialize(spec = Hash.new)
180
180
  @spec_dependencies = depends
181
181
  end
182
182
 
183
+ # Whether the package's source directory is present on disk
184
+ def checked_out?
185
+ File.directory?(srcdir)
186
+ end
187
+
183
188
  # @api private
184
189
  #
185
190
  # Adds a new operation to this package's environment setup. This is a
@@ -310,7 +315,7 @@ def find_in_path(file, envvar = 'PATH')
310
315
  # @return [Hash<String,String>] the full environment
311
316
  # @see Autobuild::Environment#resolved_env
312
317
  def resolved_env(root = Autobuild.env)
313
- full_env.resolved_env
318
+ full_env(root).resolved_env
314
319
  end
315
320
 
316
321
  # Called before a forced build. It should remove all the timestamp and
@@ -30,6 +30,23 @@ def full_reconfigures?
30
30
 
31
31
  attr_reader :prefix_path
32
32
  attr_reader :module_path
33
+
34
+ # Whether files that are not within CMake's install manifest but are
35
+ # present in the prefix should be deleted. Note that the contents of
36
+ # {#log_dir} are unaffected.
37
+ #
38
+ # It is false by default. Set to true only if each package has its
39
+ # own prefix.
40
+ def delete_obsolete_files_in_prefix?
41
+ @@delete_obsolete_files_in_prefix
42
+ end
43
+
44
+ # Set {#delete_obsolete_files_in_prefix?}
45
+ def delete_obsolete_files_in_prefix=(flag)
46
+ @@delete_obsolete_files_in_prefix = flag
47
+ end
48
+
49
+ @@delete_obsolete_files_in_prefix = false
33
50
  end
34
51
  @builddir = nil
35
52
  @prefix_path = []
@@ -85,6 +102,17 @@ def configurestamp; cmake_cache end
85
102
  def initialize(options)
86
103
  @defines = Hash.new
87
104
  super
105
+ @delete_obsolete_files_in_prefix = self.class.delete_obsolete_files_in_prefix?
106
+ end
107
+
108
+ # (see CMake.delete_obsolete_files_in_prefix?)
109
+ def delete_obsolete_files_in_prefix?
110
+ @delete_obsolete_files_in_prefix
111
+ end
112
+
113
+ # (see CMake.delete_obsolete_files_in_prefix=)
114
+ def delete_obsolete_files_in_prefix=(flag)
115
+ @delete_obsolete_files_in_prefix = flag
88
116
  end
89
117
 
90
118
  @@defines = Hash.new
@@ -317,6 +345,28 @@ def update_environment
317
345
  end
318
346
  end
319
347
 
348
+ def defines_changed?(all_defines, cache_data)
349
+ all_defines.any? do |name, value|
350
+ if match = /^#{name}:\w+=(.*)$/.match(cache_data)
351
+ old_value = match[1]
352
+ end
353
+
354
+ value = value.to_s
355
+ if !old_value || !equivalent_option_value?(old_value, value)
356
+ if Autobuild.debug
357
+ message "%s: option '#{name}' changed value: '#{old_value}' => '#{value}'"
358
+ end
359
+ if old_value
360
+ message "%s: changed value of #{name} from #{old_value} to #{value}"
361
+ else
362
+ message "%s: setting value of #{name} to #{value}"
363
+ end
364
+
365
+ true
366
+ end
367
+ end
368
+ end
369
+
320
370
  def prepare
321
371
  # A failed initial CMake configuration leaves a CMakeCache.txt file,
322
372
  # but no Makefile.
@@ -329,29 +379,8 @@ def prepare
329
379
  doc_utility.source_ref_dir = builddir
330
380
 
331
381
  if File.exist?(cmake_cache)
332
- all_defines = self.all_defines
333
382
  cache = File.read(cmake_cache)
334
- did_change = all_defines.any? do |name, value|
335
- cache_line = cache.each_line.find do |line|
336
- line =~ /^#{name}:/
337
- end
338
-
339
- value = value.to_s
340
- old_value = cache_line.partition("=").last.chomp if cache_line
341
- if !old_value || !equivalent_option_value?(old_value, value)
342
- if Autobuild.debug
343
- message "%s: option '#{name}' changed value: '#{old_value}' => '#{value}'"
344
- end
345
- if old_value
346
- message "%s: changed value of #{name} from #{old_value} to #{value}"
347
- else
348
- message "%s: setting value of #{name} to #{value}"
349
- end
350
-
351
- true
352
- end
353
- end
354
- if did_change
383
+ if defines_changed?(all_defines, cache)
355
384
  if Autobuild.debug
356
385
  message "%s: CMake configuration changed, forcing a reconfigure"
357
386
  end
@@ -463,14 +492,41 @@ def build
463
492
  end
464
493
 
465
494
  # Install the result in prefix
495
+ #
496
+ # If {#delete_obsolete_files_in_prefix?} is set, files that are present
497
+ # in the prefix but not in CMake's install manifest will be removed.
466
498
  def install
467
499
  in_dir(builddir) do
468
500
  progress_start "installing %s", :done_message => 'installed %s' do
469
501
  run('install', Autobuild.tool(:make), "-j#{parallel_build_level}", 'install')
470
502
  end
503
+
504
+ if delete_obsolete_files_in_prefix?
505
+ delete_obsolete_files
506
+ end
471
507
  end
472
508
  super
473
509
  end
510
+
511
+ # @api private
512
+ #
513
+ # Delete files in {#prefix} that are not present in CMake's install
514
+ # manifest
515
+ #
516
+ # This is enabled globally by {CMake.delete_obsolete_files=} or
517
+ # per-package with {#delete_obsolete_files=}. Do NOT enable if packages
518
+ # share the same prefix.
519
+ def delete_obsolete_files
520
+ manifest_contents = File.readlines(File.join(builddir, 'install_manifest.txt')).
521
+ map(&:chomp).to_set
522
+ logdir = self.logdir
523
+ Find.find(prefix) do |path|
524
+ Find.prune if path == logdir
525
+ if !manifest_contents.include?(path) && File.file?(path)
526
+ FileUtils.rm path
527
+ end
528
+ end
529
+ end
474
530
  end
475
531
  end
476
532
 
@@ -1,4 +1,8 @@
1
1
  module Autobuild
2
+ # Handling of "standard" Ruby packages
3
+ #
4
+ # The package is expected to follow the general standards laid down by the
5
+ # bundler guys (i.e. look like a package generated by `bundler gem`)
2
6
  class Ruby < ImporterPackage
3
7
  # The Rake task that is used to set up the package. Defaults to "default".
4
8
  # Set to nil to disable setup altogether
@@ -281,29 +281,32 @@ module Reporting
281
281
  ## Run a block and report known exception
282
282
  # If an exception is fatal, the program is terminated using exit()
283
283
  def self.report
284
- begin
285
- yield
286
-
287
- # If ignore_erorrs is true, check if some packages have failed
288
- # on the way. If so, raise an exception to inform the user about
289
- # it
290
- errors = []
291
- Autobuild::Package.each do |name, pkg|
292
- errors.concat(pkg.failures)
293
- end
284
+ begin yield
285
+ rescue Interrupt
286
+ interrupted = true
287
+ end
294
288
 
295
- if !errors.empty?
296
- raise CompositeException.new(errors)
297
- end
289
+ # If ignore_erorrs is true, check if some packages have failed
290
+ # on the way. If so, raise an exception to inform the user about
291
+ # it
292
+ errors = []
293
+ Autobuild::Package.each do |name, pkg|
294
+ errors.concat(pkg.failures)
295
+ end
298
296
 
299
- rescue Autobuild::Exception => e
300
- error(e)
301
- if e.fatal?
302
- if Autobuild.debug
303
- raise
304
- else
305
- exit 1
306
- end
297
+ if !errors.empty?
298
+ raise CompositeException.new(errors)
299
+ elsif interrupted
300
+ raise Interrupt
301
+ end
302
+
303
+ rescue Autobuild::Exception => e
304
+ error(e)
305
+ if e.fatal?
306
+ if Autobuild.debug
307
+ raise
308
+ else
309
+ exit 1
307
310
  end
308
311
  end
309
312
  end
@@ -41,7 +41,9 @@ module Autobuild
41
41
  #
42
42
  module SelfTest
43
43
  def setup
44
- @tempdir = File.join(Dir.tmpdir, "/autobuild-test-#{Process.uid}")
44
+ @temp_dirs = Array.new
45
+
46
+ @tempdir = make_tmpdir
45
47
  FileUtils.mkdir_p(@tempdir, :mode => 0700)
46
48
  Autobuild.logdir = "#{tempdir}/log"
47
49
  FileUtils.mkdir_p Autobuild.logdir
@@ -54,12 +56,18 @@ def teardown
54
56
  super
55
57
 
56
58
  Autobuild::Package.clear
59
+ Rake::Task.clear
57
60
 
58
- if @tempdir
59
- FileUtils.rm_rf @tempdir
61
+ @temp_dirs.each do |dir|
62
+ FileUtils.rm_rf dir
60
63
  end
61
64
  end
62
65
 
66
+ def make_tmpdir
67
+ @temp_dirs << (dir = Dir.mktmpdir)
68
+ dir
69
+ end
70
+
63
71
  def data_dir
64
72
  File.join(File.dirname(__FILE__), '..', '..', 'test', 'data')
65
73
  end
@@ -86,6 +94,11 @@ def untar(file)
86
94
 
87
95
  dir
88
96
  end
97
+
98
+ def prepare_and_build_package(package)
99
+ package.prepare
100
+ Rake::Task["#{package.name}-build"].invoke
101
+ end
89
102
  end
90
103
  end
91
104
 
@@ -0,0 +1,105 @@
1
+ module Autobuild
2
+ # Control of the test facility for a package
3
+ class TestUtility < Utility
4
+ @coverage_enabled = false
5
+
6
+ # Whether coverage is enabled for all tests
7
+ def self.coverage_enabled?
8
+ @coverage_enabled
9
+ end
10
+
11
+ # Enable code coverage for all tests
12
+ def self.coverage_enabled=(flag)
13
+ @coverage_enabled = flag
14
+ end
15
+
16
+ def initialize(name, package, install_on_error: true)
17
+ super(name, package, install_on_error: install_on_error)
18
+ @coverage_enabled = nil
19
+ @coverage_source_dir = nil
20
+ @coverage_target_dir = nil
21
+ end
22
+
23
+ # Whether code coverage should be generated for these tests
24
+ def coverage_enabled?
25
+ if @coverage_enabled.nil?
26
+ TestUtility.coverage_enabled?
27
+ else @coverage_enabled
28
+ end
29
+ end
30
+
31
+ def coverage_available?
32
+ !!@coverage_source_dir
33
+ end
34
+
35
+ # Controls whether code coverage should be measured
36
+ #
37
+ # @param [Boolean,nil] flag enable or disable code coverage. If set to
38
+ # nil, will use the default from {TestUtility.coverage?}
39
+ def coverage_enabled=(flag)
40
+ @coverage_enabled = flag
41
+ end
42
+
43
+ # Where the code coverage will be generated
44
+ #
45
+ # If left unset, {Utility#source_dir} will be used instead. Relative
46
+ # paths are resolved relative to {Package#builddir}
47
+ attr_writer :coverage_source_dir
48
+
49
+ # The full path to the coverage information
50
+ #
51
+ # It cannot be a subdirectory of {#source_dir}
52
+ #
53
+ # @return [String]
54
+ def coverage_source_dir
55
+ if @coverage_source_dir
56
+ relative = if package.respond_to?(:builddir)
57
+ package.builddir
58
+ else package.srcdir
59
+ end
60
+ File.expand_path(@coverage_source_dir, relative)
61
+ end
62
+ end
63
+
64
+ # Where the code coverage will be generated
65
+ #
66
+ # If left unset, {Utility#target_dir}/coverage will be used instead.
67
+ # Relative paths are resolved relative to {Package#prefix}
68
+ attr_writer :coverage_target_dir
69
+
70
+ # Where the coverage information should be installed
71
+ #
72
+ # It is the same than {Utility#target_dir}/coverage by default
73
+ #
74
+ # @return [String]
75
+ def coverage_target_dir
76
+ if @coverage_target_dir
77
+ File.expand_path(@coverage_target_dir, package.prefix)
78
+ else File.join(target_dir, 'coverage')
79
+ end
80
+ end
81
+
82
+ def install
83
+ super
84
+
85
+ if !coverage_enabled?
86
+ return
87
+ elsif !coverage_available?
88
+ package.warn "%s: #coverage_source_dir not set on #test_utility, skipping installation of the code coverage results"
89
+ end
90
+
91
+ coverage_target_dir = self.coverage_target_dir
92
+ coverage_source_dir = self.coverage_source_dir
93
+ if "#{coverage_source_dir}/".start_with?("#{source_dir}/")
94
+ raise ArgumentError, "#coverage_source_dir cannot be a subdirectory of #source_dir in #{package.name}"
95
+ elsif target_dir == coverage_target_dir
96
+ raise ArgumentError, "#coverage_target_dir cannot be the same than of #target_dir in #{package.name}"
97
+ end
98
+
99
+ FileUtils.mkdir_p File.dirname(coverage_target_dir)
100
+ FileUtils.cp_r coverage_source_dir, coverage_target_dir
101
+ package.message "%s: copied test coverage results for #{package.name} from #{coverage_source_dir} to #{coverage_target_dir}"
102
+ end
103
+ end
104
+ end
105
+
@@ -27,7 +27,7 @@ def find_in_path(file, envvar = 'PATH')
27
27
  end
28
28
 
29
29
  # Resolves the absolute path to a given tool
30
- def tool_in_path(name)
30
+ def tool_in_path(name, env: self.env)
31
31
  path, path_name, path_env = programs_in_path[name]
32
32
  current = tool(name)
33
33
  env_PATH = env.resolved_env['PATH']
@@ -85,7 +85,9 @@ def task(&block)
85
85
  if enabled?
86
86
  @installed = false
87
87
  catch(:disabled) do
88
- package.isolate_errors { call_task_block(&block) }
88
+ package.isolate_errors do
89
+ call_task_block(&block)
90
+ end
89
91
  end
90
92
  end
91
93
  end
@@ -161,7 +163,7 @@ def install
161
163
  FileUtils.rm_rf target_dir
162
164
  FileUtils.mkdir_p File.dirname(target_dir)
163
165
  FileUtils.cp_r source_dir, target_dir
164
- Autoproj.message " copied #{name} results for #{package.name} to #{target_dir}"
166
+ Autoproj.message " copied #{name} results for #{package.name} from #{source_dir} to #{target_dir}"
165
167
 
166
168
  @installed = true
167
169
  end
@@ -1,5 +1,5 @@
1
1
  module Autobuild
2
- VERSION = "1.10.0.rc14" unless defined? Autobuild::VERSION
2
+ VERSION = "1.10.0.rc15" unless defined? Autobuild::VERSION
3
3
  end
4
4
 
5
5
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: autobuild
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.10.0.rc14
4
+ version: 1.10.0.rc15
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sylvain Joyeux
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-08-24 00:00:00.000000000 Z
11
+ date: 2016-09-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -197,6 +197,7 @@ files:
197
197
  - lib/autobuild/reporting.rb
198
198
  - lib/autobuild/subcommand.rb
199
199
  - lib/autobuild/test.rb
200
+ - lib/autobuild/test_utility.rb
200
201
  - lib/autobuild/timestamps.rb
201
202
  - lib/autobuild/tools.rb
202
203
  - lib/autobuild/utility.rb