summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--bitbake/lib/bb/codeparser.py18
-rw-r--r--bitbake/lib/bb/data.py8
-rw-r--r--bitbake/lib/bb/data_smart.py2
3 files changed, 15 insertions, 13 deletions
diff --git a/bitbake/lib/bb/codeparser.py b/bitbake/lib/bb/codeparser.py
index 77156136f8..9a692a0c8e 100644
--- a/bitbake/lib/bb/codeparser.py
+++ b/bitbake/lib/bb/codeparser.py
@@ -155,8 +155,7 @@ class PythonParser():
155 expands = ("d.expand", "bb.data.expand", "data.expand") 155 expands = ("d.expand", "bb.data.expand", "data.expand")
156 execfuncs = ("bb.build.exec_func", "bb.build.exec_task") 156 execfuncs = ("bb.build.exec_func", "bb.build.exec_task")
157 157
158 @classmethod 158 def warn(self, func, arg):
159 def warn(cls, func, arg):
160 """Warn about calls of bitbake APIs which pass a non-literal 159 """Warn about calls of bitbake APIs which pass a non-literal
161 argument for the variable name, as we're not able to track such 160 argument for the variable name, as we're not able to track such
162 a reference. 161 a reference.
@@ -168,8 +167,7 @@ class PythonParser():
168 except TypeError: 167 except TypeError:
169 logger.debug(2, 'Failed to convert function and argument to source form') 168 logger.debug(2, 'Failed to convert function and argument to source form')
170 else: 169 else:
171 logger.debug(1, "Warning: in call to '%s', argument '%s' is " 170 logger.debug(1, self.unhandled_message % (funcstr, argstr))
172 "not a literal", funcstr, argstr)
173 171
174 def visit_Call(self, node): 172 def visit_Call(self, node):
175 name = self.called_node_name(node.func) 173 name = self.called_node_name(node.func)
@@ -208,13 +206,16 @@ class PythonParser():
208 else: 206 else:
209 break 207 break
210 208
211 def __init__(self): 209 def __init__(self, name):
212 self.var_references = set() 210 self.var_references = set()
213 self.var_execs = set() 211 self.var_execs = set()
214 self.execs = set() 212 self.execs = set()
215 self.var_expands = set() 213 self.var_expands = set()
216 self.references = set() 214 self.references = set()
217 215
216 self.unhandled_message = "in call of %s, argument '%s' is not a string literal"
217 self.unhandled_message = "while parsing %s, %s" % (name, self.unhandled_message)
218
218 def parse_python(self, node): 219 def parse_python(self, node):
219 h = hash(str(node)) 220 h = hash(str(node))
220 221
@@ -238,10 +239,12 @@ class PythonParser():
238 pythonparsecache[h]["execs"] = self.execs 239 pythonparsecache[h]["execs"] = self.execs
239 240
240class ShellParser(): 241class ShellParser():
241 def __init__(self): 242 def __init__(self, name):
242 self.funcdefs = set() 243 self.funcdefs = set()
243 self.allexecs = set() 244 self.allexecs = set()
244 self.execs = set() 245 self.execs = set()
246 self.unhandled_template = "unable to handle non-literal command '%s'"
247 self.unhandled_template = "while parsing %s, %s" % (name, self.unhandled_template)
245 248
246 def parse_shell(self, value): 249 def parse_shell(self, value):
247 """Parse the supplied shell code in a string, returning the external 250 """Parse the supplied shell code in a string, returning the external
@@ -356,8 +359,7 @@ class ShellParser():
356 359
357 cmd = word[1] 360 cmd = word[1]
358 if cmd.startswith("$"): 361 if cmd.startswith("$"):
359 logger.debug(1, "Warning: execution of non-literal " 362 logger.debug(1, self.unhandled_template % cmd)
360 "command '%s'", cmd)
361 elif cmd == "eval": 363 elif cmd == "eval":
362 command = " ".join(word for _, word in words[1:]) 364 command = " ".join(word for _, word in words[1:])
363 self.parse_shell(command) 365 self.parse_shell(command)
diff --git a/bitbake/lib/bb/data.py b/bitbake/lib/bb/data.py
index ac0d8809cc..bcb8b055b8 100644
--- a/bitbake/lib/bb/data.py
+++ b/bitbake/lib/bb/data.py
@@ -258,7 +258,7 @@ def emit_func(func, o=sys.__stdout__, d = init()):
258 emit_var(key, o, d, False) and o.write('\n') 258 emit_var(key, o, d, False) and o.write('\n')
259 259
260 emit_var(func, o, d, False) and o.write('\n') 260 emit_var(func, o, d, False) and o.write('\n')
261 newdeps = bb.codeparser.ShellParser().parse_shell(d.getVar(func, True)) 261 newdeps = bb.codeparser.ShellParser(func).parse_shell(d.getVar(func, True))
262 seen = set() 262 seen = set()
263 while newdeps: 263 while newdeps:
264 deps = newdeps 264 deps = newdeps
@@ -267,7 +267,7 @@ def emit_func(func, o=sys.__stdout__, d = init()):
267 for dep in deps: 267 for dep in deps:
268 if bb.data.getVarFlag(dep, "func", d): 268 if bb.data.getVarFlag(dep, "func", d):
269 emit_var(dep, o, d, False) and o.write('\n') 269 emit_var(dep, o, d, False) and o.write('\n')
270 newdeps |= bb.codeparser.ShellParser().parse_shell(d.getVar(dep, True)) 270 newdeps |= bb.codeparser.ShellParser(dep).parse_shell(d.getVar(dep, True))
271 newdeps -= seen 271 newdeps -= seen
272 272
273def update_data(d): 273def update_data(d):
@@ -280,12 +280,12 @@ def build_dependencies(key, keys, shelldeps, d):
280 if d.getVarFlag(key, "func"): 280 if d.getVarFlag(key, "func"):
281 if d.getVarFlag(key, "python"): 281 if d.getVarFlag(key, "python"):
282 parsedvar = d.expandWithRefs(d.getVar(key, False), key) 282 parsedvar = d.expandWithRefs(d.getVar(key, False), key)
283 parser = bb.codeparser.PythonParser() 283 parser = bb.codeparser.PythonParser(key)
284 parser.parse_python(parsedvar.value) 284 parser.parse_python(parsedvar.value)
285 deps = deps | parser.references 285 deps = deps | parser.references
286 else: 286 else:
287 parsedvar = d.expandWithRefs(d.getVar(key, False), key) 287 parsedvar = d.expandWithRefs(d.getVar(key, False), key)
288 parser = bb.codeparser.ShellParser() 288 parser = bb.codeparser.ShellParser(key)
289 parser.parse_shell(parsedvar.value) 289 parser.parse_shell(parsedvar.value)
290 deps = deps | shelldeps 290 deps = deps | shelldeps
291 deps = deps | parsedvar.references 291 deps = deps | parsedvar.references
diff --git a/bitbake/lib/bb/data_smart.py b/bitbake/lib/bb/data_smart.py
index d8ba24ffd7..44369ed82d 100644
--- a/bitbake/lib/bb/data_smart.py
+++ b/bitbake/lib/bb/data_smart.py
@@ -68,7 +68,7 @@ class VariableParse:
68 code = match.group()[3:-1] 68 code = match.group()[3:-1]
69 codeobj = compile(code.strip(), self.varname or "<expansion>", "eval") 69 codeobj = compile(code.strip(), self.varname or "<expansion>", "eval")
70 70
71 parser = bb.codeparser.PythonParser() 71 parser = bb.codeparser.PythonParser(self.varname)
72 parser.parse_python(code) 72 parser.parse_python(code)
73 self.references |= parser.references 73 self.references |= parser.references
74 self.execs |= parser.execs 74 self.execs |= parser.execs