summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lib/bb/runqueue.py30
-rw-r--r--lib/bb/siggen.py9
2 files changed, 31 insertions, 8 deletions
diff --git a/lib/bb/runqueue.py b/lib/bb/runqueue.py
index 747ea484e3..73567408c1 100644
--- a/lib/bb/runqueue.py
+++ b/lib/bb/runqueue.py
@@ -34,6 +34,7 @@ import re
import bb
from bb import msg, data, event
from bb import monitordisk
+from bb.checksum import FileChecksumCache
import subprocess
try:
@@ -219,6 +220,7 @@ class RunQueueData:
BitBake Run Queue implementation
"""
def __init__(self, rq, cooker, cfgData, dataCache, taskData, targets):
+ import inspect
self.cooker = cooker
self.dataCache = dataCache
self.taskData = taskData
@@ -229,6 +231,16 @@ class RunQueueData:
self.stampwhitelist = cfgData.getVar("BB_STAMP_WHITELIST", True) or ""
self.multi_provider_whitelist = (cfgData.getVar("MULTI_PROVIDER_WHITELIST", True) or "").split()
+ # Check if get_taskhash implements the new API. If so, use our own file
+ # checksum cache
+ self.checksum_cache = None
+ if 'checksum_cache' in inspect.getargspec(bb.parse.siggen.get_taskhash).args:
+ checksum_cache_file = cfgData.getVar("BB_HASH_CHECKSUM_CACHE_FILE", True)
+ self.checksum_cache = FileChecksumCache()
+ self.checksum_cache.init_cache(cfgData, checksum_cache_file)
+ else:
+ logger.warn("%s implements deprecated API of get_taskhash(), "
+ "missing the 'checksum_cache' argument" % bb.parse.siggen.__class__.__name__)
self.reset()
def reset(self):
@@ -884,6 +896,7 @@ class RunQueueData:
if hasattr(bb.parse.siggen, "tasks_resolved"):
bb.parse.siggen.tasks_resolved(virtmap, virtpnmap, self.dataCache)
+
# Iterate over the task list and call into the siggen code
dealtwith = set()
todeal = set(range(len(self.runq_fnid)))
@@ -895,12 +908,19 @@ class RunQueueData:
procdep = []
for dep in self.runq_depends[task]:
procdep.append(self.taskData.fn_index[self.runq_fnid[dep]] + "." + self.runq_task[dep])
- self.runq_hash[task] = bb.parse.siggen.get_taskhash(self.taskData.fn_index[self.runq_fnid[task]], self.runq_task[task], procdep, self.dataCache)
-
+ if self.checksum_cache:
+ self.runq_hash[task] = bb.parse.siggen.get_taskhash(self.taskData.fn_index[self.runq_fnid[task]], self.runq_task[task], procdep, self.dataCache, self.checksum_cache)
+ else:
+ self.runq_hash[task] = bb.parse.siggen.get_taskhash(self.taskData.fn_index[self.runq_fnid[task]], self.runq_task[task], procdep, self.dataCache)
# Write out checksum cache onto disk
- # This relies on the "knowledge" that siggen uses cache of bb.fetch2
- bb.fetch2.fetcher_parse_save()
- bb.fetch2.fetcher_parse_done()
+ if self.checksum_cache:
+ self.checksum_cache.save_extras()
+ self.checksum_cache.save_merge()
+ else:
+ # This relies on the "knowledge" that siggen uses cache of bb.fetch2
+ bb.fetch2.fetcher_parse_save()
+ bb.fetch2.fetcher_parse_done()
+
return len(self.runq_fnid)
def dump_data(self, taskQueue):
diff --git a/lib/bb/siggen.py b/lib/bb/siggen.py
index 9d2c0b6b18..81b42d12f3 100644
--- a/lib/bb/siggen.py
+++ b/lib/bb/siggen.py
@@ -43,7 +43,7 @@ class SignatureGenerator(object):
def finalise(self, fn, d, varient):
return
- def get_taskhash(self, fn, task, deps, dataCache):
+ def get_taskhash(self, fn, task, deps, dataCache, checksum_cache=None):
return "0"
def stampfile(self, stampbase, file_name, taskname, extrainfo):
@@ -173,7 +173,7 @@ class SignatureGeneratorBasic(SignatureGenerator):
pass
return taint
- def get_taskhash(self, fn, task, deps, dataCache):
+ def get_taskhash(self, fn, task, deps, dataCache, checksum_cache=None):
k = fn + "." + task
data = dataCache.basetaskhash[k]
self.runtaskdeps[k] = []
@@ -190,7 +190,10 @@ class SignatureGeneratorBasic(SignatureGenerator):
self.runtaskdeps[k].append(dep)
if task in dataCache.file_checksums[fn]:
- checksums = bb.fetch2.get_file_checksums(dataCache.file_checksums[fn][task], recipename)
+ if checksum_cache:
+ checksums = checksum_cache.get_checksums(dataCache.file_checksums[fn][task], recipename)
+ else:
+ checksums = bb.fetch2.get_file_checksums(dataCache.file_checksums[fn][task], recipename)
for (f,cs) in checksums:
self.file_checksum_values[k].append((f,cs))
if cs: