summaryrefslogtreecommitdiffstats
path: root/lib/bb/data.py
diff options
context:
space:
mode:
authorChris Larson <chris_larson@mentor.com>2011-01-07 08:51:43 -0700
committerChris Larson <chris_larson@mentor.com>2011-01-07 10:58:11 -0500
commitd93bd42e8a6f66bf7a7a638d98e5e06ccd5a2c33 (patch)
tree914de98748b9040bbf0634788252e119325bc139 /lib/bb/data.py
parent96ee6840010c1ae1080e6bf7ff0f4eb2d361e84b (diff)
parent315b83d1de954e51d0d077ff00140a7ec41ffbc7 (diff)
downloadbitbake-contrib-d93bd42e8a6f66bf7a7a638d98e5e06ccd5a2c33.tar.gz
Merge branch 'poky-sync'
* poky-sync: build: kill unneeded environment setup bits parse: save python functions into the metadata Include exported variables in task process env runqueue: start implementing quieterrors Overhaul environment handling runqueue: resurrect use of file objects for pipein/pipeout runqueue: clean up message log levels runqueue: use correct task ID when checking validity of setscene tasks Add support for 'noexec' tasks runqueue: implement cache checking from metadata runqueue: pass task hash information to tasks runqueue: avoid unnecessary delays Implement task signatures data: Add emit_func and generate_dependencies codeparser: Implement persistent cache data_smart: track variable references codeparser: add module for parsing shell/python runqueue: implement scenequeue fetch: add SRC_URI checksum Signed-off-by: Chris Larson <chris_larson@mentor.com>
Diffstat (limited to 'lib/bb/data.py')
-rw-r--r--lib/bb/data.py96
1 files changed, 95 insertions, 1 deletions
diff --git a/lib/bb/data.py b/lib/bb/data.py
index ef60c2868..8e7031e34 100644
--- a/lib/bb/data.py
+++ b/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
@@ -160,10 +161,12 @@ def expandKeys(alterdata, readdata = None):
def inheritFromOS(d):
"""Inherit variables from the environment."""
+ exportlist = bb.utils.preserved_envvars_exported()
for s in os.environ.keys():
try:
setVar(s, os.environ[s], d)
- setVarFlag(s, "export", True, d)
+ if s in exportlist:
+ setVarFlag(s, "export", True, d)
except TypeError:
pass
@@ -231,10 +234,101 @@ def emit_env(o=sys.__stdout__, d = init(), all=False):
for key in keys:
emit_var(key, o, d, all and not isfunc) and o.write('\n')
+def exported_keys(d):
+ return (key for key in d.keys() if not key.startswith('__') and
+ d.getVarFlag(key, 'export') and
+ not d.getVarFlag(key, 'unexport'))
+
+def exported_vars(d):
+ for key in exported_keys(d):
+ try:
+ value = d.getVar(key, True)
+ except Exception:
+ pass
+
+ if value is not None:
+ yield key, str(value)
+
+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)
+ deps |= set((d.getVarFlag(key, "vardeps") or "").split())
+ deps -= set((d.getVarFlag(key, "vardepsexclude") or "").split())
+ 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: