autobuild 1.17.0 → 1.21.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.
- checksums.yaml +4 -4
- data/.rubocop.yml +107 -0
- data/.travis.yml +3 -2
- data/Gemfile +2 -1
- data/Rakefile +1 -4
- data/autobuild.gemspec +18 -13
- data/bin/autobuild +4 -3
- data/lib/autobuild.rb +4 -5
- data/lib/autobuild/build_logfile.rb +6 -4
- data/lib/autobuild/config.rb +104 -41
- data/lib/autobuild/configurable.rb +32 -18
- data/lib/autobuild/environment.rb +126 -120
- data/lib/autobuild/exceptions.rb +48 -31
- data/lib/autobuild/import/archive.rb +134 -82
- data/lib/autobuild/import/cvs.rb +28 -24
- data/lib/autobuild/import/darcs.rb +13 -16
- data/lib/autobuild/import/git-lfs.rb +37 -30
- data/lib/autobuild/import/git.rb +246 -182
- data/lib/autobuild/import/hg.rb +23 -18
- data/lib/autobuild/import/svn.rb +48 -29
- data/lib/autobuild/importer.rb +534 -499
- data/lib/autobuild/mail_reporter.rb +77 -77
- data/lib/autobuild/package.rb +200 -122
- data/lib/autobuild/packages/autotools.rb +47 -42
- data/lib/autobuild/packages/cmake.rb +77 -65
- data/lib/autobuild/packages/dummy.rb +9 -8
- data/lib/autobuild/packages/genom.rb +1 -1
- data/lib/autobuild/packages/gnumake.rb +74 -31
- data/lib/autobuild/packages/import.rb +2 -6
- data/lib/autobuild/packages/orogen.rb +32 -31
- data/lib/autobuild/packages/pkgconfig.rb +2 -2
- data/lib/autobuild/packages/python.rb +12 -8
- data/lib/autobuild/packages/ruby.rb +22 -17
- data/lib/autobuild/parallel.rb +50 -46
- data/lib/autobuild/pkgconfig.rb +25 -13
- data/lib/autobuild/progress_display.rb +149 -64
- data/lib/autobuild/rake_task_extension.rb +12 -7
- data/lib/autobuild/reporting.rb +51 -26
- data/lib/autobuild/subcommand.rb +72 -65
- data/lib/autobuild/test.rb +9 -7
- data/lib/autobuild/test_utility.rb +12 -10
- data/lib/autobuild/timestamps.rb +28 -23
- data/lib/autobuild/tools.rb +17 -16
- data/lib/autobuild/utility.rb +67 -23
- data/lib/autobuild/version.rb +1 -1
- metadata +53 -37
@@ -10,18 +10,17 @@ module Autobuild
|
|
10
10
|
def self.autotools(opts, &proc)
|
11
11
|
Autotools.new(opts, &proc)
|
12
12
|
end
|
13
|
-
|
14
|
-
if Autobuild.macos?
|
15
|
-
Autobuild.programs['libtoolize'] = "glibtoolize"
|
16
|
-
end
|
17
13
|
|
18
|
-
|
14
|
+
Autobuild.programs['libtoolize'] = "glibtoolize" if Autobuild.macos?
|
15
|
+
|
16
|
+
#
|
19
17
|
# ==== Handles autotools-based packages
|
20
18
|
#
|
21
19
|
# == Used programs (see <tt>Autobuild.programs</tt>)
|
22
|
-
# Autotools will use the 'aclocal', 'autoheader', 'autoconf', 'automake'
|
23
|
-
# programs defined on Autobuild.programs. autoheader and bear
|
24
|
-
# aclocal, autoconf and automake use are
|
20
|
+
# Autotools will use the 'aclocal', 'autoheader', 'autoconf', 'automake'
|
21
|
+
# and 'bear' programs defined on Autobuild.programs. autoheader and bear
|
22
|
+
# are disabled by default, aclocal, autoconf and automake use are
|
23
|
+
# autodetected.
|
25
24
|
#
|
26
25
|
# To override this default behaviour on a per-package basis, use Autotools#use
|
27
26
|
#
|
@@ -47,10 +46,13 @@ def self.enable_bear_globally=(flag)
|
|
47
46
|
|
48
47
|
def using_bear?
|
49
48
|
return Autotools.enable_bear_globally? if using[:bear].nil?
|
49
|
+
|
50
50
|
using[:bear]
|
51
51
|
end
|
52
52
|
|
53
|
-
def configurestamp
|
53
|
+
def configurestamp
|
54
|
+
"#{builddir}/config.status"
|
55
|
+
end
|
54
56
|
|
55
57
|
def initialize(options)
|
56
58
|
@using = Hash.new
|
@@ -66,11 +68,14 @@ def initialize(options)
|
|
66
68
|
|
67
69
|
def common_utility_handling(utility, target)
|
68
70
|
utility.task do
|
69
|
-
progress_start "generating documentation for %s",
|
71
|
+
progress_start "generating documentation for %s",
|
72
|
+
done_message: 'generated documentation for %s' do
|
70
73
|
if internal_doxygen_mode?
|
71
74
|
run_doxygen
|
72
75
|
else
|
73
|
-
run(utility.name,
|
76
|
+
run(utility.name,
|
77
|
+
Autobuild.tool(:make), "-j#{parallel_build_level}",
|
78
|
+
target, working_directory: builddir)
|
74
79
|
end
|
75
80
|
yield if block_given?
|
76
81
|
end
|
@@ -117,10 +122,9 @@ def use(*programs)
|
|
117
122
|
programs
|
118
123
|
end
|
119
124
|
|
120
|
-
|
121
|
-
programs = Array[*programs].
|
125
|
+
unless programs.kind_of?(Hash)
|
126
|
+
programs = Array[*programs].each_with_object({}) do |spec, progs|
|
122
127
|
progs[spec.first] = spec.last
|
123
|
-
progs
|
124
128
|
end
|
125
129
|
end
|
126
130
|
programs.each do |name, opt|
|
@@ -140,9 +144,7 @@ def prepare_for_forced_build
|
|
140
144
|
|
141
145
|
if using[:automake]
|
142
146
|
Find.find(srcdir) do |path|
|
143
|
-
if File.basename(path) == "Makefile.in"
|
144
|
-
FileUtils.rm_f path
|
145
|
-
end
|
147
|
+
FileUtils.rm_f(path) if File.basename(path) == "Makefile.in"
|
146
148
|
end
|
147
149
|
end
|
148
150
|
|
@@ -161,7 +163,6 @@ def import(options = Hash.new)
|
|
161
163
|
is_checking_out = !File.directory?(srcdir)
|
162
164
|
|
163
165
|
super
|
164
|
-
|
165
166
|
ensure
|
166
167
|
if is_checking_out && File.directory?(srcdir)
|
167
168
|
FileUtils.touch File.join(srcdir, ".fresh_checkout")
|
@@ -190,7 +191,9 @@ def prepare
|
|
190
191
|
if output && (match = /with options "(.*)"/.match(output))
|
191
192
|
options = Shellwords.shellwords(match[1])
|
192
193
|
else
|
193
|
-
raise UnexpectedConfigStatusOutput, "invalid output of
|
194
|
+
raise UnexpectedConfigStatusOutput, "invalid output of "\
|
195
|
+
"config.status --version, expected a line with "\
|
196
|
+
"`with options \"OPTIONS\"`"
|
194
197
|
end
|
195
198
|
|
196
199
|
# Add the --prefix option to the configureflags array
|
@@ -205,8 +208,8 @@ def prepare
|
|
205
208
|
else
|
206
209
|
# This is an envvar entry. Ignore it if it is not
|
207
210
|
# explicitely given in configureflags
|
208
|
-
varname,
|
209
|
-
if current_flag = testflags.find { |fl| fl =~ /^#{varname}=/ }
|
211
|
+
varname, = o.split("=").first
|
212
|
+
if (current_flag = testflags.find { |fl| fl =~ /^#{varname}=/ })
|
210
213
|
current_flag != o
|
211
214
|
else false
|
212
215
|
end
|
@@ -215,7 +218,8 @@ def prepare
|
|
215
218
|
new_opt = testflags.find { |o| !options.include?(o) }
|
216
219
|
if old_opt || new_opt
|
217
220
|
if Autobuild.verbose
|
218
|
-
Autobuild.message "forcing reconfiguration of #{name}
|
221
|
+
Autobuild.message "forcing reconfiguration of #{name} "\
|
222
|
+
"(#{old_opt} != #{new_opt})"
|
219
223
|
end
|
220
224
|
FileUtils.rm_f configurestamp # to force reconfiguration
|
221
225
|
end
|
@@ -240,16 +244,15 @@ def tool_program(tool)
|
|
240
244
|
# In general, you should not need that.
|
241
245
|
attr_accessor :force_config_status
|
242
246
|
|
243
|
-
|
244
|
-
def autodetect_needed_stages
|
247
|
+
private def autodetect_needed_stages
|
245
248
|
# Autodetect autoconf/aclocal/automake
|
246
249
|
#
|
247
250
|
# Let the user disable the use of autoconf explicitely by using 'false'.
|
248
251
|
# 'nil' means autodetection
|
249
252
|
if using[:autoconf].nil?
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
+
has_configure_in = %w[configure.in configure.ac].
|
254
|
+
any? { |p| File.file?(File.join(srcdir, p)) }
|
255
|
+
using[:autoconf] = true if has_configure_in
|
253
256
|
end
|
254
257
|
using[:aclocal] = using[:autoconf] if using[:aclocal].nil?
|
255
258
|
if using[:automake].nil?
|
@@ -261,7 +264,8 @@ def autodetect_needed_stages
|
|
261
264
|
end
|
262
265
|
|
263
266
|
if using[:autogen].nil?
|
264
|
-
using[:autogen] = %w
|
267
|
+
using[:autogen] = %w[autogen autogen.sh]
|
268
|
+
.find { |f| File.exist?(File.join(srcdir, f)) }
|
265
269
|
end
|
266
270
|
end
|
267
271
|
|
@@ -270,21 +274,23 @@ def create_regen_target(confsource = nil)
|
|
270
274
|
conffile = "#{srcdir}/configure"
|
271
275
|
if confsource
|
272
276
|
file conffile => confsource
|
273
|
-
elsif confext = %w
|
277
|
+
elsif (confext = %w[.ac .in].find { |ext| File.exist?("#{conffile}#{ext}") })
|
274
278
|
file conffile => "#{conffile}#{confext}"
|
275
279
|
elsif using[:autoconf]
|
276
|
-
raise PackageException.new(self, 'prepare'),
|
280
|
+
raise PackageException.new(self, 'prepare'),
|
281
|
+
"neither configure.ac nor configure.in present in #{srcdir}"
|
277
282
|
end
|
278
283
|
|
279
284
|
file conffile do
|
280
285
|
isolate_errors do
|
281
|
-
progress_start "generating autotools for %s",
|
286
|
+
progress_start "generating autotools for %s",
|
287
|
+
done_message: 'generated autotools for %s' do
|
282
288
|
regen
|
283
289
|
end
|
284
290
|
end
|
285
291
|
end
|
286
292
|
|
287
|
-
|
293
|
+
conffile
|
288
294
|
end
|
289
295
|
|
290
296
|
def regen
|
@@ -296,8 +302,9 @@ def regen
|
|
296
302
|
run 'configure', File.expand_path(using[:autogen], srcdir),
|
297
303
|
working_directory: srcdir
|
298
304
|
else
|
299
|
-
[
|
305
|
+
%i[aclocal autoconf autoheader automake].each do |tool|
|
300
306
|
next unless using[tool]
|
307
|
+
|
301
308
|
run 'configure', tool_program(tool), *send("#{tool}_flags"),
|
302
309
|
working_directory: srcdir
|
303
310
|
end
|
@@ -307,14 +314,13 @@ def regen
|
|
307
314
|
# Configure the builddir directory before starting make
|
308
315
|
def configure
|
309
316
|
super do
|
310
|
-
command = [
|
311
|
-
if force_config_status
|
312
|
-
command << "--no-create"
|
313
|
-
end
|
317
|
+
command = ["#{srcdir}/configure"]
|
318
|
+
command << "--no-create" if force_config_status
|
314
319
|
command << "--prefix=#{prefix}"
|
315
320
|
command += configureflags.flatten
|
316
321
|
|
317
|
-
progress_start "configuring autotools for %s",
|
322
|
+
progress_start "configuring autotools for %s",
|
323
|
+
done_message: 'configured autotools for %s' do
|
318
324
|
run('configure', *command, working_directory: builddir)
|
319
325
|
end
|
320
326
|
end
|
@@ -323,10 +329,9 @@ def configure
|
|
323
329
|
# Do the build in builddir
|
324
330
|
def build
|
325
331
|
in_dir(builddir) do
|
326
|
-
progress_start "building %s [progress not available]",
|
327
|
-
|
328
|
-
|
329
|
-
end
|
332
|
+
progress_start "building %s [progress not available]",
|
333
|
+
done_message: 'built %s' do
|
334
|
+
run('build', './config.status') if force_config_status
|
330
335
|
|
331
336
|
build_options = []
|
332
337
|
if using_bear?
|
@@ -9,10 +9,18 @@ def self.cmake(options, &block)
|
|
9
9
|
# Handler class to build CMake-based packages
|
10
10
|
class CMake < Configurable
|
11
11
|
class << self
|
12
|
-
def builddir
|
12
|
+
def builddir
|
13
|
+
@builddir || Configurable.builddir
|
14
|
+
end
|
15
|
+
|
13
16
|
def builddir=(new)
|
14
|
-
|
15
|
-
|
17
|
+
if Pathname.new(new).absolute?
|
18
|
+
raise ConfigException, "absolute builddirs are not supported"
|
19
|
+
end
|
20
|
+
if new.nil? || new.empty?
|
21
|
+
raise ConfigException, "builddir must be non-nil and non-empty"
|
22
|
+
end
|
23
|
+
|
16
24
|
@builddir = new
|
17
25
|
end
|
18
26
|
|
@@ -67,7 +75,7 @@ def all_defines
|
|
67
75
|
# If true, always run cmake before make during the build
|
68
76
|
attr_accessor :always_reconfigure
|
69
77
|
# If true, we always remove the CMake cache before reconfiguring.
|
70
|
-
#
|
78
|
+
#
|
71
79
|
# See #full_reconfigures? for more details
|
72
80
|
attr_writer :full_reconfigures
|
73
81
|
# Sets a generator explicitely for this component. See #generator and
|
@@ -77,9 +85,7 @@ def all_defines
|
|
77
85
|
# Makefiles. If not set for this package explicitely, it is using the
|
78
86
|
# global value CMake.generator.
|
79
87
|
def generator
|
80
|
-
|
81
|
-
else CMake.generator
|
82
|
-
end
|
88
|
+
@generator || CMake.generator
|
83
89
|
end
|
84
90
|
|
85
91
|
# If true, we always remove the CMake cache before reconfiguring. This
|
@@ -96,13 +102,19 @@ def full_reconfigures?
|
|
96
102
|
end
|
97
103
|
end
|
98
104
|
|
99
|
-
def cmake_cache
|
100
|
-
|
105
|
+
def cmake_cache
|
106
|
+
File.join(builddir, "CMakeCache.txt")
|
107
|
+
end
|
108
|
+
|
109
|
+
def configurestamp
|
110
|
+
cmake_cache
|
111
|
+
end
|
101
112
|
|
102
113
|
def initialize(options)
|
103
114
|
@defines = Hash.new
|
104
115
|
super
|
105
|
-
@delete_obsolete_files_in_prefix = self.class.
|
116
|
+
@delete_obsolete_files_in_prefix = self.class.
|
117
|
+
delete_obsolete_files_in_prefix?
|
106
118
|
end
|
107
119
|
|
108
120
|
# (see CMake.delete_obsolete_files_in_prefix?)
|
@@ -111,9 +123,7 @@ def delete_obsolete_files_in_prefix?
|
|
111
123
|
end
|
112
124
|
|
113
125
|
# (see CMake.delete_obsolete_files_in_prefix=)
|
114
|
-
|
115
|
-
@delete_obsolete_files_in_prefix = flag
|
116
|
-
end
|
126
|
+
attr_writer :delete_obsolete_files_in_prefix
|
117
127
|
|
118
128
|
@@defines = Hash.new
|
119
129
|
|
@@ -132,7 +142,6 @@ def self.define(name, value)
|
|
132
142
|
end
|
133
143
|
end
|
134
144
|
|
135
|
-
|
136
145
|
def define(name, value)
|
137
146
|
@defines[name] =
|
138
147
|
if value.respond_to?(:to_str)
|
@@ -145,12 +154,12 @@ def define(name, value)
|
|
145
154
|
end
|
146
155
|
|
147
156
|
DOXYGEN_ACCEPTED_VARIABLES = {
|
148
|
-
'@CMAKE_SOURCE_DIR@' =>
|
149
|
-
'@PROJECT_SOURCE_DIR@' =>
|
150
|
-
'@CMAKE_BINARY_DIR@' =>
|
151
|
-
'@PROJECT_BINARY_DIR@' =>
|
152
|
-
'@PROJECT_NAME@' =>
|
153
|
-
}
|
157
|
+
'@CMAKE_SOURCE_DIR@' => ->(pkg) { pkg.srcdir },
|
158
|
+
'@PROJECT_SOURCE_DIR@' => ->(pkg) { pkg.srcdir },
|
159
|
+
'@CMAKE_BINARY_DIR@' => ->(pkg) { pkg.builddir },
|
160
|
+
'@PROJECT_BINARY_DIR@' => ->(pkg) { pkg.builddir },
|
161
|
+
'@PROJECT_NAME@' => ->(pkg) { pkg.name }
|
162
|
+
}.freeze
|
154
163
|
|
155
164
|
class << self
|
156
165
|
# Flag controlling whether autobuild should run doxygen itself or
|
@@ -197,7 +206,7 @@ def always_use_doc_target?
|
|
197
206
|
# for a global control of that feature
|
198
207
|
def always_use_doc_target?
|
199
208
|
if @always_use_doc_target.nil?
|
200
|
-
|
209
|
+
CMake.always_use_doc_target?
|
201
210
|
else
|
202
211
|
@always_use_doc_target
|
203
212
|
end
|
@@ -215,17 +224,14 @@ def always_use_doc_target?
|
|
215
224
|
# This method returns true if the package can use the internal doxygen
|
216
225
|
# mode and false otherwise
|
217
226
|
def internal_doxygen_mode?
|
218
|
-
if always_use_doc_target?
|
219
|
-
return false
|
220
|
-
end
|
227
|
+
return false if always_use_doc_target?
|
221
228
|
|
222
229
|
doxyfile_in = File.join(srcdir, "Doxyfile.in")
|
223
|
-
|
224
|
-
|
225
|
-
end
|
230
|
+
return false unless File.file?(doxyfile_in)
|
231
|
+
|
226
232
|
File.readlines(doxyfile_in).each do |line|
|
227
233
|
matches = line.scan(/@[^@]+@/)
|
228
|
-
if matches.any? { |str| !DOXYGEN_ACCEPTED_VARIABLES.
|
234
|
+
if matches.any? { |str| !DOXYGEN_ACCEPTED_VARIABLES.key?(str) }
|
229
235
|
return false
|
230
236
|
end
|
231
237
|
end
|
@@ -245,11 +251,14 @@ def internal_doxygen_mode?
|
|
245
251
|
# support cannot be used on this package
|
246
252
|
def run_doxygen
|
247
253
|
doxyfile_in = File.join(srcdir, "Doxyfile.in")
|
248
|
-
|
249
|
-
raise
|
254
|
+
unless File.file?(doxyfile_in)
|
255
|
+
raise "no Doxyfile.in in this package, "\
|
256
|
+
"cannot use the internal doxygen support"
|
250
257
|
end
|
251
258
|
doxyfile_data = File.readlines(doxyfile_in).map do |line|
|
252
|
-
line.gsub(/@[^@]+@/)
|
259
|
+
line.gsub(/@[^@]+@/) do |match|
|
260
|
+
DOXYGEN_ACCEPTED_VARIABLES[match].call(self)
|
261
|
+
end
|
253
262
|
end
|
254
263
|
doxyfile = File.join(builddir, "Doxyfile")
|
255
264
|
File.open(doxyfile, 'w') do |io|
|
@@ -296,7 +305,7 @@ def with_tests(target = 'test', &block)
|
|
296
305
|
'YES' => 'ON',
|
297
306
|
'OFF' => 'OFF',
|
298
307
|
'NO' => 'OFF'
|
299
|
-
}
|
308
|
+
}.freeze
|
300
309
|
def equivalent_option_value?(old, new)
|
301
310
|
if old == new
|
302
311
|
true
|
@@ -331,7 +340,7 @@ def prefix_path
|
|
331
340
|
raw = (dependencies.map { |pkg_name| Autobuild::Package[pkg_name].prefix } +
|
332
341
|
CMake.prefix_path)
|
333
342
|
raw.each do |path|
|
334
|
-
|
343
|
+
unless seen.include?(path)
|
335
344
|
seen << path
|
336
345
|
result << path
|
337
346
|
end
|
@@ -348,17 +357,20 @@ def update_environment
|
|
348
357
|
|
349
358
|
def defines_changed?(all_defines, cache_data)
|
350
359
|
all_defines.any? do |name, value|
|
351
|
-
if match = /^#{name}:\w+=(.*)$/.match(cache_data)
|
360
|
+
if (match = /^#{name}:\w+=(.*)$/.match(cache_data))
|
352
361
|
old_value = match[1]
|
353
362
|
end
|
354
363
|
|
355
364
|
value = value.to_s
|
356
365
|
if !old_value || !equivalent_option_value?(old_value, value)
|
357
366
|
if Autobuild.debug
|
358
|
-
message "%s: option '#{name}' changed value:
|
367
|
+
message "%s: option '#{name}' changed value: "\
|
368
|
+
"'#{old_value}' => '#{value}'"
|
359
369
|
end
|
370
|
+
|
360
371
|
if old_value
|
361
|
-
message "%s: changed value of #{name}
|
372
|
+
message "%s: changed value of #{name} "\
|
373
|
+
"from #{old_value} to #{value}"
|
362
374
|
else
|
363
375
|
message "%s: setting value of #{name} to #{value}"
|
364
376
|
end
|
@@ -373,8 +385,8 @@ def prepare
|
|
373
385
|
# but no Makefile.
|
374
386
|
#
|
375
387
|
# Delete the CMakeCache to force reconfiguration
|
376
|
-
|
377
|
-
FileUtils.rm_f
|
388
|
+
unless File.exist?(File.join(builddir, 'Makefile'))
|
389
|
+
FileUtils.rm_f(cmake_cache)
|
378
390
|
end
|
379
391
|
|
380
392
|
doc_utility.source_ref_dir = builddir
|
@@ -396,29 +408,27 @@ def prepare
|
|
396
408
|
def configure
|
397
409
|
super do
|
398
410
|
in_dir(builddir) do
|
399
|
-
|
400
|
-
raise ConfigException.new(self, 'configure'),
|
411
|
+
unless File.file?(File.join(srcdir, 'CMakeLists.txt'))
|
412
|
+
raise ConfigException.new(self, 'configure'),
|
413
|
+
"#{srcdir} contains no CMakeLists.txt file"
|
401
414
|
end
|
402
415
|
|
403
|
-
command = [
|
416
|
+
command = ["cmake"]
|
404
417
|
|
405
418
|
if Autobuild.windows?
|
406
|
-
command << '-G'
|
419
|
+
command << '-G'
|
407
420
|
command << "MSYS Makefiles"
|
408
421
|
end
|
409
422
|
|
410
423
|
all_defines.each do |name, value|
|
411
424
|
command << "-D#{name}=#{value}"
|
412
425
|
end
|
413
|
-
if generator
|
414
|
-
command << Array(generator).map { |g| "-G#{g}" }
|
415
|
-
end
|
426
|
+
command << Array(generator).map { |g| "-G#{g}" } if generator
|
416
427
|
command << srcdir
|
417
|
-
|
418
|
-
progress_start "configuring CMake for %s",
|
419
|
-
|
420
|
-
|
421
|
-
end
|
428
|
+
|
429
|
+
progress_start "configuring CMake for %s",
|
430
|
+
done_message: "configured CMake for %s" do
|
431
|
+
FileUtils.rm_f cmake_cache if full_reconfigures?
|
422
432
|
run('configure', *command)
|
423
433
|
end
|
424
434
|
end
|
@@ -432,9 +442,7 @@ def show_make_messages?
|
|
432
442
|
end
|
433
443
|
end
|
434
444
|
|
435
|
-
|
436
|
-
@show_make_messages = value
|
437
|
-
end
|
445
|
+
attr_writer :show_make_messages
|
438
446
|
|
439
447
|
def self.show_make_messages?
|
440
448
|
@show_make_messages
|
@@ -446,7 +454,7 @@ def self.show_make_messages=(value)
|
|
446
454
|
|
447
455
|
# Do the build in builddir
|
448
456
|
def build
|
449
|
-
current_message =
|
457
|
+
current_message = +""
|
450
458
|
in_dir(builddir) do
|
451
459
|
progress_start "building %s" do
|
452
460
|
if always_reconfigure || !File.file?('Makefile')
|
@@ -459,9 +467,7 @@ def build
|
|
459
467
|
if line =~ /\[\s*(\d+)%\]/
|
460
468
|
progress "building %s (#{Integer($1)}%)"
|
461
469
|
elsif line !~ /^(?:Generating|Linking|Scanning|Building|Built)/
|
462
|
-
if line =~ /warning/
|
463
|
-
warning_count += 1
|
464
|
-
end
|
470
|
+
warning_count += 1 if line =~ /warning/
|
465
471
|
if show_make_messages?
|
466
472
|
current_message += line + "\n"
|
467
473
|
needs_display = true
|
@@ -478,7 +484,8 @@ def build
|
|
478
484
|
message "%s: #{l}", :magenta
|
479
485
|
end
|
480
486
|
if warning_count > 0
|
481
|
-
|
487
|
+
msg_warning = Autoproj.color("(#{warning_count} warnings)", :bold)
|
488
|
+
progress_done "built %s #{msg_warning}"
|
482
489
|
else
|
483
490
|
progress_done "built %s"
|
484
491
|
end
|
@@ -498,13 +505,12 @@ def build
|
|
498
505
|
# in the prefix but not in CMake's install manifest will be removed.
|
499
506
|
def install
|
500
507
|
in_dir(builddir) do
|
501
|
-
progress_start "installing %s", :
|
502
|
-
run('install', Autobuild.tool(:make),
|
508
|
+
progress_start "installing %s", done_message: 'installed %s' do
|
509
|
+
run('install', Autobuild.tool(:make),
|
510
|
+
"-j#{parallel_build_level}", 'install')
|
503
511
|
end
|
504
512
|
|
505
|
-
if delete_obsolete_files_in_prefix?
|
506
|
-
delete_obsolete_files
|
507
|
-
end
|
513
|
+
delete_obsolete_files if delete_obsolete_files_in_prefix?
|
508
514
|
end
|
509
515
|
super
|
510
516
|
end
|
@@ -520,7 +526,8 @@ def install
|
|
520
526
|
def delete_obsolete_files
|
521
527
|
# The expand_path is required to sanitize the paths, which can
|
522
528
|
# contain e.g. double //
|
523
|
-
|
529
|
+
cmake_install_manifest = File.join(builddir, 'install_manifest.txt')
|
530
|
+
manifest_contents = File.readlines(cmake_install_manifest).
|
524
531
|
map { |p| File.expand_path(p.chomp) }.to_set
|
525
532
|
logdir = self.logdir
|
526
533
|
counter = 0
|
@@ -535,6 +542,11 @@ def delete_obsolete_files
|
|
535
542
|
message "%s: removed #{counter} obsolete files from prefix (cmake)"
|
536
543
|
end
|
537
544
|
end
|
545
|
+
|
546
|
+
def self_fingerprint
|
547
|
+
return unless (base = super)
|
548
|
+
all_defines = self.class.defines.merge(self.defines).sort_by(&:first)
|
549
|
+
Digest::SHA1.hexdigest(base + all_defines.join(""))
|
550
|
+
end
|
538
551
|
end
|
539
552
|
end
|
540
|
-
|