summaryrefslogtreecommitdiff
path: root/bitbake/lib/bb/siggen.py
diff options
context:
space:
mode:
Diffstat (limited to 'bitbake/lib/bb/siggen.py')
-rw-r--r--bitbake/lib/bb/siggen.py298
1 files changed, 0 insertions, 298 deletions
diff --git a/bitbake/lib/bb/siggen.py b/bitbake/lib/bb/siggen.py
deleted file mode 100644
index e804d611b9..0000000000
--- a/bitbake/lib/bb/siggen.py
+++ /dev/null
@@ -1,298 +0,0 @@
-import hashlib
-import logging
-import re
-import bb.data
-
-logger = logging.getLogger('BitBake.SigGen')
-
-try:
- import cPickle as pickle
-except ImportError:
- import pickle
- logger.info('Importing cPickle failed. Falling back to a very slow implementation.')
-
-def init(d):
- siggens = [obj for obj in globals().itervalues()
- if type(obj) is type and issubclass(obj, SignatureGenerator)]
-
- desired = bb.data.getVar("BB_SIGNATURE_HANDLER", d, True) or "noop"
- for sg in siggens:
- if desired == sg.name:
- return sg(d)
- break
- else:
- logger.error("Invalid signature generator '%s', using default 'noop'\n"
- "Available generators: %s",
- ', '.join(obj.name for obj in siggens))
- return SignatureGenerator(d)
-
-class SignatureGenerator(object):
- """
- """
- name = "noop"
-
- def __init__(self, data):
- return
-
- def finalise(self, fn, d, varient):
- return
-
- def get_taskhash(self, fn, task, deps, dataCache):
- return 0
-
- def set_taskdata(self, hashes, deps):
- return
-
- def stampfile(self, stampbase, file_name, taskname, extrainfo):
- return ("%s.%s.%s" % (stampbase, taskname, extrainfo)).rstrip('.')
-
-class SignatureGeneratorBasic(SignatureGenerator):
- """
- """
- name = "basic"
-
- def __init__(self, data):
- self.basehash = {}
- self.taskhash = {}
- self.taskdeps = {}
- self.runtaskdeps = {}
- self.gendeps = {}
- self.lookupcache = {}
- self.basewhitelist = set((data.getVar("BB_HASHBASE_WHITELIST", True) or "").split())
- self.taskwhitelist = data.getVar("BB_HASHTASK_WHITELIST", True) or None
-
- if self.taskwhitelist:
- self.twl = re.compile(self.taskwhitelist)
- else:
- self.twl = None
-
- def _build_data(self, fn, d):
-
- tasklist, gendeps = bb.data.generate_dependencies(d)
-
- taskdeps = {}
- basehash = {}
- lookupcache = {}
-
- for task in tasklist:
- data = d.getVar(task, False)
- lookupcache[task] = data
-
- newdeps = gendeps[task]
- seen = set()
- while newdeps:
- nextdeps = newdeps
- seen |= nextdeps
- newdeps = set()
- for dep in nextdeps:
- if dep in self.basewhitelist:
- continue
- newdeps |= gendeps[dep]
- newdeps -= seen
-
- alldeps = seen - self.basewhitelist
-
- for dep in sorted(alldeps):
- if dep in lookupcache:
- var = lookupcache[dep]
- else:
- var = d.getVar(dep, False)
- lookupcache[dep] = var
- if var:
- data = data + var
- if data is None:
- bb.error("Task %s from %s seems to be empty?!" % (task, fn))
- self.basehash[fn + "." + task] = hashlib.md5(data).hexdigest()
- taskdeps[task] = sorted(alldeps)
-
- self.taskdeps[fn] = taskdeps
- self.gendeps[fn] = gendeps
- self.lookupcache[fn] = lookupcache
-
- return taskdeps
-
- def finalise(self, fn, d, variant):
-
- if variant:
- fn = "virtual:" + variant + ":" + fn
-
- taskdeps = self._build_data(fn, d)
-
- #Slow but can be useful for debugging mismatched basehashes
- #for task in self.taskdeps[fn]:
- # self.dump_sigtask(fn, task, d.getVar("STAMP", True), False)
-
- for task in taskdeps:
- d.setVar("BB_BASEHASH_task-%s" % task, self.basehash[fn + "." + task])
-
- def get_taskhash(self, fn, task, deps, dataCache):
- k = fn + "." + task
- data = dataCache.basetaskhash[k]
- self.runtaskdeps[k] = []
- for dep in sorted(deps):
- # We only manipulate the dependencies for packages not in the whitelist
- if self.twl and not self.twl.search(dataCache.pkg_fn[fn]):
- # then process the actual dependencies
- dep_fn = re.search("(?P<fn>.*)\..*", dep).group('fn')
- if self.twl.search(dataCache.pkg_fn[dep_fn]):
- continue
- if dep not in self.taskhash:
- bb.fatal("%s is not in taskhash, caller isn't calling in dependency order?", dep)
- data = data + self.taskhash[dep]
- self.runtaskdeps[k].append(dep)
- h = hashlib.md5(data).hexdigest()
- self.taskhash[k] = h
- #d.setVar("BB_TASKHASH_task-%s" % task, taskhash[task])
- return h
-
- def set_taskdata(self, hashes, deps):
- self.runtaskdeps = deps
- self.taskhash = hashes
-
- def dump_sigtask(self, fn, task, stampbase, runtime):
- k = fn + "." + task
- if runtime == "customfile":
- sigfile = stampbase
- elif runtime:
- sigfile = stampbase + "." + task + ".sigdata" + "." + self.taskhash[k]
- else:
- sigfile = stampbase + "." + task + ".sigbasedata" + "." + self.basehash[k]
-
- bb.utils.mkdirhier(os.path.dirname(sigfile))
-
- data = {}
- data['basewhitelist'] = self.basewhitelist
- data['taskwhitelist'] = self.taskwhitelist
- data['taskdeps'] = self.taskdeps[fn][task]
- data['basehash'] = self.basehash[k]
- data['gendeps'] = {}
- data['varvals'] = {}
- data['varvals'][task] = self.lookupcache[fn][task]
- for dep in self.taskdeps[fn][task]:
- if dep in self.basewhitelist:
- continue
- data['gendeps'][dep] = self.gendeps[fn][dep]
- data['varvals'][dep] = self.lookupcache[fn][dep]
-
- if runtime:
- data['runtaskdeps'] = self.runtaskdeps[k]
- data['runtaskhashes'] = {}
- for dep in data['runtaskdeps']:
- data['runtaskhashes'][dep] = self.taskhash[dep]
-
- p = pickle.Pickler(file(sigfile, "wb"), -1)
- p.dump(data)
-
- def dump_sigs(self, dataCache):
- for fn in self.taskdeps:
- for task in self.taskdeps[fn]:
- k = fn + "." + task
- if k not in self.taskhash:
- continue
- if dataCache.basetaskhash[k] != self.basehash[k]:
- bb.error("Bitbake's cached basehash does not match the one we just generated (%s)!" % k)
- bb.error("The mismatched hashes were %s and %s" % (dataCache.basetaskhash[k], self.basehash[k]))
- self.dump_sigtask(fn, task, dataCache.stamp[fn], True)
-
-class SignatureGeneratorBasicHash(SignatureGeneratorBasic):
- name = "basichash"
-
- def stampfile(self, stampbase, fn, taskname, extrainfo):
- if taskname != "do_setscene" and taskname.endswith("_setscene"):
- k = fn + "." + taskname[:-9]
- else:
- k = fn + "." + taskname
- h = self.taskhash[k]
- return ("%s.%s.%s.%s" % (stampbase, taskname, h, extrainfo)).rstrip('.')
-
-def dump_this_task(outfile, d):
- import bb.parse
- fn = d.getVar("BB_FILENAME", True)
- task = "do_" + d.getVar("BB_CURRENTTASK", True)
- bb.parse.siggen.dump_sigtask(fn, task, outfile, "customfile")
-
-def compare_sigfiles(a, b):
- p1 = pickle.Unpickler(file(a, "rb"))
- a_data = p1.load()
- p2 = pickle.Unpickler(file(b, "rb"))
- b_data = p2.load()
-
- def dict_diff(a, b):
- sa = set(a.keys())
- sb = set(b.keys())
- common = sa & sb
- changed = set()
- for i in common:
- if a[i] != b[i]:
- changed.add(i)
- added = sa - sb
- removed = sb - sa
- return changed, added, removed
-
- if 'basewhitelist' in a_data and a_data['basewhitelist'] != b_data['basewhitelist']:
- print "basewhitelist changed from %s to %s" % (a_data['basewhitelist'], b_data['basewhitelist'])
-
- if 'taskwhitelist' in a_data and a_data['taskwhitelist'] != b_data['taskwhitelist']:
- print "taskwhitelist changed from %s to %s" % (a_data['taskwhitelist'], b_data['taskwhitelist'])
-
- if a_data['taskdeps'] != b_data['taskdeps']:
- print "Task dependencies changed from %s to %s" % (sorted(a_data['taskdeps']), sorted(b_data['taskdeps']))
-
- if a_data['basehash'] != b_data['basehash']:
- print "basehash changed from %s to %s" % (a_data['basehash'], b_data['basehash'])
-
- changed, added, removed = dict_diff(a_data['gendeps'], b_data['gendeps'])
- if changed:
- for dep in changed:
- print "List of dependencies for variable %s changed from %s to %s" % (dep, a_data['gendeps'][dep], b_data['gendeps'][dep])
- if added:
- for dep in added:
- print "Dependency on variable %s was added" % (dep)
- if removed:
- for dep in removed:
- print "Dependency on Variable %s was removed" % (dep)
-
-
- changed, added, removed = dict_diff(a_data['varvals'], b_data['varvals'])
- if changed:
- for dep in changed:
- print "Variable %s value changed from %s to %s" % (dep, a_data['varvals'][dep], b_data['varvals'][dep])
-
- if 'runtaskhashes' in a_data and 'runtaskhashes' in b_data:
- changed, added, removed = dict_diff(a_data['runtaskhashes'], b_data['runtaskhashes'])
- if added:
- for dep in added:
- print "Dependency on task %s was added" % (dep)
- if removed:
- for dep in removed:
- print "Dependency on task %s was removed" % (dep)
- if changed:
- for dep in changed:
- print "Hash for dependent task %s changed from %s to %s" % (dep, a_data['runtaskhashes'][dep], b_data['runtaskhashes'][dep])
- elif 'runtaskdeps' in a_data and 'runtaskdeps' in b_data and sorted(a_data['runtaskdeps']) != sorted(b_data['runtaskdeps']):
- print "Tasks this task depends on changed from %s to %s" % (sorted(a_data['runtaskdeps']), sorted(b_data['runtaskdeps']))
-
-def dump_sigfile(a):
- p1 = pickle.Unpickler(file(a, "rb"))
- a_data = p1.load()
-
- print "basewhitelist: %s" % (a_data['basewhitelist'])
-
- print "taskwhitelist: %s" % (a_data['taskwhitelist'])
-
- print "Task dependencies: %s" % (sorted(a_data['taskdeps']))
-
- print "basehash: %s" % (a_data['basehash'])
-
- for dep in a_data['gendeps']:
- print "List of dependencies for variable %s is %s" % (dep, a_data['gendeps'][dep])
-
- for dep in a_data['varvals']:
- print "Variable %s value is %s" % (dep, a_data['varvals'][dep])
-
- if 'runtaskdeps' in a_data:
- print "Tasks this task depends on: %s" % (a_data['runtaskdeps'])
-
- if 'runtaskhashes' in a_data:
- for dep in a_data['runtaskhashes']:
- print "Hash for dependent task %s is %s" % (dep, a_data['runtaskhashes'][dep])