summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bitbake/lib/bb/build.py2
-rw-r--r--bitbake/lib/bb/data.py75
-rw-r--r--bitbake/lib/bb/parse/ast.py2
3 files changed, 78 insertions, 1 deletions
diff --git a/bitbake/lib/bb/build.py b/bitbake/lib/bb/build.py
index f49b2836b..ee138a914 100644
--- a/bitbake/lib/bb/build.py
+++ b/bitbake/lib/bb/build.py
@@ -246,7 +246,7 @@ def exec_func_shell(func, d, runfile, logfile, flags):
f = open(runfile, "w")
f.write("#!/bin/sh -e\n")
if bb.msg.debug_level['default'] > 0: f.write("set -x\n")
- data.emit_env(f, d)
+ data.emit_func(func, f, d)
f.write("cd %s\n" % os.getcwd())
if func: f.write("%s\n" % func)
diff --git a/bitbake/lib/bb/data.py b/bitbake/lib/bb/data.py
index 223f9c505..4cad495b0 100644
--- a/bitbake/lib/bb/data.py
+++ b/bitbake/lib/bb/data.py
@@ -46,6 +46,7 @@ sys.path.insert(0, path)
from itertools import groupby
from bb import data_smart
+from bb import codeparser
import bb
_dict_type = data_smart.DataSmart
@@ -243,10 +244,84 @@ def export_vars(d):
pass
return ret
+def emit_func(func, o=sys.__stdout__, d = init()):
+ """Emits all items in the data store in a format such that it can be sourced by a shell."""
+
+ keys = (key for key in d.keys() if not key.startswith("__") and not d.getVarFlag(key, "func"))
+ for key in keys:
+ emit_var(key, o, d, False) and o.write('\n')
+
+ emit_var(func, o, d, False) and o.write('\n')
+ newdeps = bb.codeparser.ShellParser().parse_shell(d.getVar(func, True))
+ seen = set()
+ while newdeps:
+ deps = newdeps
+ seen |= deps
+ newdeps = set()
+ for dep in deps:
+ if bb.data.getVarFlag(dep, "func", d):
+ emit_var(dep, o, d, False) and o.write('\n')
+ newdeps |= bb.codeparser.ShellParser().parse_shell(d.getVar(dep, True))
+ newdeps -= seen
+
def update_data(d):
"""Performs final steps upon the datastore, including application of overrides"""
d.finalize()
+def build_dependencies(key, keys, shelldeps, d):
+ deps = set()
+ try:
+ if d.getVarFlag(key, "func"):
+ if d.getVarFlag(key, "python"):
+ parsedvar = d.expandWithRefs(d.getVar(key, False), key)
+ parser = bb.codeparser.PythonParser()
+ parser.parse_python(parsedvar.value)
+ deps = deps | parser.references
+ else:
+ parsedvar = d.expandWithRefs(d.getVar(key, False), key)
+ parser = bb.codeparser.ShellParser()
+ parser.parse_shell(parsedvar.value)
+ deps = deps | shelldeps
+ deps = deps | parsedvar.references
+ deps = deps | (keys & parser.execs) | (keys & parsedvar.execs)
+ else:
+ parser = d.expandWithRefs(d.getVar(key, False), key)
+ deps |= parser.references
+ deps = deps | (keys & parser.execs)
+ except:
+ bb.note("Error expanding variable %s" % key)
+ raise
+ return deps
+ #bb.note("Variable %s references %s and calls %s" % (key, str(deps), str(execs)))
+ #d.setVarFlag(key, "vardeps", deps)
+
+def generate_dependencies(d):
+
+ keys = set(key for key in d.keys() if not key.startswith("__"))
+ 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:
+ nextdeps = newdeps
+ seen |= nextdeps
+ newdeps = set()
+ for dep in nextdeps:
+ if dep not in deps:
+ 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
+
def inherits_class(klass, d):
val = getVar('__inherit_cache', d) or []
if os.path.join('classes', '%s.bbclass' % klass) in val:
diff --git a/bitbake/lib/bb/parse/ast.py b/bitbake/lib/bb/parse/ast.py
index 8763362cd..3c341b0c7 100644
--- a/bitbake/lib/bb/parse/ast.py
+++ b/bitbake/lib/bb/parse/ast.py
@@ -323,6 +323,8 @@ def finalize(fn, d):
tasklist = bb.data.getVar('__BBTASKS', d) or []
bb.build.add_tasks(tasklist, d)
+ #bb.data.generate_dependencies(d)
+
bb.event.fire(bb.event.RecipeParsed(fn), d)
def _create_variants(datastores, names, function):