summaryrefslogtreecommitdiffstats
path: root/bitbake
diff options
context:
space:
mode:
authorRichard Purdie <richard.purdie@linuxfoundation.org>2011-11-24 17:41:02 +0000
committerRichard Purdie <richard.purdie@linuxfoundation.org>2012-01-30 16:16:12 +0000
commit9a68fb1364b81c0569c36d348c819480455643a1 (patch)
tree234d0a0452bd14f04dfcc40b62866663a138dcea /bitbake
parentf87c92143ef0dc068ded80bb39f04e37d1f06edd (diff)
downloadpoky-9a68fb1364b81c0569c36d348c819480455643a1.tar.gz
data/siggen: Add vardepvalue mechanism to allow the variable dependency code to be forced to specific values
We have a problem if we want to inject specific information into the variable dependency code. There are cases for example where we want a dependency on the value of X but it doesn't matter how X was constructed or what dependencies it might have had, we only care about the absolute value. With the current code, its near enough impossible to do this. This patch adds such a mechanism so the user can trigger this with code like: baselib[vardepvalue] = "${baselib}" It also refactors some of the code so we do variable lookups once instead of doing this in two different functions. [YOCTO #1583] (Bitbake rev: 6c879b44ccf42dc73fe4467076e114700d7ba81b) Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'bitbake')
-rw-r--r--bitbake/lib/bb/data.py27
-rw-r--r--bitbake/lib/bb/siggen.py3
2 files changed, 17 insertions, 13 deletions
diff --git a/bitbake/lib/bb/data.py b/bitbake/lib/bb/data.py
index ac0d8809cc..d5d992934d 100644
--- a/bitbake/lib/bb/data.py
+++ b/bitbake/lib/bb/data.py
@@ -274,24 +274,27 @@ def update_data(d):
274 """Performs final steps upon the datastore, including application of overrides""" 274 """Performs final steps upon the datastore, including application of overrides"""
275 d.finalize() 275 d.finalize()
276 276
277def build_dependencies(key, keys, shelldeps, d): 277def build_dependencies(key, keys, shelldeps, vardepvals, d):
278 deps = set() 278 deps = set()
279 try: 279 try:
280 if d.getVarFlag(key, "func"): 280 value = d.getVar(key, False)
281 if key in vardepvals:
282 value = d.getVarFlag(key, "vardepvalue", True)
283 elif d.getVarFlag(key, "func"):
281 if d.getVarFlag(key, "python"): 284 if d.getVarFlag(key, "python"):
282 parsedvar = d.expandWithRefs(d.getVar(key, False), key) 285 parsedvar = d.expandWithRefs(value, key)
283 parser = bb.codeparser.PythonParser() 286 parser = bb.codeparser.PythonParser(key, logger)
284 parser.parse_python(parsedvar.value) 287 parser.parse_python(parsedvar.value)
285 deps = deps | parser.references 288 deps = deps | parser.references
286 else: 289 else:
287 parsedvar = d.expandWithRefs(d.getVar(key, False), key) 290 parsedvar = d.expandWithRefs(value, key)
288 parser = bb.codeparser.ShellParser() 291 parser = bb.codeparser.ShellParser(key, logger)
289 parser.parse_shell(parsedvar.value) 292 parser.parse_shell(parsedvar.value)
290 deps = deps | shelldeps 293 deps = deps | shelldeps
291 deps = deps | parsedvar.references 294 deps = deps | parsedvar.references
292 deps = deps | (keys & parser.execs) | (keys & parsedvar.execs) 295 deps = deps | (keys & parser.execs) | (keys & parsedvar.execs)
293 else: 296 else:
294 parser = d.expandWithRefs(d.getVar(key, False), key) 297 parser = d.expandWithRefs(value, key)
295 deps |= parser.references 298 deps |= parser.references
296 deps = deps | (keys & parser.execs) 299 deps = deps | (keys & parser.execs)
297 deps |= set((d.getVarFlag(key, "vardeps", True) or "").split()) 300 deps |= set((d.getVarFlag(key, "vardeps", True) or "").split())
@@ -299,7 +302,7 @@ def build_dependencies(key, keys, shelldeps, d):
299 except: 302 except:
300 bb.note("Error expanding variable %s" % key) 303 bb.note("Error expanding variable %s" % key)
301 raise 304 raise
302 return deps 305 return deps, value
303 #bb.note("Variable %s references %s and calls %s" % (key, str(deps), str(execs))) 306 #bb.note("Variable %s references %s and calls %s" % (key, str(deps), str(execs)))
304 #d.setVarFlag(key, "vardeps", deps) 307 #d.setVarFlag(key, "vardeps", deps)
305 308
@@ -307,12 +310,14 @@ def generate_dependencies(d):
307 310
308 keys = set(key for key in d.keys() if not key.startswith("__")) 311 keys = set(key for key in d.keys() if not key.startswith("__"))
309 shelldeps = set(key for key in keys if d.getVarFlag(key, "export") and not d.getVarFlag(key, "unexport")) 312 shelldeps = set(key for key in keys if d.getVarFlag(key, "export") and not d.getVarFlag(key, "unexport"))
313 vardepvals = set(key for key in keys if d.getVarFlag(key, "vardepvalue"))
310 314
311 deps = {} 315 deps = {}
316 values = {}
312 317
313 tasklist = bb.data.getVar('__BBTASKS', d) or [] 318 tasklist = bb.data.getVar('__BBTASKS', d) or []
314 for task in tasklist: 319 for task in tasklist:
315 deps[task] = build_dependencies(task, keys, shelldeps, d) 320 deps[task], values[task] = build_dependencies(task, keys, shelldeps, vardepvals, d)
316 newdeps = deps[task] 321 newdeps = deps[task]
317 seen = set() 322 seen = set()
318 while newdeps: 323 while newdeps:
@@ -321,11 +326,11 @@ def generate_dependencies(d):
321 newdeps = set() 326 newdeps = set()
322 for dep in nextdeps: 327 for dep in nextdeps:
323 if dep not in deps: 328 if dep not in deps:
324 deps[dep] = build_dependencies(dep, keys, shelldeps, d) 329 deps[dep], values[dep] = build_dependencies(dep, keys, shelldeps, vardepvals, d)
325 newdeps |= deps[dep] 330 newdeps |= deps[dep]
326 newdeps -= seen 331 newdeps -= seen
327 #print "For %s: %s" % (task, str(taskdeps[task])) 332 #print "For %s: %s" % (task, str(taskdeps[task]))
328 return tasklist, deps 333 return tasklist, deps, values
329 334
330def inherits_class(klass, d): 335def inherits_class(klass, d):
331 val = getVar('__inherit_cache', d) or [] 336 val = getVar('__inherit_cache', d) or []
diff --git a/bitbake/lib/bb/siggen.py b/bitbake/lib/bb/siggen.py
index 9231291b43..758074287d 100644
--- a/bitbake/lib/bb/siggen.py
+++ b/bitbake/lib/bb/siggen.py
@@ -72,11 +72,10 @@ class SignatureGeneratorBasic(SignatureGenerator):
72 72
73 def _build_data(self, fn, d): 73 def _build_data(self, fn, d):
74 74
75 tasklist, gendeps = bb.data.generate_dependencies(d) 75 tasklist, gendeps, lookupcache = bb.data.generate_dependencies(d)
76 76
77 taskdeps = {} 77 taskdeps = {}
78 basehash = {} 78 basehash = {}
79 lookupcache = {}
80 79
81 for task in tasklist: 80 for task in tasklist:
82 data = d.getVar(task, False) 81 data = d.getVar(task, False)