diff options
Diffstat (limited to 'bitbake/lib/bb/cache.py')
| -rw-r--r-- | bitbake/lib/bb/cache.py | 78 |
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 = {} |
