diff options
| -rw-r--r-- | bitbake/lib/bb/checksum.py | 12 | ||||
| -rw-r--r-- | bitbake/lib/bb/siggen.py | 11 |
2 files changed, 21 insertions, 2 deletions
diff --git a/bitbake/lib/bb/checksum.py b/bitbake/lib/bb/checksum.py index 1d50a26426..fb8a77f6ab 100644 --- a/bitbake/lib/bb/checksum.py +++ b/bitbake/lib/bb/checksum.py | |||
| @@ -50,6 +50,7 @@ class FileChecksumCache(MultiProcessCache): | |||
| 50 | MultiProcessCache.__init__(self) | 50 | MultiProcessCache.__init__(self) |
| 51 | 51 | ||
| 52 | def get_checksum(self, f): | 52 | def get_checksum(self, f): |
| 53 | f = os.path.normpath(f) | ||
| 53 | entry = self.cachedata[0].get(f) | 54 | entry = self.cachedata[0].get(f) |
| 54 | cmtime = self.mtime_cache.cached_mtime(f) | 55 | cmtime = self.mtime_cache.cached_mtime(f) |
| 55 | if entry: | 56 | if entry: |
| @@ -84,15 +85,24 @@ class FileChecksumCache(MultiProcessCache): | |||
| 84 | return None | 85 | return None |
| 85 | return checksum | 86 | return checksum |
| 86 | 87 | ||
| 88 | # | ||
| 89 | # Changing the format of file-checksums is problematic as both OE and Bitbake have | ||
| 90 | # knowledge of them. We need to encode a new piece of data, the portion of the path | ||
| 91 | # we care about from a checksum perspective. This means that files that change subdirectory | ||
| 92 | # are tracked by the task hashes. To do this, we do something horrible and put a "/./" into | ||
| 93 | # the path. The filesystem handles it but it gives us a marker to know which subsection | ||
| 94 | # of the path to cache. | ||
| 95 | # | ||
| 87 | def checksum_dir(pth): | 96 | def checksum_dir(pth): |
| 88 | # Handle directories recursively | 97 | # Handle directories recursively |
| 89 | if pth == "/": | 98 | if pth == "/": |
| 90 | bb.fatal("Refusing to checksum /") | 99 | bb.fatal("Refusing to checksum /") |
| 100 | pth = pth.rstrip("/") | ||
| 91 | dirchecksums = [] | 101 | dirchecksums = [] |
| 92 | for root, dirs, files in os.walk(pth, topdown=True): | 102 | for root, dirs, files in os.walk(pth, topdown=True): |
| 93 | [dirs.remove(d) for d in list(dirs) if d in localdirsexclude] | 103 | [dirs.remove(d) for d in list(dirs) if d in localdirsexclude] |
| 94 | for name in files: | 104 | for name in files: |
| 95 | fullpth = os.path.join(root, name) | 105 | fullpth = os.path.join(root, name).replace(pth, os.path.join(pth, ".")) |
| 96 | checksum = checksum_file(fullpth) | 106 | checksum = checksum_file(fullpth) |
| 97 | if checksum: | 107 | if checksum: |
| 98 | dirchecksums.append((fullpth, checksum)) | 108 | dirchecksums.append((fullpth, checksum)) |
diff --git a/bitbake/lib/bb/siggen.py b/bitbake/lib/bb/siggen.py index 578ba5d661..44965c8cca 100644 --- a/bitbake/lib/bb/siggen.py +++ b/bitbake/lib/bb/siggen.py | |||
| @@ -328,6 +328,8 @@ class SignatureGeneratorBasic(SignatureGenerator): | |||
| 328 | 328 | ||
| 329 | for (f, cs) in self.file_checksum_values[tid]: | 329 | for (f, cs) in self.file_checksum_values[tid]: |
| 330 | if cs: | 330 | if cs: |
| 331 | if "/./" in f: | ||
| 332 | data = data + "./" + f.split("/./")[1] | ||
| 331 | data = data + cs | 333 | data = data + cs |
| 332 | 334 | ||
| 333 | if tid in self.taints: | 335 | if tid in self.taints: |
| @@ -385,7 +387,12 @@ class SignatureGeneratorBasic(SignatureGenerator): | |||
| 385 | 387 | ||
| 386 | if runtime and tid in self.taskhash: | 388 | if runtime and tid in self.taskhash: |
| 387 | data['runtaskdeps'] = self.runtaskdeps[tid] | 389 | data['runtaskdeps'] = self.runtaskdeps[tid] |
| 388 | data['file_checksum_values'] = [(os.path.basename(f), cs) for f,cs in self.file_checksum_values[tid]] | 390 | data['file_checksum_values'] = [] |
| 391 | for f,cs in self.file_checksum_values[tid]: | ||
| 392 | if "/./" in f: | ||
| 393 | data['file_checksum_values'].append(("./" + f.split("/./")[1], cs)) | ||
| 394 | else: | ||
| 395 | data['file_checksum_values'].append((os.path.basename(f), cs)) | ||
| 389 | data['runtaskhashes'] = {} | 396 | data['runtaskhashes'] = {} |
| 390 | for dep in data['runtaskdeps']: | 397 | for dep in data['runtaskdeps']: |
| 391 | data['runtaskhashes'][dep] = self.get_unihash(dep) | 398 | data['runtaskhashes'][dep] = self.get_unihash(dep) |
| @@ -1028,6 +1035,8 @@ def calc_taskhash(sigdata): | |||
| 1028 | 1035 | ||
| 1029 | for c in sigdata['file_checksum_values']: | 1036 | for c in sigdata['file_checksum_values']: |
| 1030 | if c[1]: | 1037 | if c[1]: |
| 1038 | if "./" in c[0]: | ||
| 1039 | data = data + c[0] | ||
| 1031 | data = data + c[1] | 1040 | data = data + c[1] |
| 1032 | 1041 | ||
| 1033 | if 'taint' in sigdata: | 1042 | if 'taint' in sigdata: |
