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.py78
1 files changed, 40 insertions, 38 deletions
diff --git a/bitbake/lib/bb/cache.py b/bitbake/lib/bb/cache.py
index 60e863d52d..9acd301f52 100644
--- a/bitbake/lib/bb/cache.py
+++ b/bitbake/lib/bb/cache.py
@@ -80,7 +80,7 @@ class Cache:
80 if old_mtime > newest_mtime: 80 if old_mtime > newest_mtime:
81 newest_mtime = old_mtime 81 newest_mtime = old_mtime
82 82
83 if self.mtime(self.cachefile) >= newest_mtime: 83 if bb.parse.cached_mtime_noerror(self.cachefile) >= newest_mtime:
84 try: 84 try:
85 p = pickle.Unpickler(file(self.cachefile, "rb")) 85 p = pickle.Unpickler(file(self.cachefile, "rb"))
86 self.depends_cache, version_data = p.load() 86 self.depends_cache, version_data = p.load()
@@ -91,7 +91,7 @@ class Cache:
91 except EOFError: 91 except EOFError:
92 bb.msg.note(1, bb.msg.domain.Cache, "Truncated cache found, rebuilding...") 92 bb.msg.note(1, bb.msg.domain.Cache, "Truncated cache found, rebuilding...")
93 self.depends_cache = {} 93 self.depends_cache = {}
94 except (ValueError, KeyError): 94 except:
95 bb.msg.note(1, bb.msg.domain.Cache, "Invalid cache found, rebuilding...") 95 bb.msg.note(1, bb.msg.domain.Cache, "Invalid cache found, rebuilding...")
96 self.depends_cache = {} 96 self.depends_cache = {}
97 else: 97 else:
@@ -199,31 +199,34 @@ class Cache:
199 self.remove(fn) 199 self.remove(fn)
200 return False 200 return False
201 201
202 mtime = bb.parse.cached_mtime_noerror(fn)
203
202 # Check file still exists 204 # Check file still exists
203 if self.mtime(fn) == 0: 205 if mtime == 0:
204 bb.msg.debug(2, bb.msg.domain.Cache, "Cache: %s not longer exists" % fn) 206 bb.msg.debug(2, bb.msg.domain.Cache, "Cache: %s not longer exists" % fn)
205 self.remove(fn) 207 self.remove(fn)
206 return False 208 return False
207 209
208 # Check the file's timestamp 210 # Check the file's timestamp
209 if bb.parse.cached_mtime(fn) > self.getVar("CACHETIMESTAMP", fn, True): 211 if mtime > self.getVar("CACHETIMESTAMP", fn, True):
210 bb.msg.debug(2, bb.msg.domain.Cache, "Cache: %s changed" % fn) 212 bb.msg.debug(2, bb.msg.domain.Cache, "Cache: %s changed" % fn)
211 self.remove(fn) 213 self.remove(fn)
212 return False 214 return False
213 215
214 # Check dependencies are still valid 216 # Check dependencies are still valid
215 depends = self.getVar("__depends", fn, True) 217 depends = self.getVar("__depends", fn, True)
216 for f,old_mtime in depends: 218 if depends:
217 # Check if file still exists 219 for f,old_mtime in depends:
218 if self.mtime(f) == 0: 220 fmtime = bb.parse.cached_mtime_noerror(f)
219 self.remove(fn) 221 # Check if file still exists
220 return False 222 if fmtime == 0:
221 223 self.remove(fn)
222 new_mtime = bb.parse.cached_mtime(f) 224 return False
223 if (new_mtime > old_mtime): 225
224 bb.msg.debug(2, bb.msg.domain.Cache, "Cache: %s's dependency %s changed" % (fn, f)) 226 if (fmtime > old_mtime):
225 self.remove(fn) 227 bb.msg.debug(2, bb.msg.domain.Cache, "Cache: %s's dependency %s changed" % (fn, f))
226 return False 228 self.remove(fn)
229 return False
227 230
228 #bb.msg.debug(2, bb.msg.domain.Cache, "Depends Cache: %s is clean" % fn) 231 #bb.msg.debug(2, bb.msg.domain.Cache, "Depends Cache: %s is clean" % fn)
229 if not fn in self.clean: 232 if not fn in self.clean:
@@ -284,7 +287,6 @@ class Cache:
284 pv = self.getVar('PV', file_name, True) 287 pv = self.getVar('PV', file_name, True)
285 pr = self.getVar('PR', file_name, True) 288 pr = self.getVar('PR', file_name, True)
286 dp = int(self.getVar('DEFAULT_PREFERENCE', file_name, True) or "0") 289 dp = int(self.getVar('DEFAULT_PREFERENCE', file_name, True) or "0")
287 provides = Set([pn] + (self.getVar("PROVIDES", file_name, True) or "").split())
288 depends = bb.utils.explode_deps(self.getVar("DEPENDS", file_name, True) or "") 290 depends = bb.utils.explode_deps(self.getVar("DEPENDS", file_name, True) or "")
289 packages = (self.getVar('PACKAGES', file_name, True) or "").split() 291 packages = (self.getVar('PACKAGES', file_name, True) or "").split()
290 packages_dynamic = (self.getVar('PACKAGES_DYNAMIC', file_name, True) or "").split() 292 packages_dynamic = (self.getVar('PACKAGES_DYNAMIC', file_name, True) or "").split()
@@ -304,24 +306,31 @@ class Cache:
304 cacheData.pkg_pepvpr[file_name] = (pe,pv,pr) 306 cacheData.pkg_pepvpr[file_name] = (pe,pv,pr)
305 cacheData.pkg_dp[file_name] = dp 307 cacheData.pkg_dp[file_name] = dp
306 308
309 provides = [pn]
310 for provide in (self.getVar("PROVIDES", file_name, True) or "").split():
311 if provide not in provides:
312 provides.append(provide)
313
307 # Build forward and reverse provider hashes 314 # Build forward and reverse provider hashes
308 # Forward: virtual -> [filenames] 315 # Forward: virtual -> [filenames]
309 # Reverse: PN -> [virtuals] 316 # Reverse: PN -> [virtuals]
310 if pn not in cacheData.pn_provides: 317 if pn not in cacheData.pn_provides:
311 cacheData.pn_provides[pn] = Set() 318 cacheData.pn_provides[pn] = []
312 cacheData.pn_provides[pn] |= provides
313 319
314 cacheData.fn_provides[file_name] = Set() 320 cacheData.fn_provides[file_name] = provides
315 for provide in provides: 321 for provide in provides:
316 if provide not in cacheData.providers: 322 if provide not in cacheData.providers:
317 cacheData.providers[provide] = [] 323 cacheData.providers[provide] = []
318 cacheData.providers[provide].append(file_name) 324 cacheData.providers[provide].append(file_name)
319 cacheData.fn_provides[file_name].add(provide) 325 if not provide in cacheData.pn_provides[pn]:
326 cacheData.pn_provides[pn].append(provide)
320 327
321 cacheData.deps[file_name] = Set() 328 cacheData.deps[file_name] = []
322 for dep in depends: 329 for dep in depends:
323 cacheData.all_depends.add(dep) 330 if not dep in cacheData.deps[file_name]:
324 cacheData.deps[file_name].add(dep) 331 cacheData.deps[file_name].append(dep)
332 if not dep in cacheData.all_depends:
333 cacheData.all_depends.append(dep)
325 334
326 # Build reverse hash for PACKAGES, so runtime dependencies 335 # Build reverse hash for PACKAGES, so runtime dependencies
327 # can be be resolved (RDEPENDS, RRECOMMENDS etc.) 336 # can be be resolved (RDEPENDS, RRECOMMENDS etc.)
@@ -343,28 +352,21 @@ class Cache:
343 352
344 # Build hash of runtime depends and rececommends 353 # Build hash of runtime depends and rececommends
345 354
346 def add_dep(deplist, deps):
347 for dep in deps:
348 if not dep in deplist:
349 deplist[dep] = ""
350
351 if not file_name in cacheData.rundeps: 355 if not file_name in cacheData.rundeps:
352 cacheData.rundeps[file_name] = {} 356 cacheData.rundeps[file_name] = {}
353 if not file_name in cacheData.runrecs: 357 if not file_name in cacheData.runrecs:
354 cacheData.runrecs[file_name] = {} 358 cacheData.runrecs[file_name] = {}
355 359
356 rdepends = bb.utils.explode_deps(self.getVar('RDEPENDS', file_name, True) or "") 360 rdepends = self.getVar('RDEPENDS', file_name, True) or ""
357 rrecommends = bb.utils.explode_deps(self.getVar('RRECOMMENDS', file_name, True) or "") 361 rrecommends = self.getVar('RRECOMMENDS', file_name, True) or ""
358 for package in packages + [pn]: 362 for package in packages + [pn]:
359 if not package in cacheData.rundeps[file_name]: 363 if not package in cacheData.rundeps[file_name]:
360 cacheData.rundeps[file_name][package] = {} 364 cacheData.rundeps[file_name][package] = []
361 if not package in cacheData.runrecs[file_name]: 365 if not package in cacheData.runrecs[file_name]:
362 cacheData.runrecs[file_name][package] = {} 366 cacheData.runrecs[file_name][package] = []
363 367
364 add_dep(cacheData.rundeps[file_name][package], rdepends) 368 cacheData.rundeps[file_name][package] = rdepends + " " + (self.getVar("RDEPENDS_%s" % package, file_name, True) or "")
365 add_dep(cacheData.runrecs[file_name][package], rrecommends) 369 cacheData.runrecs[file_name][package] = rrecommends + " " + (self.getVar("RRECOMMENDS_%s" % package, file_name, True) or "")
366 add_dep(cacheData.rundeps[file_name][package], bb.utils.explode_deps(self.getVar("RDEPENDS_%s" % package, file_name, True) or ""))
367 add_dep(cacheData.runrecs[file_name][package], bb.utils.explode_deps(self.getVar("RRECOMMENDS_%s" % package, file_name, True) or ""))
368 370
369 # Collect files we may need for possible world-dep 371 # Collect files we may need for possible world-dep
370 # calculations 372 # calculations
@@ -385,7 +387,7 @@ class Cache:
385 data.setVar('TMPDIR', data.getVar('TMPDIR', config, 1) or "", config) 387 data.setVar('TMPDIR', data.getVar('TMPDIR', config, 1) or "", config)
386 bbfile_loc = os.path.abspath(os.path.dirname(bbfile)) 388 bbfile_loc = os.path.abspath(os.path.dirname(bbfile))
387 oldpath = os.path.abspath(os.getcwd()) 389 oldpath = os.path.abspath(os.getcwd())
388 if self.mtime(bbfile_loc): 390 if bb.parse.cached_mtime_noerror(bbfile_loc):
389 os.chdir(bbfile_loc) 391 os.chdir(bbfile_loc)
390 bb_data = data.init_db(config) 392 bb_data = data.init_db(config)
391 try: 393 try:
@@ -444,7 +446,7 @@ class CacheData:
444 self.pkg_dp = {} 446 self.pkg_dp = {}
445 self.pn_provides = {} 447 self.pn_provides = {}
446 self.fn_provides = {} 448 self.fn_provides = {}
447 self.all_depends = Set() 449 self.all_depends = []
448 self.deps = {} 450 self.deps = {}
449 self.rundeps = {} 451 self.rundeps = {}
450 self.runrecs = {} 452 self.runrecs = {}