diff options
Diffstat (limited to 'bitbake/lib/bb/checksum.py')
-rw-r--r-- | bitbake/lib/bb/checksum.py | 22 |
1 files changed, 20 insertions, 2 deletions
diff --git a/bitbake/lib/bb/checksum.py b/bitbake/lib/bb/checksum.py index 1d50a26426..557793d366 100644 --- a/bitbake/lib/bb/checksum.py +++ b/bitbake/lib/bb/checksum.py | |||
@@ -11,10 +11,13 @@ import os | |||
11 | import stat | 11 | import stat |
12 | import bb.utils | 12 | import bb.utils |
13 | import logging | 13 | import logging |
14 | import re | ||
14 | from bb.cache import MultiProcessCache | 15 | from bb.cache import MultiProcessCache |
15 | 16 | ||
16 | logger = logging.getLogger("BitBake.Cache") | 17 | logger = logging.getLogger("BitBake.Cache") |
17 | 18 | ||
19 | filelist_regex = re.compile(r'(?:(?<=:True)|(?<=:False))\s+') | ||
20 | |||
18 | # mtime cache (non-persistent) | 21 | # mtime cache (non-persistent) |
19 | # based upon the assumption that files do not change during bitbake run | 22 | # based upon the assumption that files do not change during bitbake run |
20 | class FileMtimeCache(object): | 23 | class FileMtimeCache(object): |
@@ -50,6 +53,7 @@ class FileChecksumCache(MultiProcessCache): | |||
50 | MultiProcessCache.__init__(self) | 53 | MultiProcessCache.__init__(self) |
51 | 54 | ||
52 | def get_checksum(self, f): | 55 | def get_checksum(self, f): |
56 | f = os.path.normpath(f) | ||
53 | entry = self.cachedata[0].get(f) | 57 | entry = self.cachedata[0].get(f) |
54 | cmtime = self.mtime_cache.cached_mtime(f) | 58 | cmtime = self.mtime_cache.cached_mtime(f) |
55 | if entry: | 59 | if entry: |
@@ -84,22 +88,36 @@ class FileChecksumCache(MultiProcessCache): | |||
84 | return None | 88 | return None |
85 | return checksum | 89 | return checksum |
86 | 90 | ||
91 | # | ||
92 | # Changing the format of file-checksums is problematic as both OE and Bitbake have | ||
93 | # knowledge of them. We need to encode a new piece of data, the portion of the path | ||
94 | # we care about from a checksum perspective. This means that files that change subdirectory | ||
95 | # are tracked by the task hashes. To do this, we do something horrible and put a "/./" into | ||
96 | # the path. The filesystem handles it but it gives us a marker to know which subsection | ||
97 | # of the path to cache. | ||
98 | # | ||
87 | def checksum_dir(pth): | 99 | def checksum_dir(pth): |
88 | # Handle directories recursively | 100 | # Handle directories recursively |
89 | if pth == "/": | 101 | if pth == "/": |
90 | bb.fatal("Refusing to checksum /") | 102 | bb.fatal("Refusing to checksum /") |
103 | pth = pth.rstrip("/") | ||
91 | dirchecksums = [] | 104 | dirchecksums = [] |
92 | for root, dirs, files in os.walk(pth, topdown=True): | 105 | for root, dirs, files in os.walk(pth, topdown=True): |
93 | [dirs.remove(d) for d in list(dirs) if d in localdirsexclude] | 106 | [dirs.remove(d) for d in list(dirs) if d in localdirsexclude] |
94 | for name in files: | 107 | for name in files: |
95 | fullpth = os.path.join(root, name) | 108 | fullpth = os.path.join(root, name).replace(pth, os.path.join(pth, ".")) |
96 | checksum = checksum_file(fullpth) | 109 | checksum = checksum_file(fullpth) |
97 | if checksum: | 110 | if checksum: |
98 | dirchecksums.append((fullpth, checksum)) | 111 | dirchecksums.append((fullpth, checksum)) |
99 | return dirchecksums | 112 | return dirchecksums |
100 | 113 | ||
101 | checksums = [] | 114 | checksums = [] |
102 | for pth in filelist.split(): | 115 | for pth in filelist_regex.split(filelist): |
116 | if not pth: | ||
117 | continue | ||
118 | pth = pth.strip() | ||
119 | if not pth: | ||
120 | continue | ||
103 | exist = pth.split(":")[1] | 121 | exist = pth.split(":")[1] |
104 | if exist == "False": | 122 | if exist == "False": |
105 | continue | 123 | continue |