Gaudi Framework, version v24r2

Home   Generated: Wed Dec 4 2013
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
Public Member Functions | Public Attributes | Private Member Functions | List of all members
cmt2cmake.Package Class Reference
Inheritance diagram for cmt2cmake.Package:
Inheritance graph
[legend]
Collaboration diagram for cmt2cmake.Package:
Collaboration graph
[legend]

Public Member Functions

def __init__
 
def generate
 
def data_packages
 
def process
 

Public Attributes

 path
 
 name
 
 requirements
 
 project
 
 uses
 
 version
 
 libraries
 
 applications
 
 documents
 
 macros
 
 sets
 
 paths
 
 aliases
 
 singleton_patterns
 
 install_more_includes
 
 install_python_modules
 
 install_scripts
 
 QMTest
 
 god_headers
 
 god_dictionary
 
 PyQtResource
 
 PyQtUIC
 
 multi_patterns
 
 reflex_dictionary
 
 component_library
 
 linker_library
 
 copy_relax_rootmap
 
 reflex_dictionaries
 
 component_libraries
 
 linker_libraries
 
 log
 
 CMTParser
 

Private Member Functions

def _parseRequirements
 

Detailed Description

Definition at line 182 of file cmt2cmake.py.

Constructor & Destructor Documentation

def cmt2cmake.Package.__init__ (   self,
  path,
  project = None 
)

Definition at line 183 of file cmt2cmake.py.

184  def __init__(self, path, project=None):
185  self.path = os.path.realpath(path)
186  if not isPackage(self.path):
187  raise ValueError("%s is not a package" % self.path)
189  self.name = os.path.basename(self.path)
190  self.requirements = os.path.join(self.path, "cmt", "requirements")
191  self.project = project
192 
193  # prepare attributes filled during parsing of requirements
194  self.uses = {}
195  self.version = None
196  self.libraries = []
197  self.applications = []
198  self.documents = []
199  self.macros = {}
200  self.sets = {}
201  self.paths = {}
202  self.aliases = {}
203 
204  # These are patterns that can appear only once per package.
205  # The corresponding dictionary will contain the arguments passed to the
206  # pattern.
207  self.singleton_patterns = set(["QMTest", "install_python_modules", "install_scripts",
208  "install_more_includes", "god_headers", "god_dictionary",
209  "PyQtResource", "PyQtUIC"])
211  self.install_python_modules = self.install_scripts = self.QMTest = False
212  self.god_headers = {}
213  self.god_dictionary = {}
214  self.PyQtResource = {}
215  self.PyQtUIC = {}
216 
217  # These are patterns that can be repeated in the requirements.
218  # The corresponding data members will contain the list of dictionaries
219  # corresponding to the various calls.
220  self.multi_patterns = set(['reflex_dictionary', 'component_library', 'linker_library',
221  'copy_relax_rootmap'])
224  self.linker_library = []
225  self.copy_relax_rootmap = []
228  self.component_libraries = set()
229  self.linker_libraries = set()
231  self.log = logging.getLogger('Package(%s)' % self.name)
233  try:
234  self._parseRequirements()
235  except:
236  print "Processing %s" % self.requirements
237  raise
238  # update the known subdirs
239  cache[self.name] = {# list of linker libraries provided by the package
240  'libraries': list(self.linker_libraries),
241  # true if it's a headers-only package
242  'includes': bool(self.install_more_includes and
243  not self.linker_libraries)}

Member Function Documentation

def cmt2cmake.Package._parseRequirements (   self)
private

Definition at line 583 of file cmt2cmake.py.

584  def _parseRequirements(self):
585  def requirements():
586  statement = ""
587  for l in open(self.requirements):
588  if '#' in l:
589  l = l[:l.find('#')]
590  l = l.strip()
591  # if we have something in the line, extend the statement
592  if l:
593  statement += l
594  if statement.endswith('\\'):
595  # if the statement requires another line, get the next
596  statement = statement[:-1] + ' '
597  continue
598  # either we got something more in the statement or not, but
599  # an empty line after a '\' means ending the statement
600  if statement:
601  try:
602  yield list(self.CMTParser.parseString(statement))
603  except:
604  # ignore not know statements
605  self.log.debug("Failed to parse statement: %r", statement)
606  statement = ""
607 
608  for args in requirements():
609  cmd = args.pop(0)
610  if cmd == 'version':
611  self.version = args[0]
612  elif cmd == "use":
613  if "-no_auto_imports" in args:
614  imp = False
615  args.remove("-no_auto_imports")
616  else:
617  imp = True
618  if len(args) > 1: # only one argument means usually a conditional use
619  if len(args) > 2:
620  name = "%s/%s" % (args[2], args[0])
621  else:
622  name = args[0]
623  self.uses[name] = (args[1], imp)
624 
625  elif cmd == "apply_pattern":
626  pattern = args.pop(0)
627  args = dict([x.split('=', 1) for x in args])
628  if pattern in self.singleton_patterns:
629  setattr(self, pattern, args or True)
630  elif pattern in self.multi_patterns:
631  getattr(self, pattern).append(args)
632 
633  elif cmd == 'library':
634  name = args.pop(0)
635  # digest arguments (options, variables, sources)
636  imports = []
637  group = None
638  sources = []
639  for a in args:
640  if a.startswith('-'): # options
641  if a.startswith('-import='):
642  imports.append(a[8:])
643  elif a.startswith('-group='):
644  group = a[7:]
645  elif '=' in a: # variable
646  pass
647  else: # source
648  sources.append(a)
649  self.libraries.append((name, sources, group, imports))
650 
651  elif cmd == 'application':
652  name = args.pop(0)
653  # digest arguments (options, variables, sources)
654  imports = []
655  group = None
656  sources = []
657  for a in args:
658  if a.startswith('-'): # options
659  if a.startswith('-import='):
660  imports.append(a[8:])
661  elif a.startswith('-group='):
662  group = a[7:]
663  elif a == '-check': # used for test applications
664  group = 'tests'
665  elif '=' in a: # variable
666  pass
667  else: # source
668  sources.append(a)
669  if 'test' in name.lower() or [s for s in sources if 'test' in s.lower()]:
670  # usually, developers do not put tests in the right group
671  group = 'tests'
672  self.applications.append((name, sources, group, imports))
673 
674  elif cmd == 'document':
675  name = args.pop(0)
676  constituent = args.pop(0)
677  sources = args
678  self.documents.append((name, constituent, sources))
679 
680  elif cmd == 'macro':
681  # FIXME: should handle macro tags
682  name = args.pop(0)
683  value = args[0].strip('"').strip("'")
684  self.macros[name] = value
685 
686  elif cmd == 'macro_append':
687  # FIXME: should handle macro tags
688  name = args.pop(0)
689  value = args[0].strip('"').strip("'")
690  self.macros[name] = self.macros.get(name, "") + value
691 
692  elif cmd == 'set':
693  name = args.pop(0)
694  if name not in ignore_env:
695  value = args[0].strip('"').strip("'")
696  self.sets[name] = value
697 
698  elif cmd == 'alias':
699  # FIXME: should handle macro tags
700  name = args.pop(0)
701  value = args[0].strip('"').strip("'").split()
702  self.aliases[name] = value
703 
704  # classification of libraries in the package
705  unquote = lambda x: x.strip('"').strip("'")
706  self.component_libraries = set([unquote(l['library']) for l in self.component_library])
707  self.linker_libraries = set([unquote(l['library']) for l in self.linker_library])
708  self.reflex_dictionaries = dict([(unquote(l['dictionary']), l.get('options', ''))
709  for l in self.reflex_dictionary])
def cmt2cmake.Package.data_packages (   self)
Return the list of data packages used by this package in the form of a
dictionary {name: version_pattern}.

Definition at line 564 of file cmt2cmake.py.

565  def data_packages(self):
566  '''
567  Return the list of data packages used by this package in the form of a
568  dictionary {name: version_pattern}.
569  '''
570  return dict([ (n, self.uses[n][0]) for n in self.uses if n in data_packages ])
def cmt2cmake.Package.generate (   self)

Definition at line 244 of file cmt2cmake.py.

245  def generate(self):
246  # header
247  data = ["#" * 80,
248  "# Package: %s" % self.name,
249  "#" * 80,
250  "gaudi_subdir(%s %s)" % (self.name, self.version),
251  ""]
252  # dependencies
253  # subdirectories (excluding specials)
254  subdirs = [n for n in sorted(self.uses)
255  if not n.startswith("LCG_Interfaces/")
256  and n not in ignored_packages
257  and n not in data_packages]
258 
259  inc_dirs = []
260  if subdirs:
261  # check if we are missing info for a subdir
262  missing_subdirs = set([s.rsplit('/')[-1] for s in subdirs]) - set(cache)
263  if missing_subdirs:
264  self.log.warning('Missing info cache for subdirs %s', ' '.join(sorted(missing_subdirs)))
265  # declare inclusion order
266  data.append(callStringWithIndent('gaudi_depends_on_subdirs', subdirs))
267  data.append('')
268  # consider header-only subdirs
269  # for each required subdir that comes with only headers, add its
270  # location to the call to 'include_directories'
271  inc_only = lambda s: cache.get(s.rsplit('/')[-1], {}).get('includes')
272  inc_dirs = filter(inc_only, subdirs)
273 
274 
275  # externals (excluding specials)
276  # - Python needs to be treated in a special way
277  find_packages = {}
278  for n in sorted(self.uses):
279  if n.startswith("LCG_Interfaces/"):
280  n = extName(n[15:])
281  # FIXME: find a general way to treat these special cases
282  if n == "PythonLibs":
283  if self.name not in needing_python: # only these packages actually link against Python
284  continue
285  # get custom link options
286  linkopts = self.macros.get(n + '_linkopts', '')
287  components = [m.group(1) or m.group(2)
288  for m in re.finditer(r'(?:\$\(%s_linkopts_([^)]*)\))|(?:-l(\w*))' % n,
289  linkopts)]
290  # FIXME: find a general way to treat the special cases
291  if n == 'COOL':
292  components = ['CoolKernel', 'CoolApplication']
293  elif n == 'CORAL':
294  components = ['CoralBase', 'CoralKernel', 'RelationalAccess']
295  elif n == 'RELAX' and self.copy_relax_rootmap:
296  components = [d['dict'] for d in self.copy_relax_rootmap if 'dict' in d]
297 
298  find_packages[n] = find_packages.get(n, []) + components
299 
300  # this second loops avoid double entries do to converging results of extName()
301  for n in sorted(find_packages):
302  args = [n]
303  components = find_packages[n]
304  if components:
305  if n == 'RELAX': # FIXME: probably we should set 'REQUIRED' for all the externals
306  args.append('REQUIRED')
307  args.append('COMPONENTS')
308  args.extend(components)
309  data.append('find_package(%s)' % ' '.join(args))
310  if find_packages:
311  data.append("")
312 
313  if self.name in no_pedantic:
314  data.append('string(REPLACE "-pedantic" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")\n')
315 
316  # the headers can be installed via "PUBLIC_HEADERS" or by hand
317  if self.install_more_includes:
318  headers = [d for d in self.install_more_includes.values()
319  if os.path.isdir(os.path.join(self.path, d))]
320  else:
321  headers = []
322 
323  if self.god_headers or self.god_dictionary:
324  data.append("include(GaudiObjDesc)")
325  data.append("")
326 
327  god_headers_dest = None
328  if self.god_headers:
329  godargs = [self.god_headers["files"].replace("../", "")]
330 
331  godflags = self.macros.get('%sObj2Doth_GODflags' % self.name, "")
332  godflags = re.search(r'-s\s*(\S+)', godflags)
333  if godflags:
334  god_headers_dest = os.path.normpath('Event/' + godflags.group(1))
335  if god_headers_dest == 'src':
336  # special case
337  godargs.append('PRIVATE')
338  else:
339  godargs.append('DESTINATION ' + god_headers_dest)
340 
341  data.append(callStringWithIndent('god_build_headers', godargs))
342  data.append("")
343 
344  god_dict = []
345  if self.god_dictionary:
346  god_dict = [('--GOD--',
347  [self.god_dictionary["files"].replace("../", "")],
348  None, [])]
349 
350  rflx_dict = []
351  for d in self.reflex_dictionary:
352  for k in d:
353  v = d[k]
354  v = v.replace("$(%sROOT)/" % self.name.upper(), "")
355  v = v.replace("../", "")
356  d[k] = v
357  imports = [i.strip('"').replace('-import=', '') for i in d.get('imports', '').strip().split()]
358  rflx_dict.append((d['dictionary'] + 'Dict',
359  [d['headerfiles'], d['selectionfile']],
360  None,
361  imports))
362 
363  # libraries
364  global_imports = [extName(name[15:])
365  for name in self.uses
366  if name.startswith('LCG_Interfaces/') and self.uses[name][1]] # list of imported ext
367  if 'PythonLibs' in global_imports and self.name not in needing_python:
368  global_imports.remove('PythonLibs')
369 
370  subdir_imports = [s.rsplit('/')[-1] for s in subdirs if self.uses[s][1]]
371  local_links = [] # keep track of linker libraries found so far
372  applications_names = set([a[0] for a in self.applications])
373  # Note: a god_dictionary, a reflex_dictionary or an application is like a module
374  for name, sources, group, imports in self.libraries + god_dict + rflx_dict + self.applications:
375  isGODDict = isRflxDict = isComp = isApp = isLinker = False
376  if name == '--GOD--':
377  isGODDict = True
378  name = '' # no library name for GOD dictionaries
379  elif name.endswith('Dict') and name[:-4] in self.reflex_dictionaries:
380  isRflxDict = True
381  name = name[:-4]
382  elif name in self.component_libraries:
383  isComp = True
384  elif name in applications_names:
385  isApp = True
386  else:
387  if name not in self.linker_libraries:
388  self.log.warning('library %s not declared as component or linker, assume linker', name)
389  isLinker = True
390 
391  # prepare the bits of the command: cmd, name, sources, args
392  if isComp:
393  cmd = 'gaudi_add_module'
394  elif isGODDict:
395  cmd = 'god_build_dictionary'
396  elif isRflxDict:
397  cmd = 'gaudi_add_dictionary'
398  elif isApp:
399  cmd = 'gaudi_add_executable'
400  else: # i.e. isLinker (a fallback)
401  cmd = 'gaudi_add_library'
402 
403  if not sources:
404  self.log.warning("Missing sources for target %s", name)
405 
406  args = []
407  if isLinker:
408  if headers:
409  args.append('PUBLIC_HEADERS ' + ' '.join(headers))
410  else:
411  args.append('NO_PUBLIC_HEADERS')
412  elif isGODDict:
413  if god_headers_dest:
414  args.append('HEADERS_DESTINATION ' + god_headers_dest)
415  # check if we have a customdict in the documents
416  for docname, _, docsources in self.documents:
417  if docname == 'customdict':
418  args.append('EXTEND ' + docsources[0].replace('../', ''))
419  break
420 
421 
422  # # collection of link libraries. #
423  # Externals and subdirs are treated differently:
424  # - externals: just use the package name
425  # - subdirs: find the exported libraries in the global var cache
426  # We also have to add the local linker libraries.
427 
428  # separate external and subdir explicit imports
429  subdirsnames = [s.rsplit('/')[-1] for s in subdirs]
430  subdir_local_imports = [i for i in imports if i in subdirsnames]
431  ext_local_imports = [extName(i) for i in imports if i not in subdir_local_imports]
432 
433  # prepare the link list with the externals
434  links = global_imports + ext_local_imports
435  if links or inc_dirs:
436  # external links need the include dirs
437  args.append('INCLUDE_DIRS ' + ' '.join(links + inc_dirs))
438 
439  if links:
440  not_included = set(links).difference(find_packages, set([s.rsplit('/')[-1] for s in subdirs]))
441  if not_included:
442  self.log.warning('imports without use: %s', ', '.join(sorted(not_included)))
443 
444  # add subdirs...
445  for s in subdir_imports + subdir_local_imports:
446  if s in cache:
447  links.extend(cache[s]['libraries'])
448  # ... and local libraries
449  links.extend(local_links)
450  if 'AIDA' in links:
451  links.remove('AIDA') # FIXME: AIDA does not have a library
452 
453  if links:
454  # note: in some cases we get quoted library names
455  args.append('LINK_LIBRARIES ' + ' '.join([l.strip('"') for l in links]))
456 
457  if isRflxDict and self.reflex_dictionaries[name]:
458  args.append('OPTIONS ' + self.reflex_dictionaries[name])
459 
460  if isLinker:
461  local_links.append(name)
462 
463  # FIXME: very very special case :(
464  if name == 'garbage' and self.name == 'FileStager':
465  data.append('# only for the applications\nfind_package(Boost COMPONENTS program_options)\n')
466 
467  # write command
468  if not (isGODDict or isRflxDict):
469  # dictionaries to not need to have the paths fixed
470  sources = [os.path.normpath('src/' + s) for s in sources]
471  # FIXME: special case
472  sources = [s.replace('src/$(GAUDICONFROOT)', '${CMAKE_SOURCE_DIR}/GaudiConf') for s in sources]
473  libdata = callStringWithIndent(cmd, [name] + sources + args)
474 
475  # FIXME: wrap the test libraries in one if block (instead of several)
476  if group in ('tests', 'test'):
477  # increase indentation
478  libdata = [' ' + l for l in libdata.splitlines()]
479  # and wrap
480  libdata.insert(0, 'if(GAUDI_BUILD_TESTS)')
481  libdata.append('endif()')
482  libdata = '\n'.join(libdata)
483  data.append(libdata)
484  data.append('') # empty line
485 
486  # PyQt resources and UIs
487  if self.PyQtResource or self.PyQtUIC:
488  data.append("# gen_pyqt_* functions are provided by 'pygraphics'")
489  if self.PyQtResource:
490  qrc_files = self.PyQtResource["qrc_files"].replace("../", "")
491  qrc_dest = self.PyQtResource["outputdir"].replace("../python/", "")
492  qrc_target = qrc_dest.replace('/', '.') + '.Resources'
493  data.append('gen_pyqt_resource(%s %s %s)' % (qrc_target, qrc_dest, qrc_files))
494  if self.PyQtUIC:
495  ui_files = self.PyQtUIC["ui_files"].replace("../", "")
496  ui_dest = self.PyQtUIC["outputdir"].replace("../python/", "")
497  ui_target = qrc_dest.replace('/', '.') + '.UI'
498  data.append('gen_pyqt_uic(%s %s %s)' % (ui_target, ui_dest, ui_files))
499  if self.PyQtResource or self.PyQtUIC:
500  data.append('') # empty line
501 
502  if self.copy_relax_rootmap:
503  data.extend(['# Merge the RELAX rootmaps',
504  'set(rootmapfile ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/relax.rootmap)',
505  callStringWithIndent('add_custom_command',
506  ['OUTPUT ${rootmapfile}',
507  'COMMAND ${merge_cmd} ${RELAX_ROOTMAPS} ${rootmapfile}',
508  'DEPENDS ${RELAX_ROOTMAPS}']),
509  'add_custom_target(RelaxRootmap ALL DEPENDS ${rootmapfile})',
510  '\n# Install the merged file',
511  'install(FILES ${rootmapfile} DESTINATION lib)\n'])
512 
513  # installation
514  installs = []
515  if headers and not self.linker_libraries: # not installed yet
516  installs.append("gaudi_install_headers(%s)" % (" ".join(headers)))
517  if self.install_python_modules:
518  # if we install Python modules, we need to check if we have special
519  # names for the ConfUser modules
520  if (self.name + 'ConfUserModules') in self.macros:
521  installs.append('set_property(DIRECTORY PROPERTY CONFIGURABLE_USER_MODULES %s)'
522  % self.macros[self.name + 'ConfUserModules'])
523  installs.append("gaudi_install_python_modules()")
524  if self.install_scripts:
525  installs.append("gaudi_install_scripts()")
526  if installs:
527  data.extend(installs)
528  data.append('') # empty line
529 
530  if self.aliases:
531  data.extend(['gaudi_alias({0}\n {1})'.format(name, ' '.join(alias))
532  for name, alias in self.aliases.iteritems()])
533  data.append('') # empty line
534 
535  # environment
536  def fixSetValue(s):
537  '''
538  Convert environment variable values from CMT to CMake.
539  '''
540  # escape '$' if not done already
541  s = re.sub(r'(?<!\\)\$', '\\$', s)
542  # replace parenthesis with curly braces
543  s = re.sub(r'\$\(([^()]*)\)', r'${\1}', s)
544  # replace variables like Package_root with PACKAGEROOT
545  v = re.compile(r'\$\{(\w*)_root\}')
546  m = v.search(s)
547  while m:
548  s = s[:m.start()] + ('${%sROOT}' % m.group(1).upper()) + s[m.end():]
549  m = v.search(s)
550  return s
551 
552  if self.sets:
553  data.append(callStringWithIndent('gaudi_env',
554  ['SET %s %s' % (v, fixSetValue(self.sets[v]))
555  for v in sorted(self.sets)]))
556  data.append('') # empty line
557 
558  # tests
559  if self.QMTest:
560  data.append("\ngaudi_add_test(QMTest QMTEST)")
561 
562  return "\n".join(data) + "\n"
def cmt2cmake.Package.process (   self,
  overwrite = None 
)

Definition at line 571 of file cmt2cmake.py.

572  def process(self, overwrite=None):
573  cml = os.path.join(self.path, "CMakeLists.txt")
574  if ((overwrite == 'force')
575  or (not os.path.exists(cml))
576  or ((overwrite == 'update')
577  and (os.path.getmtime(cml) < os.path.getmtime(self.requirements)))):
578  # write the file
579  data = self.generate()
580  writeToFile(cml, data, self.log)
581  else:
582  self.log.warning("file %s already exists", cml)

Member Data Documentation

cmt2cmake.Package.aliases

Definition at line 201 of file cmt2cmake.py.

cmt2cmake.Package.applications

Definition at line 196 of file cmt2cmake.py.

cmt2cmake.Package.CMTParser

Definition at line 231 of file cmt2cmake.py.

cmt2cmake.Package.component_libraries

Definition at line 227 of file cmt2cmake.py.

cmt2cmake.Package.component_library

Definition at line 222 of file cmt2cmake.py.

cmt2cmake.Package.copy_relax_rootmap

Definition at line 224 of file cmt2cmake.py.

cmt2cmake.Package.documents

Definition at line 197 of file cmt2cmake.py.

cmt2cmake.Package.god_dictionary

Definition at line 212 of file cmt2cmake.py.

cmt2cmake.Package.god_headers

Definition at line 211 of file cmt2cmake.py.

cmt2cmake.Package.install_more_includes

Definition at line 209 of file cmt2cmake.py.

cmt2cmake.Package.install_python_modules

Definition at line 210 of file cmt2cmake.py.

cmt2cmake.Package.install_scripts

Definition at line 210 of file cmt2cmake.py.

cmt2cmake.Package.libraries

Definition at line 195 of file cmt2cmake.py.

cmt2cmake.Package.linker_libraries

Definition at line 228 of file cmt2cmake.py.

cmt2cmake.Package.linker_library

Definition at line 223 of file cmt2cmake.py.

cmt2cmake.Package.log

Definition at line 230 of file cmt2cmake.py.

cmt2cmake.Package.macros

Definition at line 198 of file cmt2cmake.py.

cmt2cmake.Package.multi_patterns

Definition at line 219 of file cmt2cmake.py.

cmt2cmake.Package.name

Definition at line 188 of file cmt2cmake.py.

cmt2cmake.Package.path

Definition at line 184 of file cmt2cmake.py.

cmt2cmake.Package.paths

Definition at line 200 of file cmt2cmake.py.

cmt2cmake.Package.project

Definition at line 190 of file cmt2cmake.py.

cmt2cmake.Package.PyQtResource

Definition at line 213 of file cmt2cmake.py.

cmt2cmake.Package.PyQtUIC

Definition at line 214 of file cmt2cmake.py.

cmt2cmake.Package.QMTest

Definition at line 210 of file cmt2cmake.py.

cmt2cmake.Package.reflex_dictionaries

Definition at line 226 of file cmt2cmake.py.

cmt2cmake.Package.reflex_dictionary

Definition at line 221 of file cmt2cmake.py.

cmt2cmake.Package.requirements

Definition at line 189 of file cmt2cmake.py.

cmt2cmake.Package.sets

Definition at line 199 of file cmt2cmake.py.

cmt2cmake.Package.singleton_patterns

Definition at line 206 of file cmt2cmake.py.

cmt2cmake.Package.uses

Definition at line 193 of file cmt2cmake.py.

cmt2cmake.Package.version

Definition at line 194 of file cmt2cmake.py.


The documentation for this class was generated from the following file:
Generated at Wed Dec 4 2013 14:33:20 for Gaudi Framework, version v24r2 by Doxygen version 1.8.2 written by Dimitri van Heesch, © 1997-2004