diff options
Diffstat (limited to 'bin/oe/data.py')
-rw-r--r-- | bin/oe/data.py | 477 |
1 files changed, 0 insertions, 477 deletions
diff --git a/bin/oe/data.py b/bin/oe/data.py deleted file mode 100644 index ccfaa9a3f..000000000 --- a/bin/oe/data.py +++ /dev/null @@ -1,477 +0,0 @@ -#!/usr/bin/env python -# ex:ts=4:sw=4:sts=4:et -# -*- tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- -""" -OpenEmbedded 'Data' implementations - -Functions for interacting with the data structure used by the -OpenEmbedded (http://openembedded.org) build infrastructure. - -Copyright: (c) 2003 Chris Larson - -Based on functions from the base oe module, Copyright 2003 Holger Schurig -""" - -import sys, os, re, time, types -if sys.argv[0][-5:] == "pydoc": - path = os.path.dirname(os.path.dirname(sys.argv[1])) -else: - path = os.path.dirname(os.path.dirname(sys.argv[0])) -sys.path.append(path) - -from oe import note, debug - -def init(): - return {} - -_data = init() - -def initVar(var, d = _data): - """Non-destructive var init for data structure""" - if not var in d: - d[var] = {} - - if not "flags" in d[var]: - d[var]["flags"] = {} - -__setvar_regexp__ = {} -__setvar_regexp__["_append"] = re.compile('(?P<base>.*?)%s(_(?P<add>.*))?' % "_append") -__setvar_regexp__["_prepend"] = re.compile('(?P<base>.*?)%s(_(?P<add>.*))?' % "_prepend") -__setvar_regexp__["_delete"] = re.compile('(?P<base>.*?)%s(_(?P<add>.*))?' % "_delete") - -def setVar(var, value, d = _data): - """Set a variable to a given value - - Example: - >>> setVar('TEST', 'testcontents') - >>> print getVar('TEST') - testcontents - """ - for v in ["_append", "_prepend", "_delete"]: - match = __setvar_regexp__[v].match(var) - if match: - base = match.group('base') - override = match.group('add') - l = getVarFlag(base, v, d) or [] - if override == 'delete': - if l.count([value, None]): - del l[l.index([value, None])] - l.append([value, override]) - setVarFlag(base, v, l, d) - return - - if not var in d: - initVar(var, d) - if getVarFlag(var, 'matchesenv', d): - delVarFlag(var, 'matchesenv', d) - setVarFlag(var, 'export', 1, d) - d[var]["content"] = value - -def getVar(var, d = _data, exp = 0): - """Gets the value of a variable - - Example: - >>> setVar('TEST', 'testcontents') - >>> print getVar('TEST') - testcontents - """ - if not var in d or not "content" in d[var]: - return None - if exp: - return expand(d[var]["content"], d, var) - return d[var]["content"] - -def delVar(var, d = _data): - """Removes a variable from the data set - - Example: - >>> setVar('TEST', 'testcontents') - >>> print getVar('TEST') - testcontents - >>> delVar('TEST') - >>> print getVar('TEST') - None - """ - if var in d: - del d[var] - -def setVarFlag(var, flag, flagvalue, d = _data): - """Set a flag for a given variable to a given value - - Example: - >>> setVarFlag('TEST', 'python', 1) - >>> print getVarFlag('TEST', 'python') - 1 - """ -# print "d[%s][\"flags\"][%s] = %s" % (var, flag, flagvalue) - if not var in d: - initVar(var, d) - d[var]["flags"][flag] = flagvalue - -def getVarFlag(var, flag, d = _data): - """Gets given flag from given var - - Example: - >>> setVarFlag('TEST', 'python', 1) - >>> print getVarFlag('TEST', 'python') - 1 - """ - if var in d and "flags" in d[var] and flag in d[var]["flags"]: - return d[var]["flags"][flag] - return None - -def delVarFlag(var, flag, d = _data): - """Removes a given flag from the variable's flags - - Example: - >>> setVarFlag('TEST', 'testflag', 1) - >>> print getVarFlag('TEST', 'testflag') - 1 - >>> delVarFlag('TEST', 'testflag') - >>> print getVarFlag('TEST', 'testflag') - None - - """ - if var in d and "flags" in d[var] and flag in d[var]["flags"]: - del d[var]["flags"][flag] - -def setVarFlags(var, flags, d = _data): - """Set the flags for a given variable - - Example: - >>> myflags = {} - >>> myflags['test'] = 'blah' - >>> setVarFlags('TEST', myflags) - >>> print getVarFlag('TEST', 'test') - blah - """ - if not var in d: - initVar(var, d) - d[var]["flags"] = flags - -def getVarFlags(var, d = _data): - """Gets a variable's flags - - Example: - >>> setVarFlag('TEST', 'test', 'blah') - >>> print getVarFlags('TEST')['test'] - blah - """ - if var in d and "flags" in d[var]: - return d[var]["flags"] - return None - -def delVarFlags(var, d = _data): - """Removes a variable's flags - - Example: - >>> setVarFlag('TEST', 'testflag', 1) - >>> print getVarFlag('TEST', 'testflag') - 1 - >>> delVarFlags('TEST') - >>> print getVarFlags('TEST') - None - - """ - if var in d and "flags" in d[var]: - del d[var]["flags"] - -def getData(d = _data): - """Returns the data object used""" - return d - -def setData(newData, d = _data): - """Sets the data object to the supplied value""" - d = newData - -__expand_var_regexp__ = re.compile(r"\${[^{}]+}") -__expand_python_regexp__ = re.compile(r"\${@.+?}") - -def expand(s, d = _data, varname = None): - """Variable expansion using the data store. - - Example: - Standard expansion: - >>> setVar('A', 'sshd') - >>> print expand('/usr/bin/${A}') - /usr/bin/sshd - - Python expansion: - >>> print expand('result: ${@37 * 72}') - result: 2664 - """ - def var_sub(match): - key = match.group()[2:-1] - if varname and key: - if varname == key: - raise Exception("variable %s references itself!" % varname) - var = getVar(key, d, 1) - if var is not None: - return var - else: - return match.group() - - def python_sub(match): - import oe - code = match.group()[3:-1] - locals()['d'] = d - s = eval(code) - if type(s) == types.IntType: s = str(s) - return s - - if type(s) is not types.StringType: # sanity check - return s - - while s.find('$') != -1: - olds = s - try: - s = __expand_var_regexp__.sub(var_sub, s) - s = __expand_python_regexp__.sub(python_sub, s) - if s == olds: break - if type(s) is not types.StringType: # sanity check - import oe - oe.error('expansion of %s returned non-string %s' % (olds, s)) - except: - import oe - oe.note("%s:%s while evaluating:\n%s" % (sys.exc_info()[0], sys.exc_info()[1], s)) - raise - return s - -def expandKeys(alterdata = _data, readdata = None): - if readdata == None: - readdata = alterdata - - for key in alterdata.keys(): - ekey = expand(key, readdata) - if key == ekey: - continue - val = getVar(key, alterdata) - if val is None: - continue -# import copy -# setVarFlags(ekey, copy.copy(getVarFlags(key, readdata)), alterdata) - setVar(ekey, val, alterdata) - - for i in ('_append', '_prepend', '_delete'): - dest = getVarFlag(ekey, i, alterdata) or [] - src = getVarFlag(key, i, readdata) or [] - dest.extend(src) - setVarFlag(ekey, i, dest, alterdata) - - delVar(key, alterdata) - -def expandData(alterdata = _data, readdata = None): - """For each variable in alterdata, expand it, and update the var contents. - Replacements use data from readdata. - - Example: - >>> a=init() - >>> b=init() - >>> setVar("dlmsg", "dl_dir is ${DL_DIR}", a) - >>> setVar("DL_DIR", "/path/to/whatever", b) - >>> expandData(a, b) - >>> print getVar("dlmsg", a) - dl_dir is /path/to/whatever - """ - if readdata == None: - readdata = alterdata - - for key in alterdata.keys(): - val = getVar(key, alterdata) - if type(val) is not types.StringType: - continue - expanded = expand(val, readdata) -# print "key is %s, val is %s, expanded is %s" % (key, val, expanded) - if val != expanded: - setVar(key, expanded, alterdata) - -import os - -def inheritFromOS(d = _data): - """Inherit variables from the environment.""" -# fakeroot needs to be able to set these - non_inherit_vars = [ "LD_LIBRARY_PATH", "LD_PRELOAD" ] - for s in os.environ.keys(): - if not s in non_inherit_vars: - try: - setVar(s, os.environ[s], d) - setVarFlag(s, 'matchesenv', '1', d) - except TypeError: - pass - -import sys - -def emit_var(var, o=sys.__stdout__, d = _data, all=False): - """Emit a variable to be sourced by a shell.""" - if getVarFlag(var, "python", d): - return 0 - - try: - if all: - oval = getVar(var, d, 0) - val = getVar(var, d, 1) - except KeyboardInterrupt: - raise - except: - o.write('# expansion of %s threw %s\n' % (var, sys.exc_info()[0])) - return 0 - - if all: - o.write('# %s=%s\n' % (var, oval)) - - if type(val) is not types.StringType: - return 0 - - if getVarFlag(var, 'matchesenv', d): - return 0 - - if var.find("-") != -1 or var.find(".") != -1 or var.find('{') != -1 or var.find('}') != -1 or var.find('+') != -1: - return 0 - - val.rstrip() - if not val: - return 0 - - if getVarFlag(var, "func", d): -# NOTE: should probably check for unbalanced {} within the var - o.write("%s() {\n%s\n}\n" % (var, val)) - else: - if getVarFlag(var, "export", d): - o.write('export ') - else: - if not all: - return 0 -# if we're going to output this within doublequotes, -# to a shell, we need to escape the quotes in the var - alter = re.sub('"', '\\"', val.strip()) - o.write('%s="%s"\n' % (var, alter)) - return 1 - - -def emit_env(o=sys.__stdout__, d = _data, all=False): - """Emits all items in the data store in a format such that it can be sourced by a shell.""" - - env = d.keys() - - for e in env: - if getVarFlag(e, "func", d): - continue - emit_var(e, o, d, all) and o.write('\n') - - for e in env: - if not getVarFlag(e, "func", d): - continue - emit_var(e, o, d) and o.write('\n') - -def update_data(d = _data): - """Modifies the environment vars according to local overrides and commands. - Examples: - Appending to a variable: - >>> setVar('TEST', 'this is a') - >>> setVar('TEST_append', ' test') - >>> setVar('TEST_append', ' of the emergency broadcast system.') - >>> update_data() - >>> print getVar('TEST') - this is a test of the emergency broadcast system. - - Prepending to a variable: - >>> setVar('TEST', 'virtual/libc') - >>> setVar('TEST_prepend', 'virtual/tmake ') - >>> setVar('TEST_prepend', 'virtual/patcher ') - >>> update_data() - >>> print getVar('TEST') - virtual/patcher virtual/tmake virtual/libc - - Overrides: - >>> setVar('TEST_arm', 'target') - >>> setVar('TEST_ramses', 'machine') - >>> setVar('TEST_local', 'local') - >>> setVar('OVERRIDES', 'arm') - - >>> setVar('TEST', 'original') - >>> update_data() - >>> print getVar('TEST') - target - - >>> setVar('OVERRIDES', 'arm:ramses:local') - >>> setVar('TEST', 'original') - >>> update_data() - >>> print getVar('TEST') - local - """ - - debug(2, "update_data()") - -# can't do delete env[...] while iterating over the dictionary, so remember them - dodel = [] - overrides = (getVar('OVERRIDES', d, 1) or "").split(':') or [] - - def applyOverrides(var, d = _data): - if not overrides: - debug(1, "OVERRIDES not defined, nothing to do") - return - val = getVar(var, d) - for o in overrides: - if var.endswith("_" + o): - l = len(o)+1 - name = var[:-l] - d[name] = d[var] - - for s in d.keys(): - applyOverrides(s, d) - sval = getVar(s, d) or "" - -# Handle line appends: - for (a, o) in getVarFlag(s, '_append', d) or []: - # maybe the OVERRIDE was not yet added so keep the append - if (o and o in overrides) or not o: - delVarFlag(s, '_append', d) - if o: - if not o in overrides: - continue - sval+=a - setVar(s, sval, d) - -# Handle line prepends - for (a, o) in getVarFlag(s, '_prepend', d) or []: - # maybe the OVERRIDE was not yet added so keep the append - if (o and o in overrides) or not o: - delVarFlag(s, '_prepend', d) - if o: - if not o in overrides: - continue - sval=a+sval - setVar(s, sval, d) - -# Handle line deletions - name = s + "_delete" - nameval = getVar(name, d) - if nameval: - sval = getVar(s, d) - if sval: - new = '' - pattern = nameval.replace('\n','').strip() - for line in sval.split('\n'): - if line.find(pattern) == -1: - new = new + '\n' + line - setVar(s, new, d) - dodel.append(name) - -# delete all environment vars no longer needed - for s in dodel: - delVar(s, d) - -def inherits_class(klass, d): - val = getVar('__inherit_cache', d) or "" - if ("classes/%s.oeclass" % klass) in val.split(): - return True - return False - -def _test(): - """Start a doctest run on this module""" - import doctest - from oe import data - doctest.testmod(data) - -if __name__ == "__main__": - _test() |