diff options
-rw-r--r-- | bitbake/lib/bb/siggen.py | 60 |
1 files changed, 49 insertions, 11 deletions
diff --git a/bitbake/lib/bb/siggen.py b/bitbake/lib/bb/siggen.py index d8ba1d47a3..2f0fb71c78 100644 --- a/bitbake/lib/bb/siggen.py +++ b/bitbake/lib/bb/siggen.py | |||
@@ -248,6 +248,7 @@ class SignatureGeneratorBasic(SignatureGenerator): | |||
248 | bb.utils.mkdirhier(os.path.dirname(sigfile)) | 248 | bb.utils.mkdirhier(os.path.dirname(sigfile)) |
249 | 249 | ||
250 | data = {} | 250 | data = {} |
251 | data['task'] = task | ||
251 | data['basewhitelist'] = self.basewhitelist | 252 | data['basewhitelist'] = self.basewhitelist |
252 | data['taskwhitelist'] = self.taskwhitelist | 253 | data['taskwhitelist'] = self.taskwhitelist |
253 | data['taskdeps'] = self.taskdeps[fn][task] | 254 | data['taskdeps'] = self.taskdeps[fn][task] |
@@ -267,6 +268,7 @@ class SignatureGeneratorBasic(SignatureGenerator): | |||
267 | data['runtaskhashes'] = {} | 268 | data['runtaskhashes'] = {} |
268 | for dep in data['runtaskdeps']: | 269 | for dep in data['runtaskdeps']: |
269 | data['runtaskhashes'][dep] = self.taskhash[dep] | 270 | data['runtaskhashes'][dep] = self.taskhash[dep] |
271 | data['taskhash'] = self.taskhash[k] | ||
270 | 272 | ||
271 | taint = self.read_taint(fn, task, stampbase) | 273 | taint = self.read_taint(fn, task, stampbase) |
272 | if taint: | 274 | if taint: |
@@ -290,6 +292,15 @@ class SignatureGeneratorBasic(SignatureGenerator): | |||
290 | pass | 292 | pass |
291 | raise err | 293 | raise err |
292 | 294 | ||
295 | computed_basehash = calc_basehash(data) | ||
296 | if computed_basehash != self.basehash[k]: | ||
297 | bb.error("Basehash mismatch %s verses %s for %s" % (computed_basehash, self.basehash[k], k)) | ||
298 | if k in self.taskhash: | ||
299 | computed_taskhash = calc_taskhash(data) | ||
300 | if computed_taskhash != self.taskhash[k]: | ||
301 | bb.error("Taskhash mismatch %s verses %s for %s" % (computed_taskhash, self.taskhash[k], k)) | ||
302 | |||
303 | |||
293 | def dump_sigs(self, dataCache, options): | 304 | def dump_sigs(self, dataCache, options): |
294 | for fn in self.taskdeps: | 305 | for fn in self.taskdeps: |
295 | for task in self.taskdeps[fn]: | 306 | for task in self.taskdeps[fn]: |
@@ -506,6 +517,37 @@ def compare_sigfiles(a, b, recursecb = None): | |||
506 | return output | 517 | return output |
507 | 518 | ||
508 | 519 | ||
520 | def calc_basehash(sigdata): | ||
521 | task = sigdata['task'] | ||
522 | basedata = sigdata['varvals'][task] | ||
523 | |||
524 | if basedata is None: | ||
525 | basedata = '' | ||
526 | |||
527 | alldeps = sigdata['taskdeps'] | ||
528 | for dep in alldeps: | ||
529 | basedata = basedata + dep | ||
530 | val = sigdata['varvals'][dep] | ||
531 | if val is not None: | ||
532 | basedata = basedata + str(val) | ||
533 | |||
534 | return hashlib.md5(basedata).hexdigest() | ||
535 | |||
536 | def calc_taskhash(sigdata): | ||
537 | data = sigdata['basehash'] | ||
538 | |||
539 | for dep in sigdata['runtaskdeps']: | ||
540 | data = data + sigdata['runtaskhashes'][dep] | ||
541 | |||
542 | for c in sigdata['file_checksum_values']: | ||
543 | data = data + c[1] | ||
544 | |||
545 | if 'taint' in sigdata: | ||
546 | data = data + sigdata['taint'] | ||
547 | |||
548 | return hashlib.md5(data).hexdigest() | ||
549 | |||
550 | |||
509 | def dump_sigfile(a): | 551 | def dump_sigfile(a): |
510 | output = [] | 552 | output = [] |
511 | 553 | ||
@@ -539,17 +581,13 @@ def dump_sigfile(a): | |||
539 | if 'taint' in a_data: | 581 | if 'taint' in a_data: |
540 | output.append("Tainted (by forced/invalidated task): %s" % a_data['taint']) | 582 | output.append("Tainted (by forced/invalidated task): %s" % a_data['taint']) |
541 | 583 | ||
542 | data = a_data['basehash'] | 584 | if 'task' in a_data: |
543 | for dep in a_data['runtaskdeps']: | 585 | computed_basehash = calc_basehash(a_data) |
544 | data = data + a_data['runtaskhashes'][dep] | 586 | output.append("Computed base hash is %s and from file %s" % (computed_basehash, a_data['basehash'])) |
545 | 587 | else: | |
546 | for c in a_data['file_checksum_values']: | 588 | output.append("Unable to compute base hash") |
547 | data = data + c[1] | ||
548 | |||
549 | if 'taint' in a_data: | ||
550 | data = data + a_data['taint'] | ||
551 | 589 | ||
552 | h = hashlib.md5(data).hexdigest() | 590 | computed_taskhash = calc_taskhash(a_data) |
553 | output.append("Computed Hash is %s" % h) | 591 | output.append("Computed task hash is %s" % computed_taskhash) |
554 | 592 | ||
555 | return output | 593 | return output |