diff options
| -rw-r--r-- | bitbake/lib/bb/build.py | 15 | ||||
| -rw-r--r-- | bitbake/lib/bb/utils.py | 4 |
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 | ||
| 159 | def 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 | # | ||
| 164 | def 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 | """ |
| 234 | logformatter = bb.msg.BBLogFormatter("%(levelname)s: %(message)s") | 239 | logformatter = bb.msg.BBLogFormatter("%(levelname)s: %(message)s") |
| 235 | def exec_func_python(func, d, runfile, cwd=None): | 240 | def 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 | ||
| 375 | def better_exec(code, context, text = None, realfile = "<code>"): | 375 | def 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) |
