summaryrefslogtreecommitdiffstats
path: root/bitbake/lib/bb/siggen.py
diff options
context:
space:
mode:
authorPaul Eggleton <paul.eggleton@linux.intel.com>2012-05-23 00:23:32 +0100
committerRichard Purdie <richard.purdie@linuxfoundation.org>2012-05-23 11:35:04 +0100
commit8b8be74ed21b878b2fe30d5b76ff0648e6e48c18 (patch)
treef1facae6d6803b450185811ca08bf215d6963530 /bitbake/lib/bb/siggen.py
parentd7b818b51f3e6dded0c0885cdfed5a24cda3b428 (diff)
downloadpoky-8b8be74ed21b878b2fe30d5b76ff0648e6e48c18.tar.gz
bitbake: implement checksums for local files in SRC_URI
Gathers a list of paths to have checksums calculated at parse time, and processes these when calculating task hashes. Checksums are cached with the file's current mtime. Thus, changing any local file in SRC_URI will now cause the do_fetch taskhash to change, thus forcing a rebuild. This change adds very roughly about an 8% increase in parse time (a few seconds) and maybe a few seconds during runqueue generation, so a fairly moderate performance hit. Note that since paths are resolved at parse time, this will not force a rebuild when files are introduced which would cause that resolved path to be different - for example, where a machine-specific version of a file was added without otherwise changing the recipe. This will need to be handled in a future update. Code to hook this into the signature generator was courtesy of Richard Purdie <richard.purdie@linuxfoundation.org>. Implements [YOCTO #2044]. (Bitbake rev: c993b7c457f8b7776e8a5dff253bfa0724bc2cae) Signed-off-by: Paul Eggleton <paul.eggleton@linux.intel.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'bitbake/lib/bb/siggen.py')
-rw-r--r--bitbake/lib/bb/siggen.py24
1 files changed, 24 insertions, 0 deletions
diff --git a/bitbake/lib/bb/siggen.py b/bitbake/lib/bb/siggen.py
index 5a0b80e8a9..daf56770f9 100644
--- a/bitbake/lib/bb/siggen.py
+++ b/bitbake/lib/bb/siggen.py
@@ -60,6 +60,7 @@ class SignatureGeneratorBasic(SignatureGenerator):
60 self.taskhash = {} 60 self.taskhash = {}
61 self.taskdeps = {} 61 self.taskdeps = {}
62 self.runtaskdeps = {} 62 self.runtaskdeps = {}
63 self.file_checksum_values = {}
63 self.gendeps = {} 64 self.gendeps = {}
64 self.lookupcache = {} 65 self.lookupcache = {}
65 self.pkgnameextract = re.compile("(?P<fn>.*)\..*") 66 self.pkgnameextract = re.compile("(?P<fn>.*)\..*")
@@ -152,6 +153,7 @@ class SignatureGeneratorBasic(SignatureGenerator):
152 k = fn + "." + task 153 k = fn + "." + task
153 data = dataCache.basetaskhash[k] 154 data = dataCache.basetaskhash[k]
154 self.runtaskdeps[k] = [] 155 self.runtaskdeps[k] = []
156 self.file_checksum_values[k] = {}
155 recipename = dataCache.pkg_fn[fn] 157 recipename = dataCache.pkg_fn[fn]
156 for dep in sorted(deps, key=clean_basepath): 158 for dep in sorted(deps, key=clean_basepath):
157 depname = dataCache.pkg_fn[self.pkgnameextract.search(dep).group('fn')] 159 depname = dataCache.pkg_fn[self.pkgnameextract.search(dep).group('fn')]
@@ -161,6 +163,12 @@ class SignatureGeneratorBasic(SignatureGenerator):
161 bb.fatal("%s is not in taskhash, caller isn't calling in dependency order?", dep) 163 bb.fatal("%s is not in taskhash, caller isn't calling in dependency order?", dep)
162 data = data + self.taskhash[dep] 164 data = data + self.taskhash[dep]
163 self.runtaskdeps[k].append(dep) 165 self.runtaskdeps[k].append(dep)
166
167 if task in dataCache.file_checksums[fn]:
168 checksums = bb.fetch2.get_file_checksums(dataCache.file_checksums[fn][task], recipename)
169 for (f,cs) in checksums:
170 self.file_checksum_values[k][f] = cs
171 data = data + cs
164 h = hashlib.md5(data).hexdigest() 172 h = hashlib.md5(data).hexdigest()
165 self.taskhash[k] = h 173 self.taskhash[k] = h
166 #d.setVar("BB_TASKHASH_task-%s" % task, taskhash[task]) 174 #d.setVar("BB_TASKHASH_task-%s" % task, taskhash[task])
@@ -197,6 +205,7 @@ class SignatureGeneratorBasic(SignatureGenerator):
197 205
198 if runtime and k in self.taskhash: 206 if runtime and k in self.taskhash:
199 data['runtaskdeps'] = self.runtaskdeps[k] 207 data['runtaskdeps'] = self.runtaskdeps[k]
208 data['file_checksum_values'] = self.file_checksum_values[k]
200 data['runtaskhashes'] = {} 209 data['runtaskhashes'] = {}
201 for dep in data['runtaskdeps']: 210 for dep in data['runtaskdeps']:
202 data['runtaskhashes'][dep] = self.taskhash[dep] 211 data['runtaskhashes'][dep] = self.taskhash[dep]
@@ -304,6 +313,18 @@ def compare_sigfiles(a, b):
304 for dep in changed: 313 for dep in changed:
305 print "Variable %s value changed from %s to %s" % (dep, a_data['varvals'][dep], b_data['varvals'][dep]) 314 print "Variable %s value changed from %s to %s" % (dep, a_data['varvals'][dep], b_data['varvals'][dep])
306 315
316 changed, added, removed = dict_diff(a_data['file_checksum_values'], b_data['file_checksum_values'])
317 if changed:
318 for f in changed:
319 print "Checksum for file %s changed from %s to %s" % (f, a_data['file_checksum_values'][f], b_data['file_checksum_values'][f])
320 if added:
321 for f in added:
322 print "Dependency on checksum of file %s was added" % (f)
323 if removed:
324 for f in removed:
325 print "Dependency on checksum of file %s was removed" % (f)
326
327
307 if 'runtaskhashes' in a_data and 'runtaskhashes' in b_data: 328 if 'runtaskhashes' in a_data and 'runtaskhashes' in b_data:
308 a = clean_basepaths(a_data['runtaskhashes']) 329 a = clean_basepaths(a_data['runtaskhashes'])
309 b = clean_basepaths(b_data['runtaskhashes']) 330 b = clean_basepaths(b_data['runtaskhashes'])
@@ -353,6 +374,9 @@ def dump_sigfile(a):
353 if 'runtaskdeps' in a_data: 374 if 'runtaskdeps' in a_data:
354 print "Tasks this task depends on: %s" % (a_data['runtaskdeps']) 375 print "Tasks this task depends on: %s" % (a_data['runtaskdeps'])
355 376
377 if 'file_checksum_values' in a_data:
378 print "This task depends on the checksums of files: %s" % (a_data['file_checksum_values'])
379
356 if 'runtaskhashes' in a_data: 380 if 'runtaskhashes' in a_data:
357 for dep in a_data['runtaskhashes']: 381 for dep in a_data['runtaskhashes']:
358 print "Hash for dependent task %s is %s" % (dep, a_data['runtaskhashes'][dep]) 382 print "Hash for dependent task %s is %s" % (dep, a_data['runtaskhashes'][dep])