]> code.ossystems Code Review - openembedded-core.git/commitdiff
bitbake/siggen.py: Fix whitelisted variable handling
authorRichard Purdie <richard.purdie@linuxfoundation.org>
Wed, 12 Jan 2011 15:58:48 +0000 (15:58 +0000)
committerRichard Purdie <richard.purdie@linuxfoundation.org>
Wed, 12 Jan 2011 15:58:48 +0000 (15:58 +0000)
Even when a variable was whitelisted, any dependencies of that variable
could still creep into the task hash due to the way the whitelisting
code worked. This patch changes thing to ensure that when whitelisted,
that whitelisting applies to the variable and any dependencies it has.

Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
bitbake/lib/bb/data.py
bitbake/lib/bb/siggen.py

index 198b628fad9e40f1d64a2a487eda459682b6d615..50f2218a7009a0e184493368cc006b17ce16621e 100644 (file)
@@ -313,12 +313,10 @@ def generate_dependencies(d):
     shelldeps = set(key for key in keys if d.getVarFlag(key, "export") and not d.getVarFlag(key, "unexport"))
 
     deps = {}
-    taskdeps = {}
 
     tasklist = bb.data.getVar('__BBTASKS', d) or []
     for task in tasklist:
         deps[task] = build_dependencies(task, keys, shelldeps, d)
-
         newdeps = deps[task]
         seen = set()
         while newdeps:
@@ -330,9 +328,8 @@ def generate_dependencies(d):
                     deps[dep] = build_dependencies(dep, keys, shelldeps, d)
                 newdeps |=  deps[dep]
             newdeps -= seen
-        taskdeps[task] = seen | newdeps
         #print "For %s: %s" % (task, str(taskdeps[task]))
-    return taskdeps, deps
+    return tasklist, deps
 
 def inherits_class(klass, d):
     val = getVar('__inherit_cache', d) or []
index 4dc09b3f9e7efdd2c195a84bec9c48aaf4d2804a..010c2cab26cffba431bf6480941ae1287c58b201 100644 (file)
@@ -57,7 +57,7 @@ class SignatureGeneratorBasic(SignatureGenerator):
         self.runtaskdeps = {}
         self.gendeps = {}
         self.lookupcache = {}
-        self.basewhitelist = (data.getVar("BB_HASHBASE_WHITELIST", True) or "").split()
+        self.basewhitelist = set((data.getVar("BB_HASHBASE_WHITELIST", True) or "").split())
         self.taskwhitelist = data.getVar("BB_HASHTASK_WHITELIST", True) or None
 
         if self.taskwhitelist:
@@ -67,17 +67,31 @@ class SignatureGeneratorBasic(SignatureGenerator):
 
     def _build_data(self, fn, d):
 
-        taskdeps, gendeps = bb.data.generate_dependencies(d)
+        tasklist, gendeps = bb.data.generate_dependencies(d)
 
+        taskdeps = {}
         basehash = {}
         lookupcache = {}
 
-        for task in taskdeps:
+        for task in tasklist:
             data = d.getVar(task, False)
             lookupcache[task] = data
-            for dep in sorted(taskdeps[task]):
-                if dep in self.basewhitelist:
-                    continue
+
+            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:
@@ -88,6 +102,7 @@ class SignatureGeneratorBasic(SignatureGenerator):
             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