Gaudi Framework, version v23r6

Home   Generated: Wed Jan 30 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 181 of file cmt2cmake.py.

Constructor & Destructor Documentation

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

Definition at line 182 of file cmt2cmake.py.

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

Member Function Documentation

def cmt2cmake.Package._parseRequirements (   self)
private

Definition at line 582 of file cmt2cmake.py.

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

564  def data_packages(self):
565  '''
566  Return the list of data packages used by this package in the form of a
567  dictionary {name: version_pattern}.
568  '''
569  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 243 of file cmt2cmake.py.

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

Definition at line 570 of file cmt2cmake.py.

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

Member Data Documentation

cmt2cmake.Package.aliases

Definition at line 200 of file cmt2cmake.py.

cmt2cmake.Package.applications

Definition at line 195 of file cmt2cmake.py.

cmt2cmake.Package.CMTParser

Definition at line 230 of file cmt2cmake.py.

cmt2cmake.Package.component_libraries

Definition at line 226 of file cmt2cmake.py.

cmt2cmake.Package.component_library

Definition at line 221 of file cmt2cmake.py.

cmt2cmake.Package.copy_relax_rootmap

Definition at line 223 of file cmt2cmake.py.

cmt2cmake.Package.documents

Definition at line 196 of file cmt2cmake.py.

cmt2cmake.Package.god_dictionary

Definition at line 211 of file cmt2cmake.py.

cmt2cmake.Package.god_headers

Definition at line 210 of file cmt2cmake.py.

cmt2cmake.Package.install_more_includes

Definition at line 208 of file cmt2cmake.py.

cmt2cmake.Package.install_python_modules

Definition at line 209 of file cmt2cmake.py.

cmt2cmake.Package.install_scripts

Definition at line 209 of file cmt2cmake.py.

cmt2cmake.Package.libraries

Definition at line 194 of file cmt2cmake.py.

cmt2cmake.Package.linker_libraries

Definition at line 227 of file cmt2cmake.py.

cmt2cmake.Package.linker_library

Definition at line 222 of file cmt2cmake.py.

cmt2cmake.Package.log

Definition at line 229 of file cmt2cmake.py.

cmt2cmake.Package.macros

Definition at line 197 of file cmt2cmake.py.

cmt2cmake.Package.multi_patterns

Definition at line 218 of file cmt2cmake.py.

cmt2cmake.Package.name

Definition at line 187 of file cmt2cmake.py.

cmt2cmake.Package.path

Definition at line 183 of file cmt2cmake.py.

cmt2cmake.Package.paths

Definition at line 199 of file cmt2cmake.py.

cmt2cmake.Package.project

Definition at line 189 of file cmt2cmake.py.

cmt2cmake.Package.PyQtResource

Definition at line 212 of file cmt2cmake.py.

cmt2cmake.Package.PyQtUIC

Definition at line 213 of file cmt2cmake.py.

cmt2cmake.Package.QMTest

Definition at line 209 of file cmt2cmake.py.

cmt2cmake.Package.reflex_dictionaries

Definition at line 225 of file cmt2cmake.py.

cmt2cmake.Package.reflex_dictionary

Definition at line 220 of file cmt2cmake.py.

cmt2cmake.Package.requirements

Definition at line 188 of file cmt2cmake.py.

cmt2cmake.Package.sets

Definition at line 198 of file cmt2cmake.py.

cmt2cmake.Package.singleton_patterns

Definition at line 205 of file cmt2cmake.py.

cmt2cmake.Package.uses

Definition at line 192 of file cmt2cmake.py.

cmt2cmake.Package.version

Definition at line 193 of file cmt2cmake.py.


The documentation for this class was generated from the following file:
Generated at Wed Jan 30 2013 17:13:49 for Gaudi Framework, version v23r6 by Doxygen version 1.8.2 written by Dimitri van Heesch, © 1997-2004