summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristopher Larson <chris_larson@mentor.com>2011-10-28 21:32:26 -0400
committerChristopher Larson <chris_larson@mentor.com>2011-11-04 14:57:56 -0400
commit1060193ae4d54e667735dbff5d1d2be49a3f95c9 (patch)
treed5c80f45afc37e808e62e9c1a2d9ca33d8d86b45
parent84e535b5165c7e936c5b1486bdf4626ed3649f5f (diff)
downloadbitbake-1060193ae4d54e667735dbff5d1d2be49a3f95c9.tar.gz
codeparser: accept a name for better messages
- If a name is passed to the parser, prepend the messages with "while parsing <name>:". This gives a bit more context. - Tweak the warning messages slightly (they had to be altered anyway to inject the variable being parsed). Before: DEBUG: Warning: in call to 'bb.data.getVar': argument ''%s' % var' is \ not a literal After: DEBUG: while parsing emit_pkgdata, in call of bb.data.getVar, argument \ ''%s' % var' is not a string literal Signed-off-by: Christopher Larson <chris_larson@mentor.com>
-rw-r--r--lib/bb/codeparser.py18
-rw-r--r--lib/bb/data.py8
-rw-r--r--lib/bb/data_smart.py2
3 files changed, 15 insertions, 13 deletions
diff --git a/lib/bb/codeparser.py b/lib/bb/codeparser.py
index 77156136f..9a692a0c8 100644
--- a/lib/bb/codeparser.py
+++ b/lib/bb/codeparser.py
@@ -155,8 +155,7 @@ class PythonParser():
expands = ("d.expand", "bb.data.expand", "data.expand")
execfuncs = ("bb.build.exec_func", "bb.build.exec_task")
- @classmethod
- def warn(cls, func, arg):
+ def warn(self, func, arg):
"""Warn about calls of bitbake APIs which pass a non-literal
argument for the variable name, as we're not able to track such
a reference.
@@ -168,8 +167,7 @@ class PythonParser():
except TypeError:
logger.debug(2, 'Failed to convert function and argument to source form')
else:
- logger.debug(1, "Warning: in call to '%s', argument '%s' is "
- "not a literal", funcstr, argstr)
+ logger.debug(1, self.unhandled_message % (funcstr, argstr))
def visit_Call(self, node):
name = self.called_node_name(node.func)
@@ -208,13 +206,16 @@ class PythonParser():
else:
break
- def __init__(self):
+ def __init__(self, name):
self.var_references = set()
self.var_execs = set()
self.execs = set()
self.var_expands = set()
self.references = set()
+ self.unhandled_message = "in call of %s, argument '%s' is not a string literal"
+ self.unhandled_message = "while parsing %s, %s" % (name, self.unhandled_message)
+
def parse_python(self, node):
h = hash(str(node))
@@ -238,10 +239,12 @@ class PythonParser():
pythonparsecache[h]["execs"] = self.execs
class ShellParser():
- def __init__(self):
+ def __init__(self, name):
self.funcdefs = set()
self.allexecs = set()
self.execs = set()
+ self.unhandled_template = "unable to handle non-literal command '%s'"
+ self.unhandled_template = "while parsing %s, %s" % (name, self.unhandled_template)
def parse_shell(self, value):
"""Parse the supplied shell code in a string, returning the external
@@ -356,8 +359,7 @@ class ShellParser():
cmd = word[1]
if cmd.startswith("$"):
- logger.debug(1, "Warning: execution of non-literal "
- "command '%s'", cmd)
+ logger.debug(1, self.unhandled_template % cmd)
elif cmd == "eval":
command = " ".join(word for _, word in words[1:])
self.parse_shell(command)
diff --git a/lib/bb/data.py b/lib/bb/data.py
index ac0d8809c..bcb8b055b 100644
--- a/lib/bb/data.py
+++ b/lib/bb/data.py
@@ -258,7 +258,7 @@ def emit_func(func, o=sys.__stdout__, d = init()):
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))
+ newdeps = bb.codeparser.ShellParser(func).parse_shell(d.getVar(func, True))
seen = set()
while newdeps:
deps = newdeps
@@ -267,7 +267,7 @@ def emit_func(func, o=sys.__stdout__, d = init()):
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 |= bb.codeparser.ShellParser(dep).parse_shell(d.getVar(dep, True))
newdeps -= seen
def update_data(d):
@@ -280,12 +280,12 @@ def build_dependencies(key, keys, shelldeps, d):
if d.getVarFlag(key, "func"):
if d.getVarFlag(key, "python"):
parsedvar = d.expandWithRefs(d.getVar(key, False), key)
- parser = bb.codeparser.PythonParser()
+ parser = bb.codeparser.PythonParser(key)
parser.parse_python(parsedvar.value)
deps = deps | parser.references
else:
parsedvar = d.expandWithRefs(d.getVar(key, False), key)
- parser = bb.codeparser.ShellParser()
+ parser = bb.codeparser.ShellParser(key)
parser.parse_shell(parsedvar.value)
deps = deps | shelldeps
deps = deps | parsedvar.references
diff --git a/lib/bb/data_smart.py b/lib/bb/data_smart.py
index d8ba24ffd..44369ed82 100644
--- a/lib/bb/data_smart.py
+++ b/lib/bb/data_smart.py
@@ -68,7 +68,7 @@ class VariableParse:
code = match.group()[3:-1]
codeobj = compile(code.strip(), self.varname or "<expansion>", "eval")
- parser = bb.codeparser.PythonParser()
+ parser = bb.codeparser.PythonParser(self.varname)
parser.parse_python(code)
self.references |= parser.references
self.execs |= parser.execs