self.quit = quit
self.init = init
multiprocessing.Process.__init__(self)
+ self.context = bb.utils._context.copy()
def run(self):
if self.init:
def parse(self, filename, appends, caches_array):
try:
+ bb.utils._context = self.context.copy()
return True, bb.cache.Cache.parse(filename, appends, self.cfg, caches_array)
except Exception as exc:
tb = sys.exc_info()[2]
# with this program; if not, write to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
-"""
- What is a method pool?
-
- BitBake has a global method scope where .bb, .inc and .bbclass
- files can install methods. These methods are parsed from strings.
- To avoid recompiling and executing these string we introduce
- a method pool to do this task.
-
- This pool will be used to compile and execute the functions. It
- will be smart enough to
-"""
-
from bb.utils import better_compile, better_exec
-from bb import error
-
-# A dict of function names we have seen
-_parsed_fns = { }
def insert_method(modulename, code, fn):
"""
comp = better_compile(code, modulename, fn )
better_exec(comp, None, code, fn)
- # now some instrumentation
- code = comp.co_names
- for name in code:
- if name in ['None', 'False']:
- continue
- elif name in _parsed_fns and not _parsed_fns[name] == modulename:
- bb.fatal("The function %s defined in %s was already declared in %s. BitBake has a global python function namespace so shared functions should be declared in a common include file rather than being duplicated, or if the functions are different, please use different function names." % (name, modulename, _parsed_fns[name]))
- else:
- _parsed_fns[name] = modulename
-
-# A dict of modules the parser has finished with
-_parsed_methods = {}
-
-def parsed_module(modulename):
- """
- Has module been parsed?
- """
- return modulename in _parsed_methods
-
-def set_parsed_module(modulename):
- """
- Set module as parsed
- """
- _parsed_methods[modulename] = True
-
text = '\n'.join(self.body)
if self.func_name == "__anonymous":
funcname = ("__anon_%s_%s" % (self.lineno, self.filename.translate(string.maketrans('/.+-', '____'))))
- if not funcname in bb.methodpool._parsed_fns:
- text = "def %s(d):\n" % (funcname) + text
- bb.methodpool.insert_method(funcname, text, self.filename)
+ text = "def %s(d):\n" % (funcname) + text
+ bb.methodpool.insert_method(funcname, text, self.filename)
anonfuncs = data.getVar('__BBANONFUNCS') or []
anonfuncs.append(funcname)
data.setVar('__BBANONFUNCS', anonfuncs)
# 'this' file. This means we will not parse methods from
# bb classes twice
text = '\n'.join(self.body)
- if not bb.methodpool.parsed_module(self.modulename):
- bb.methodpool.insert_method(self.modulename, text, self.filename)
+ bb.methodpool.insert_method(self.modulename, text, self.filename)
data.setVarFlag(self.function, "func", 1)
data.setVarFlag(self.function, "python", 1)
data.setVar(self.function, text)
if oldfile:
d.setVar("FILE", oldfile)
- # we have parsed the bb class now
- if ext == ".bbclass" or ext == ".inc":
- bb.methodpool.set_parsed_module(base_name)
-
return d
def feeder(lineno, s, fn, root, statements):