diff options
author | Paul Eggleton <paul.eggleton@linux.intel.com> | 2012-05-23 00:23:32 +0100 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2012-05-23 11:35:04 +0100 |
commit | 8b8be74ed21b878b2fe30d5b76ff0648e6e48c18 (patch) | |
tree | f1facae6d6803b450185811ca08bf215d6963530 /bitbake/lib/bb/siggen.py | |
parent | d7b818b51f3e6dded0c0885cdfed5a24cda3b428 (diff) | |
download | poky-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.py | 24 |
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]) |