event.py 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265
  1. # ex:ts=4:sw=4:sts=4:et
  2. # -*- tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*-
  3. """
  4. BitBake 'Event' implementation
  5. Classes and functions for manipulating 'events' in the
  6. BitBake build tools.
  7. """
  8. # Copyright (C) 2003, 2004 Chris Larson
  9. #
  10. # This program is free software; you can redistribute it and/or modify
  11. # it under the terms of the GNU General Public License version 2 as
  12. # published by the Free Software Foundation.
  13. #
  14. # This program is distributed in the hope that it will be useful,
  15. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  16. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  17. # GNU General Public License for more details.
  18. #
  19. # You should have received a copy of the GNU General Public License along
  20. # with this program; if not, write to the Free Software Foundation, Inc.,
  21. # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  22. import os, re
  23. import bb.data
  24. import bb.utils
  25. class Event:
  26. """Base class for events"""
  27. type = "Event"
  28. def __init__(self, d = bb.data.init()):
  29. self._data = d
  30. def getData(self):
  31. return self._data
  32. def setData(self, data):
  33. self._data = data
  34. data = property(getData, setData, None, "data property")
  35. NotHandled = 0
  36. Handled = 1
  37. Registered = 10
  38. AlreadyRegistered = 14
  39. # Internal
  40. _handlers = []
  41. _handlers_dict = {}
  42. def tmpHandler(event):
  43. """Default handler for code events"""
  44. return NotHandled
  45. def defaultTmpHandler():
  46. tmp = "def tmpHandler(e):\n\t\"\"\"heh\"\"\"\n\treturn NotHandled"
  47. comp = bb.utils.better_compile(tmp, "tmpHandler(e)", "bb.event.defaultTmpHandler")
  48. return comp
  49. def fire(event):
  50. """Fire off an Event"""
  51. for h in _handlers:
  52. if type(h).__name__ == "code":
  53. exec(h)
  54. if tmpHandler(event) == Handled:
  55. return Handled
  56. else:
  57. if h(event) == Handled:
  58. return Handled
  59. return NotHandled
  60. def register(name, handler):
  61. """Register an Event handler"""
  62. # already registered
  63. if name in _handlers_dict:
  64. return AlreadyRegistered
  65. if handler is not None:
  66. # handle string containing python code
  67. if type(handler).__name__ == "str":
  68. _registerCode(handler)
  69. else:
  70. _handlers.append(handler)
  71. _handlers_dict[name] = 1
  72. return Registered
  73. def _registerCode(handlerStr):
  74. """Register a 'code' Event.
  75. Deprecated interface; call register instead.
  76. Expects to be passed python code as a string, which will
  77. be passed in turn to compile() and then exec(). Note that
  78. the code will be within a function, so should have had
  79. appropriate tabbing put in place."""
  80. tmp = "def tmpHandler(e):\n%s" % handlerStr
  81. comp = bb.utils.better_compile(tmp, "tmpHandler(e)", "bb.event._registerCode")
  82. # prevent duplicate registration
  83. _handlers.append(comp)
  84. def remove(name, handler):
  85. """Remove an Event handler"""
  86. _handlers_dict.pop(name)
  87. if type(handler).__name__ == "str":
  88. return _removeCode(handler)
  89. else:
  90. _handlers.remove(handler)
  91. def _removeCode(handlerStr):
  92. """Remove a 'code' Event handler
  93. Deprecated interface; call remove instead."""
  94. tmp = "def tmpHandler(e):\n%s" % handlerStr
  95. comp = bb.utils.better_compile(tmp, "tmpHandler(e)", "bb.event._removeCode")
  96. _handlers.remove(comp)
  97. def getName(e):
  98. """Returns the name of a class or class instance"""
  99. if getattr(e, "__name__", None) == None:
  100. return e.__class__.__name__
  101. else:
  102. return e.__name__
  103. class PkgBase(Event):
  104. """Base class for package events"""
  105. def __init__(self, t, d = bb.data.init()):
  106. self._pkg = t
  107. Event.__init__(self, d)
  108. def getPkg(self):
  109. return self._pkg
  110. def setPkg(self, pkg):
  111. self._pkg = pkg
  112. pkg = property(getPkg, setPkg, None, "pkg property")
  113. class BuildBase(Event):
  114. """Base class for bbmake run events"""
  115. def __init__(self, n, p, c, failures = 0):
  116. self._name = n
  117. self._pkgs = p
  118. Event.__init__(self, c)
  119. self._failures = failures
  120. def getPkgs(self):
  121. return self._pkgs
  122. def setPkgs(self, pkgs):
  123. self._pkgs = pkgs
  124. def getName(self):
  125. return self._name
  126. def setName(self, name):
  127. self._name = name
  128. def getCfg(self):
  129. return self.data
  130. def setCfg(self, cfg):
  131. self.data = cfg
  132. def getFailures(self):
  133. """
  134. Return the number of failed packages
  135. """
  136. return self._failures
  137. pkgs = property(getPkgs, setPkgs, None, "pkgs property")
  138. name = property(getName, setName, None, "name property")
  139. cfg = property(getCfg, setCfg, None, "cfg property")
  140. class DepBase(PkgBase):
  141. """Base class for dependency events"""
  142. def __init__(self, t, data, d):
  143. self._dep = d
  144. PkgBase.__init__(self, t, data)
  145. def getDep(self):
  146. return self._dep
  147. def setDep(self, dep):
  148. self._dep = dep
  149. dep = property(getDep, setDep, None, "dep property")
  150. class PkgStarted(PkgBase):
  151. """Package build started"""
  152. class PkgFailed(PkgBase):
  153. """Package build failed"""
  154. class PkgSucceeded(PkgBase):
  155. """Package build completed"""
  156. class BuildStarted(BuildBase):
  157. """bbmake build run started"""
  158. class BuildCompleted(BuildBase):
  159. """bbmake build run completed"""
  160. class UnsatisfiedDep(DepBase):
  161. """Unsatisfied Dependency"""
  162. class RecursiveDep(DepBase):
  163. """Recursive Dependency"""
  164. class NoProvider(Event):
  165. """No Provider for an Event"""
  166. def __init__(self, item, data,runtime=False):
  167. Event.__init__(self, data)
  168. self._item = item
  169. self._runtime = runtime
  170. def getItem(self):
  171. return self._item
  172. def isRuntime(self):
  173. return self._runtime
  174. class MultipleProviders(Event):
  175. """Multiple Providers"""
  176. def __init__(self, item, candidates, data, runtime = False):
  177. Event.__init__(self, data)
  178. self._item = item
  179. self._candidates = candidates
  180. self._is_runtime = runtime
  181. def isRuntime(self):
  182. """
  183. Is this a runtime issue?
  184. """
  185. return self._is_runtime
  186. def getItem(self):
  187. """
  188. The name for the to be build item
  189. """
  190. return self._item
  191. def getCandidates(self):
  192. """
  193. Get the possible Candidates for a PROVIDER.
  194. """
  195. return self._candidates