diff options
author | Chris Larson <chris_larson@mentor.com> | 2011-01-07 08:51:43 -0700 |
---|---|---|
committer | Chris Larson <chris_larson@mentor.com> | 2011-01-07 10:58:11 -0500 |
commit | d93bd42e8a6f66bf7a7a638d98e5e06ccd5a2c33 (patch) | |
tree | 914de98748b9040bbf0634788252e119325bc139 /lib/bb/data.py | |
parent | 96ee6840010c1ae1080e6bf7ff0f4eb2d361e84b (diff) | |
parent | 315b83d1de954e51d0d077ff00140a7ec41ffbc7 (diff) | |
download | bitbake-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.py | 96 |
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: |