use an empty OEMASK if none is set
[bitbake.git] / bin / oe / event.py
1 #!/usr/bin/env python
2 # ex:ts=4:sw=4:sts=4:et
3 # -*- tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*-
4 """
5 OpenEmbedded 'Event' implementation
6
7 Classes and functions for manipulating 'events' in the
8 OpenEmbedded (http://openembedded.org) build infrastructure.
9
10 Copyright: (c) 2003-2004 Chris Larson
11 """
12
13 import os, re
14 class Event:
15     """Base class for events"""
16     type = "Event"
17
18 NotHandled = 0
19 Handled = 1
20 handlers = []
21
22 def tmpHandler(event):
23     """Default handler for code events"""
24     return NotHandled
25
26 def defaultTmpHandler():
27     tmp = "def tmpHandler(e):\n\t\"\"\"heh\"\"\"\n\treturn 0"
28     comp = compile(tmp, "tmpHandler(e)", "exec")
29     return comp
30
31 def fire(event):
32     """Fire off an Event"""
33     for h in handlers:
34         if type(h).__name__ == "code":
35             exec(h)
36             if tmpHandler(event) == Handled:
37                 return Handled
38         else:
39             if h(event) == Handled:
40                 return Handled
41     return NotHandled
42
43 def register(handler):
44     """Register an Event handler"""
45     if handler is not None:
46 #       handle string containing python code
47         if type(handler).__name__ == "str":
48             return registerCode(handler)
49 #       prevent duplicate registration
50         if not handler in handlers:
51             handlers.append(handler)
52
53 def registerCode(handlerStr):
54     """Register a 'code' Event.
55        Deprecated interface; call register instead.
56
57        Expects to be passed python code as a string, which will
58        be passed in turn to compile() and then exec().  Note that
59        the code will be within a function, so should have had
60        appropriate tabbing put in place."""
61     tmp = "def tmpHandler(e):\n%s" % handlerStr
62     comp = compile(tmp, "tmpHandler(e)", "exec")
63 #   prevent duplicate registration
64     if not comp in handlers:
65         handlers.append(comp)
66
67 def remove(handler):
68     """Remove an Event handler"""
69     for h in handlers:
70         if type(handler).__name__ == "str":
71             return removeCode(handler)
72
73         if handler is h:
74             handlers.remove(handler)
75
76 def removeCode(handlerStr):
77     """Remove a 'code' Event handler
78        Deprecated interface; call remove instead."""
79     tmp = "def tmpHandler(e):\n%s" % handlerStr
80     comp = compile(tmp, "tmpHandler(e)", "exec")
81     handlers.remove(comp)
82
83 def getName(e):
84     """Returns the name of a class or class instance"""
85     if getattr(e, "__name__", None) == None:
86         return e.__class__.__name__
87     else:
88         return e.__name__
89
90
91 class PkgBase(Event):
92     """Base class for package events"""
93
94     def __init__(self, t, d = {}):
95         self.pkg = t
96         self.data = d
97
98     def getPkg(self):
99         return self._pkg
100
101     def setPkg(self, pkg):
102         self._pkg = pkg
103
104     def getData(self):
105         return self._data
106
107     def setData(self, data):
108         self._data = data
109
110     pkg = property(getPkg, setPkg, None, "pkg property")
111     data = property(getData, setData, None, "data property")
112
113
114 class BuildBase(Event):
115     """Base class for oemake run events"""
116
117     def __init__(self, n, p, c):
118         self.name = n
119         self.pkgs = p
120         self.cfg = c
121
122     def getPkgs(self):
123         return self._pkgs
124
125     def setPkgs(self, pkgs):
126         self._pkgs = pkgs
127
128     def getName(self):
129         return self._name
130
131     def setName(self, name):
132         self._name = name
133
134     def getCfg(self):
135         return self._cfg
136
137     def setCfg(self, cfg):
138         self._cfg = cfg
139
140     pkgs = property(getPkgs, setPkgs, None, "pkgs property")
141     name = property(getName, setName, None, "name property")
142     cfg = property(getCfg, setCfg, None, "cfg property")
143
144
145 class DepBase(PkgBase):
146     """Base class for dependency events"""
147
148     def __init__(self, t, data, d):
149         self.dep = d
150         PkgBase.__init__(self, t, data)
151
152     def getDep(self):
153         return self._dep
154
155     def setDep(self, dep):
156         self._dep = dep
157
158     dep = property(getDep, setDep, None, "dep property")
159
160
161 class PkgStarted(PkgBase):
162     """Package build started"""
163
164
165 class PkgFailed(PkgBase):
166     """Package build failed"""
167
168
169 class PkgSucceeded(PkgBase):
170     """Package build completed"""
171
172
173 class BuildStarted(BuildBase):
174     """oemake build run started"""
175
176
177 class BuildCompleted(BuildBase):
178     """oemake build run completed"""
179
180
181 class UnsatisfiedDep(DepBase):
182     """Unsatisfied Dependency"""
183
184
185 class RecursiveDep(DepBase):
186     """Recursive Dependency"""
187
188
189 class MultipleProviders(PkgBase):
190     """Multiple Providers"""
191