diff options
author | Holger Hans Peter Freyther <zecke@selfish.org> | 2006-02-26 11:07:47 +0000 |
---|---|---|
committer | Holger Hans Peter Freyther <zecke@selfish.org> | 2006-02-26 11:07:47 +0000 |
commit | 4f807c93f8f72eb73b8600d1f73a3e26014a3167 (patch) | |
tree | 7e1d0b5a52c45081238da4c067e9c462a20a7198 /lib/bb | |
parent | 7dc97df197bde5dde7fffad737f493b0cb94c576 (diff) | |
download | bitbake-4f807c93f8f72eb73b8600d1f73a3e26014a3167.tar.gz |
bitbake/parser,build,utils:
We compile strings into code. In case of erros the traceback
is not useful at all. It doesn't print the function name,
accurate line number etc.
Introduce a better_compile method that excepts the Error
and prints the surrounding lines of code.
We make use of it on the parsing level and execution level
of python methods.
Diffstat (limited to 'lib/bb')
-rw-r--r-- | lib/bb/build.py | 7 | ||||
-rw-r--r-- | lib/bb/parse/parse_py/BBHandler.py | 4 | ||||
-rw-r--r-- | lib/bb/utils.py | 23 |
3 files changed, 29 insertions, 5 deletions
diff --git a/lib/bb/build.py b/lib/bb/build.py index 599b45d9d..5a72be73b 100644 --- a/lib/bb/build.py +++ b/lib/bb/build.py @@ -25,7 +25,7 @@ You should have received a copy of the GNU General Public License along with Based on functions from the base bb module, Copyright 2003 Holger Schurig """ -from bb import debug, data, fetch, fatal, error, note, event, mkdirhier +from bb import debug, data, fetch, fatal, error, note, event, mkdirhier, utils import bb, os # data holds flags and function name for a given task @@ -122,8 +122,9 @@ def exec_func_python(func, d): """Execute a python BB 'function'""" import re, os - tmp = "def " + func + "():\n%s" % data.getVar(func, d) - comp = compile(tmp + '\n' + func + '()', bb.data.getVar('FILE', d, 1) + ':' + func, "exec") + tmp = "def " + func + "():\n%s" % data.getVar(func, d) + tmp += '\n' + func + '()' + comp = utils.better_compile(tmp, func, bb.data.getVar('FILE', d, 1) ) prevdir = os.getcwd() g = {} # globals g['bb'] = bb diff --git a/lib/bb/parse/parse_py/BBHandler.py b/lib/bb/parse/parse_py/BBHandler.py index fac3e85b3..d083bb312 100644 --- a/lib/bb/parse/parse_py/BBHandler.py +++ b/lib/bb/parse/parse_py/BBHandler.py @@ -22,7 +22,7 @@ Place, Suite 330, Boston, MA 02111-1307 USA.""" import re, bb, os, sys -import bb.fetch, bb.build +import bb.fetch, bb.build, bb.utils from bb import debug, data, fetch, fatal from ConfHandler import include, localpath, obtain, init @@ -206,7 +206,7 @@ def feeder(lineno, s, fn, d): return else: text = '\n'.join(__body__) - comp = compile(text, "<bb>", "exec") + comp = bb.utils.better_compile(text, "<bb>", fn ) exec comp in __builtins__ __body__ = [] __inpython__ = False diff --git a/lib/bb/utils.py b/lib/bb/utils.py index 2f53c65ec..31dc4e372 100644 --- a/lib/bb/utils.py +++ b/lib/bb/utils.py @@ -93,3 +93,26 @@ def explode_deps(s): # Ignore version #r[-1] += ' ' + ' '.join(j) return r + + +def better_compile(text, file, realfile): + try: + return compile(text, file, "exec") + except Exception, e: + import bb,sys + + # split the text into lines again + body = text.split('\n') + bb.error("Error in compiling: ", realfile) + bb.error("The lines resulting into thiis error were:") + bb.error("\t%d:%s:'%s'" % (e.lineno, e.__class__.__name__, body[e.lineno-1])) + # print the environment of the method + bb.error("Printing the environment of the function") + min_line = max(1,e.lineno-4) + max_line = min(e.lineno+4,len(body)) + for i in range(min_line,max_line+1): + bb.error("\t%.4d:%s" % (i, body[i-1]) ) + + # exit now + sys.exit(1) + |