summaryrefslogtreecommitdiffstats
path: root/bitbake/lib/bb/cache.py
diff options
context:
space:
mode:
Diffstat (limited to 'bitbake/lib/bb/cache.py')
-rw-r--r--bitbake/lib/bb/cache.py53
1 files changed, 26 insertions, 27 deletions
diff --git a/bitbake/lib/bb/cache.py b/bitbake/lib/bb/cache.py
index c6f3794d5e..255c6168dd 100644
--- a/bitbake/lib/bb/cache.py
+++ b/bitbake/lib/bb/cache.py
@@ -29,14 +29,17 @@
29 29
30 30
31import os 31import os
32import logging
32import bb.data 33import bb.data
33import bb.utils 34import bb.utils
34 35
36logger = logging.getLogger("BitBake.Cache")
37
35try: 38try:
36 import cPickle as pickle 39 import cPickle as pickle
37except ImportError: 40except ImportError:
38 import pickle 41 import pickle
39 bb.msg.note(1, bb.msg.domain.Cache, "Importing cPickle failed. Falling back to a very slow implementation.") 42 logger.info("Importing cPickle failed. Falling back to a very slow implementation.")
40 43
41__cache_version__ = "132" 44__cache_version__ = "132"
42 45
@@ -57,13 +60,13 @@ class Cache:
57 60
58 if self.cachedir in [None, '']: 61 if self.cachedir in [None, '']:
59 self.has_cache = False 62 self.has_cache = False
60 bb.msg.note(1, bb.msg.domain.Cache, "Not using a cache. Set CACHE = <directory> to enable.") 63 logger.info("Not using a cache. Set CACHE = <directory> to enable.")
61 return 64 return
62 65
63 self.has_cache = True 66 self.has_cache = True
64 self.cachefile = os.path.join(self.cachedir, "bb_cache.dat") 67 self.cachefile = os.path.join(self.cachedir, "bb_cache.dat")
65 68
66 bb.msg.debug(1, bb.msg.domain.Cache, "Using cache in '%s'" % self.cachedir) 69 logger.debug(1, "Using cache in '%s'", self.cachedir)
67 bb.utils.mkdirhier(self.cachedir) 70 bb.utils.mkdirhier(self.cachedir)
68 71
69 # If any of configuration.data's dependencies are newer than the 72 # If any of configuration.data's dependencies are newer than the
@@ -84,14 +87,14 @@ class Cache:
84 if version_data['BITBAKE_VER'] != bb.__version__: 87 if version_data['BITBAKE_VER'] != bb.__version__:
85 raise ValueError('Bitbake Version Mismatch') 88 raise ValueError('Bitbake Version Mismatch')
86 except EOFError: 89 except EOFError:
87 bb.msg.note(1, bb.msg.domain.Cache, "Truncated cache found, rebuilding...") 90 logger.info("Truncated cache found, rebuilding...")
88 self.depends_cache = {} 91 self.depends_cache = {}
89 except: 92 except:
90 bb.msg.note(1, bb.msg.domain.Cache, "Invalid cache found, rebuilding...") 93 logger.info("Invalid cache found, rebuilding...")
91 self.depends_cache = {} 94 self.depends_cache = {}
92 else: 95 else:
93 if os.path.isfile(self.cachefile): 96 if os.path.isfile(self.cachefile):
94 bb.msg.note(1, bb.msg.domain.Cache, "Out of date cache found, rebuilding...") 97 logger.info("Out of date cache found, rebuilding...")
95 98
96 def getVar(self, var, fn, exp = 0): 99 def getVar(self, var, fn, exp = 0):
97 """ 100 """
@@ -111,7 +114,7 @@ class Cache:
111 if fn != self.data_fn: 114 if fn != self.data_fn:
112 # We're trying to access data in the cache which doesn't exist 115 # We're trying to access data in the cache which doesn't exist
113 # yet setData hasn't been called to setup the right access. Very bad. 116 # yet setData hasn't been called to setup the right access. Very bad.
114 bb.msg.error(bb.msg.domain.Cache, "Parsing error data_fn %s and fn %s don't match" % (self.data_fn, fn)) 117 logger.error("data_fn %s and fn %s don't match", self.data_fn, fn)
115 118
116 self.cacheclean = False 119 self.cacheclean = False
117 result = bb.data.getVar(var, self.data, exp) 120 result = bb.data.getVar(var, self.data, exp)
@@ -152,7 +155,6 @@ class Cache:
152 if virtualfn.startswith('virtual:'): 155 if virtualfn.startswith('virtual:'):
153 cls = virtualfn.split(':', 2)[1] 156 cls = virtualfn.split(':', 2)[1]
154 fn = virtualfn.replace('virtual:' + cls + ':', '') 157 fn = virtualfn.replace('virtual:' + cls + ':', '')
155 #bb.msg.debug(2, bb.msg.domain.Cache, "virtualfn2realfn %s to %s %s" % (virtualfn, fn, cls))
156 return (fn, cls) 158 return (fn, cls)
157 159
158 def realfn2virtual(self, realfn, cls): 160 def realfn2virtual(self, realfn, cls):
@@ -160,9 +162,7 @@ class Cache:
160 Convert a real filename + the associated subclass keyword to a virtual filename 162 Convert a real filename + the associated subclass keyword to a virtual filename
161 """ 163 """
162 if cls == "": 164 if cls == "":
163 #bb.msg.debug(2, bb.msg.domain.Cache, "realfn2virtual %s and '%s' to %s" % (realfn, cls, realfn))
164 return realfn 165 return realfn
165 #bb.msg.debug(2, bb.msg.domain.Cache, "realfn2virtual %s and %s to %s" % (realfn, cls, "virtual:" + cls + ":" + realfn))
166 return "virtual:" + cls + ":" + realfn 166 return "virtual:" + cls + ":" + realfn
167 167
168 def loadDataFull(self, virtualfn, appends, cfgData): 168 def loadDataFull(self, virtualfn, appends, cfgData):
@@ -173,7 +173,7 @@ class Cache:
173 173
174 (fn, cls) = self.virtualfn2realfn(virtualfn) 174 (fn, cls) = self.virtualfn2realfn(virtualfn)
175 175
176 bb.msg.debug(1, bb.msg.domain.Cache, "Parsing %s (full)" % fn) 176 logger.debug(1, "Parsing %s (full)", fn)
177 177
178 bb_data = self.load_bbfile(fn, appends, cfgData) 178 bb_data = self.load_bbfile(fn, appends, cfgData)
179 return bb_data[cls] 179 return bb_data[cls]
@@ -198,13 +198,13 @@ class Cache:
198 virtualfn = self.realfn2virtual(fn, cls) 198 virtualfn = self.realfn2virtual(fn, cls)
199 if self.depends_cache[virtualfn]["__SKIPPED"]: 199 if self.depends_cache[virtualfn]["__SKIPPED"]:
200 skipped += 1 200 skipped += 1
201 bb.msg.debug(1, bb.msg.domain.Cache, "Skipping %s" % virtualfn) 201 logger.debug(1, "Skipping %s", virtualfn)
202 continue 202 continue
203 self.handle_data(virtualfn, cacheData) 203 self.handle_data(virtualfn, cacheData)
204 virtuals += 1 204 virtuals += 1
205 return True, skipped, virtuals 205 return True, skipped, virtuals
206 206
207 bb.msg.debug(1, bb.msg.domain.Cache, "Parsing %s" % fn) 207 logger.debug(1, "Parsing %s", fn)
208 208
209 bb_data = self.load_bbfile(fn, appends, cfgData) 209 bb_data = self.load_bbfile(fn, appends, cfgData)
210 210
@@ -213,7 +213,7 @@ class Cache:
213 self.setData(virtualfn, fn, bb_data[data]) 213 self.setData(virtualfn, fn, bb_data[data])
214 if self.getVar("__SKIPPED", virtualfn): 214 if self.getVar("__SKIPPED", virtualfn):
215 skipped += 1 215 skipped += 1
216 bb.msg.debug(1, bb.msg.domain.Cache, "Skipping %s" % virtualfn) 216 logger.debug(1, "Skipping %s", virtualfn)
217 else: 217 else:
218 self.handle_data(virtualfn, cacheData) 218 self.handle_data(virtualfn, cacheData)
219 virtuals += 1 219 virtuals += 1
@@ -248,7 +248,7 @@ class Cache:
248 248
249 # File isn't in depends_cache 249 # File isn't in depends_cache
250 if not fn in self.depends_cache: 250 if not fn in self.depends_cache:
251 bb.msg.debug(2, bb.msg.domain.Cache, "Cache: %s is not cached" % fn) 251 logger.debug(2, "Cache: %s is not cached", fn)
252 self.remove(fn) 252 self.remove(fn)
253 return False 253 return False
254 254
@@ -256,13 +256,13 @@ class Cache:
256 256
257 # Check file still exists 257 # Check file still exists
258 if mtime == 0: 258 if mtime == 0:
259 bb.msg.debug(2, bb.msg.domain.Cache, "Cache: %s no longer exists" % fn) 259 logger.debug(2, "Cache: %s no longer exists", fn)
260 self.remove(fn) 260 self.remove(fn)
261 return False 261 return False
262 262
263 # Check the file's timestamp 263 # Check the file's timestamp
264 if mtime != self.getVar("CACHETIMESTAMP", fn, True): 264 if mtime != self.getVar("CACHETIMESTAMP", fn, True):
265 bb.msg.debug(2, bb.msg.domain.Cache, "Cache: %s changed" % fn) 265 logger.debug(2, "Cache: %s changed", fn)
266 self.remove(fn) 266 self.remove(fn)
267 return False 267 return False
268 268
@@ -277,11 +277,10 @@ class Cache:
277 return False 277 return False
278 278
279 if (fmtime != old_mtime): 279 if (fmtime != old_mtime):
280 bb.msg.debug(2, bb.msg.domain.Cache, "Cache: %s's dependency %s changed" % (fn, f)) 280 logger.debug(2, "Cache: %s's dependency %s changed", fn, f)
281 self.remove(fn) 281 self.remove(fn)
282 return False 282 return False
283 283
284 #bb.msg.debug(2, bb.msg.domain.Cache, "Depends Cache: %s is clean" % fn)
285 if not fn in self.clean: 284 if not fn in self.clean:
286 self.clean[fn] = "" 285 self.clean[fn] = ""
287 286
@@ -292,16 +291,16 @@ class Cache:
292 virtualfn = self.realfn2virtual(fn, cls) 291 virtualfn = self.realfn2virtual(fn, cls)
293 self.clean[virtualfn] = "" 292 self.clean[virtualfn] = ""
294 if not virtualfn in self.depends_cache: 293 if not virtualfn in self.depends_cache:
295 bb.msg.debug(2, bb.msg.domain.Cache, "Cache: %s is not cached" % virtualfn) 294 logger.debug(2, "Cache: %s is not cached", virtualfn)
296 invalid = True 295 invalid = True
297 296
298 # If any one of the varients is not present, mark cache as invalid for all 297 # If any one of the varients is not present, mark cache as invalid for all
299 if invalid: 298 if invalid:
300 for cls in (multi or "").split(): 299 for cls in (multi or "").split():
301 virtualfn = self.realfn2virtual(fn, cls) 300 virtualfn = self.realfn2virtual(fn, cls)
302 bb.msg.debug(2, bb.msg.domain.Cache, "Cache: Removing %s from cache" % virtualfn) 301 logger.debug(2, "Cache: Removing %s from cache", virtualfn)
303 del self.clean[virtualfn] 302 del self.clean[virtualfn]
304 bb.msg.debug(2, bb.msg.domain.Cache, "Cache: Removing %s from cache" % fn) 303 logger.debug(2, "Cache: removing %s from cache", fn)
305 del self.clean[fn] 304 del self.clean[fn]
306 return False 305 return False
307 306
@@ -312,7 +311,7 @@ class Cache:
312 Remove a fn from the cache 311 Remove a fn from the cache
313 Called from the parser in error cases 312 Called from the parser in error cases
314 """ 313 """
315 bb.msg.debug(1, bb.msg.domain.Cache, "Removing %s from cache" % fn) 314 logger.debug(1, "Removing %s from cache", fn)
316 if fn in self.depends_cache: 315 if fn in self.depends_cache:
317 del self.depends_cache[fn] 316 del self.depends_cache[fn]
318 if fn in self.clean: 317 if fn in self.clean:
@@ -329,7 +328,7 @@ class Cache:
329 return 328 return
330 329
331 if self.cacheclean: 330 if self.cacheclean:
332 bb.msg.note(1, bb.msg.domain.Cache, "Cache is clean, not saving.") 331 logger.info("Cache is clean, not saving.")
333 return 332 return
334 333
335 version_data = {} 334 version_data = {}
@@ -339,10 +338,10 @@ class Cache:
339 cache_data = copy.copy(self.depends_cache) 338 cache_data = copy.copy(self.depends_cache)
340 for fn in self.depends_cache: 339 for fn in self.depends_cache:
341 if '__BB_DONT_CACHE' in self.depends_cache[fn] and self.depends_cache[fn]['__BB_DONT_CACHE']: 340 if '__BB_DONT_CACHE' in self.depends_cache[fn] and self.depends_cache[fn]['__BB_DONT_CACHE']:
342 bb.msg.debug(2, bb.msg.domain.Cache, "Not caching %s, marked as not cacheable" % fn) 341 logger.debug(2, "Not caching %s, marked as not cacheable", fn)
343 del cache_data[fn] 342 del cache_data[fn]
344 elif 'PV' in self.depends_cache[fn] and 'SRCREVINACTION' in self.depends_cache[fn]['PV']: 343 elif 'PV' in self.depends_cache[fn] and 'SRCREVINACTION' in self.depends_cache[fn]['PV']:
345 bb.msg.error(bb.msg.domain.Cache, "Not caching %s as it had SRCREVINACTION in PV. Please report this bug" % fn) 344 logger.error("Not caching %s as it had SRCREVINACTION in PV. Please report this bug", fn)
346 del cache_data[fn] 345 del cache_data[fn]
347 346
348 p = pickle.Pickler(file(self.cachefile, "wb" ), -1 ) 347 p = pickle.Pickler(file(self.cachefile, "wb" ), -1 )
@@ -360,7 +359,7 @@ class Cache:
360 pe = self.getVar('PE', file_name, True) or "0" 359 pe = self.getVar('PE', file_name, True) or "0"
361 pv = self.getVar('PV', file_name, True) 360 pv = self.getVar('PV', file_name, True)
362 if 'SRCREVINACTION' in pv: 361 if 'SRCREVINACTION' in pv:
363 bb.msg.note(1, bb.msg.domain.Cache, "Found SRCREVINACTION in PV (%s) or %s. Please report this bug." % (pv, file_name)) 362 logger.info("Found SRCREVINACTION in PV (%s) or %s. Please report this bug.", pv, file_name)
364 pr = self.getVar('PR', file_name, True) 363 pr = self.getVar('PR', file_name, True)
365 dp = int(self.getVar('DEFAULT_PREFERENCE', file_name, True) or "0") 364 dp = int(self.getVar('DEFAULT_PREFERENCE', file_name, True) or "0")
366 depends = bb.utils.explode_deps(self.getVar("DEPENDS", file_name, True) or "") 365 depends = bb.utils.explode_deps(self.getVar("DEPENDS", file_name, True) or "")