diff options
Diffstat (limited to 'bitbake/lib/bb/parse/ast.py')
| -rw-r--r-- | bitbake/lib/bb/parse/ast.py | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/bitbake/lib/bb/parse/ast.py b/bitbake/lib/bb/parse/ast.py index f21b0aeb45..b6dadd1e2a 100644 --- a/bitbake/lib/bb/parse/ast.py +++ b/bitbake/lib/bb/parse/ast.py | |||
| @@ -30,13 +30,85 @@ class StatementGroup: | |||
| 30 | def __init__(self): | 30 | def __init__(self): |
| 31 | self.statements = [] | 31 | self.statements = [] |
| 32 | 32 | ||
| 33 | def append(self, statement): | ||
| 34 | self.statements.append(statement) | ||
| 35 | |||
| 33 | def eval(self, data): | 36 | def eval(self, data): |
| 34 | """ | 37 | """ |
| 35 | Apply each statement on the data... in order | 38 | Apply each statement on the data... in order |
| 36 | """ | 39 | """ |
| 37 | map(lambda x: x.eval(data), self.statements) | 40 | map(lambda x: x.eval(data), self.statements) |
| 38 | 41 | ||
| 42 | class IncludeNode: | ||
| 43 | def __init__(self, what_file, fn, lineno): | ||
| 44 | self.what_file = what_file | ||
| 45 | self.from_fn = fn | ||
| 46 | self.from_lineno = lineno | ||
| 47 | |||
| 48 | def eval(self, data): | ||
| 49 | """ | ||
| 50 | Include the file and evaluate the statements | ||
| 51 | """ | ||
| 52 | s = bb.data.expand(self.what_file, data) | ||
| 53 | bb.msg.debug(3, bb.msg.domain.Parsing, "CONF %s:%d: including %s" % (self.from_fn, self.from_lineno, s)) | ||
| 54 | |||
| 55 | # TODO: Cache those includes... | ||
| 56 | statements = StatementGroup() | ||
| 57 | bb.parse.ConfHandler.include(statements, self.from_fn, s, data, False) | ||
| 58 | statements.eval(data) | ||
| 59 | |||
| 60 | class ExportNode: | ||
| 61 | def __init__(self, var): | ||
| 62 | self.var = var | ||
| 63 | |||
| 64 | def eval(self, data): | ||
| 65 | bb.data.setVarFlag(self.var, "export", 1, data) | ||
| 66 | |||
| 67 | class DataNode: | ||
| 68 | """ | ||
| 69 | Various data related updates. For the sake of sanity | ||
| 70 | we have one class doing all this. This means that all | ||
| 71 | this need to be re-evaluated... we might be able to do | ||
| 72 | that faster with multiple classes. | ||
| 73 | """ | ||
| 74 | def __init__(self, groupd): | ||
| 75 | self.groupd = groupd | ||
| 76 | |||
| 77 | def eval(self, data): | ||
| 78 | groupd = self.groupd | ||
| 79 | key = groupd["var"] | ||
| 80 | if "exp" in groupd and groupd["exp"] != None: | ||
| 81 | bb.data.setVarFlag(key, "export", 1, data) | ||
| 82 | if "ques" in groupd and groupd["ques"] != None: | ||
| 83 | val = getFunc(groupd, key, data) | ||
| 84 | if val == None: | ||
| 85 | val = groupd["value"] | ||
| 86 | elif "colon" in groupd and groupd["colon"] != None: | ||
| 87 | e = data.createCopy() | ||
| 88 | bb.data.update_data(e) | ||
| 89 | val = bb.data.expand(groupd["value"], e) | ||
| 90 | elif "append" in groupd and groupd["append"] != None: | ||
| 91 | val = "%s %s" % ((getFunc(groupd, key, data) or ""), groupd["value"]) | ||
| 92 | elif "prepend" in groupd and groupd["prepend"] != None: | ||
| 93 | val = "%s %s" % (groupd["value"], (getFunc(groupd, key, data) or "")) | ||
| 94 | elif "postdot" in groupd and groupd["postdot"] != None: | ||
| 95 | val = "%s%s" % ((getFunc(groupd, key, data) or ""), groupd["value"]) | ||
| 96 | elif "predot" in groupd and groupd["predot"] != None: | ||
| 97 | val = "%s%s" % (groupd["value"], (getFunc(groupd, key, data) or "")) | ||
| 98 | else: | ||
| 99 | val = groupd["value"] | ||
| 100 | if 'flag' in groupd and groupd['flag'] != None: | ||
| 101 | bb.msg.debug(3, bb.msg.domain.Parsing, "setVarFlag(%s, %s, %s, data)" % (key, groupd['flag'], val)) | ||
| 102 | bb.data.setVarFlag(key, groupd['flag'], val, data) | ||
| 103 | else: | ||
| 104 | bb.data.setVar(key, val, data) | ||
| 105 | |||
| 106 | |||
| 107 | |||
| 39 | def handleInclude(statements, m, fn, lineno, data, force): | 108 | def handleInclude(statements, m, fn, lineno, data, force): |
| 109 | # AST handling | ||
| 110 | statements.append(IncludeNode(m.group(1), fn, lineno)) | ||
| 111 | |||
| 40 | s = bb.data.expand(m.group(1), data) | 112 | s = bb.data.expand(m.group(1), data) |
| 41 | bb.msg.debug(3, bb.msg.domain.Parsing, "CONF %s:%d: including %s" % (fn, lineno, s)) | 113 | bb.msg.debug(3, bb.msg.domain.Parsing, "CONF %s:%d: including %s" % (fn, lineno, s)) |
| 42 | if force: | 114 | if force: |
| @@ -45,9 +117,15 @@ def handleInclude(statements, m, fn, lineno, data, force): | |||
| 45 | bb.parse.ConfHandler.include(statements, fn, s, data, False) | 117 | bb.parse.ConfHandler.include(statements, fn, s, data, False) |
| 46 | 118 | ||
| 47 | def handleExport(statements, m, data): | 119 | def handleExport(statements, m, data): |
| 120 | # AST handling | ||
| 121 | statements.append(ExportNode(m.group(1))) | ||
| 122 | |||
| 48 | bb.data.setVarFlag(m.group(1), "export", 1, data) | 123 | bb.data.setVarFlag(m.group(1), "export", 1, data) |
| 49 | 124 | ||
| 50 | def handleData(statements, groupd, data): | 125 | def handleData(statements, groupd, data): |
| 126 | # AST handling | ||
| 127 | statements.append(DataNode(groupd)) | ||
| 128 | |||
| 51 | key = groupd["var"] | 129 | key = groupd["var"] |
| 52 | if "exp" in groupd and groupd["exp"] != None: | 130 | if "exp" in groupd and groupd["exp"] != None: |
| 53 | bb.data.setVarFlag(key, "export", 1, data) | 131 | bb.data.setVarFlag(key, "export", 1, data) |
