summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--bitbake/lib/bb/build.py15
-rw-r--r--bitbake/lib/bb/utils.py4
2 files changed, 14 insertions, 5 deletions
diff --git a/bitbake/lib/bb/build.py b/bitbake/lib/bb/build.py
index d20ee065b2..db5072cb4d 100644
--- a/bitbake/lib/bb/build.py
+++ b/bitbake/lib/bb/build.py
@@ -156,7 +156,12 @@ class LogTee(object):
156 def flush(self): 156 def flush(self):
157 self.outfile.flush() 157 self.outfile.flush()
158 158
159def exec_func(func, d, dirs = None): 159#
160# pythonexception allows the python exceptions generated to be raised
161# as the real exceptions (not FuncFailed) and without a backtrace at the
162# origin of the failure.
163#
164def exec_func(func, d, dirs = None, pythonexception=False):
160 """Execute a BB 'function'""" 165 """Execute a BB 'function'"""
161 166
162 body = d.getVar(func, False) 167 body = d.getVar(func, False)
@@ -224,7 +229,7 @@ def exec_func(func, d, dirs = None):
224 229
225 with bb.utils.fileslocked(lockfiles): 230 with bb.utils.fileslocked(lockfiles):
226 if ispython: 231 if ispython:
227 exec_func_python(func, d, runfile, cwd=adir) 232 exec_func_python(func, d, runfile, cwd=adir, pythonexception=pythonexception)
228 else: 233 else:
229 exec_func_shell(func, d, runfile, cwd=adir) 234 exec_func_shell(func, d, runfile, cwd=adir)
230 235
@@ -232,7 +237,7 @@ _functionfmt = """
232{function}(d) 237{function}(d)
233""" 238"""
234logformatter = bb.msg.BBLogFormatter("%(levelname)s: %(message)s") 239logformatter = bb.msg.BBLogFormatter("%(levelname)s: %(message)s")
235def exec_func_python(func, d, runfile, cwd=None): 240def exec_func_python(func, d, runfile, cwd=None, pythonexception=False):
236 """Execute a python BB 'function'""" 241 """Execute a python BB 'function'"""
237 242
238 code = _functionfmt.format(function=func) 243 code = _functionfmt.format(function=func)
@@ -256,10 +261,12 @@ def exec_func_python(func, d, runfile, cwd=None):
256 bb.methodpool.insert_method(func, text, fn, lineno - 1) 261 bb.methodpool.insert_method(func, text, fn, lineno - 1)
257 262
258 comp = utils.better_compile(code, func, "exec_python_func() autogenerated") 263 comp = utils.better_compile(code, func, "exec_python_func() autogenerated")
259 utils.better_exec(comp, {"d": d}, code, "exec_python_func() autogenerated") 264 utils.better_exec(comp, {"d": d}, code, "exec_python_func() autogenerated", pythonexception=pythonexception)
260 except (bb.parse.SkipRecipe, bb.build.FuncFailed): 265 except (bb.parse.SkipRecipe, bb.build.FuncFailed):
261 raise 266 raise
262 except: 267 except:
268 if pythonexception:
269 raise
263 raise FuncFailed(func, None) 270 raise FuncFailed(func, None)
264 finally: 271 finally:
265 bb.debug(2, "Python function %s finished" % func) 272 bb.debug(2, "Python function %s finished" % func)
diff --git a/bitbake/lib/bb/utils.py b/bitbake/lib/bb/utils.py
index 7ab8927608..e9ad68f2d7 100644
--- a/bitbake/lib/bb/utils.py
+++ b/bitbake/lib/bb/utils.py
@@ -372,7 +372,7 @@ def _print_exception(t, value, tb, realfile, text, context):
372 finally: 372 finally:
373 logger.error("\n".join(error)) 373 logger.error("\n".join(error))
374 374
375def better_exec(code, context, text = None, realfile = "<code>"): 375def better_exec(code, context, text = None, realfile = "<code>", pythonexception=False):
376 """ 376 """
377 Similiar to better_compile, better_exec will 377 Similiar to better_compile, better_exec will
378 print the lines that are responsible for the 378 print the lines that are responsible for the
@@ -389,6 +389,8 @@ def better_exec(code, context, text = None, realfile = "<code>"):
389 # Error already shown so passthrough, no need for traceback 389 # Error already shown so passthrough, no need for traceback
390 raise 390 raise
391 except Exception as e: 391 except Exception as e:
392 if pythonexception:
393 raise
392 (t, value, tb) = sys.exc_info() 394 (t, value, tb) = sys.exc_info()
393 try: 395 try:
394 _print_exception(t, value, tb, realfile, text, context) 396 _print_exception(t, value, tb, realfile, text, context)