Add persitent data store from trunk, sync the fetcher changes to use the persistent...
[bitbake.git] / lib / bb / methodpool.py
1 # ex:ts=4:sw=4:sts=4:et
2 # -*- tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*-
3 #
4 #
5 # Copyright (C)       2006 Holger Hans Peter Freyther
6 #
7 # This program is free software; you can redistribute it and/or modify
8 # it under the terms of the GNU General Public License version 2 as
9 # published by the Free Software Foundation.
10 #
11 # This program is distributed in the hope that it will be useful,
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 # GNU General Public License for more details.
15 #
16 # You should have received a copy of the GNU General Public License along
17 # with this program; if not, write to the Free Software Foundation, Inc.,
18 # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
19
20
21 """
22     What is a method pool?
23
24     BitBake has a global method scope where .bb, .inc and .bbclass
25     files can install methods. These methods are parsed from strings.
26     To avoid recompiling and executing these string we introduce
27     a method pool to do this task.
28
29     This pool will be used to compile and execute the functions. It
30     will be smart enough to 
31 """
32
33 from bb.utils import better_compile, better_exec
34 from bb       import error
35
36 # A dict of modules we have handled
37 # it is the number of .bbclasses + x in size
38 _parsed_methods = { }
39 _parsed_fns     = { }
40
41 def insert_method(modulename, code, fn):
42     """
43     Add code of a module should be added. The methods
44     will be simply added, no checking will be done
45     """
46     comp = better_compile(code, "<bb>", fn )
47     better_exec(comp, __builtins__, code, fn)
48
49     # now some instrumentation
50     code = comp.co_names
51     for name in code:
52         if name in ['None', 'False']:
53             continue
54         elif name in _parsed_fns and not _parsed_fns[name] == modulename:
55             error( "Error Method already seen: %s in' %s' now in '%s'" % (name, _parsed_fns[name], modulename))
56         else:
57             _parsed_fns[name] = modulename
58
59 def check_insert_method(modulename, code, fn):
60     """
61     Add the code if it wasnt added before. The module
62     name will be used for that 
63
64     Variables:
65         @modulename a short name e.g. base.bbclass
66         @code The actual python code
67         @fn   The filename from the outer file
68     """
69     if not modulename in _parsed_methods:
70         return insert_method(modulename, code, fn)
71     _parsed_methods[modulename] = 1
72
73 def parsed_module(modulename):
74     """
75     Inform me file xyz was parsed
76     """
77     return modulename in _parsed_methods
78
79
80 def get_parsed_dict():
81     """
82     shortcut
83     """
84     return _parsed_methods