Gaudi Framework, version v25r0

Home   Generated: Mon Feb 17 2014
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
gaudi-policy.py
Go to the documentation of this file.
1 # -*- python -*-
2 
3 ## stdlib imports
4 import os
5 import os.path as osp
6 import re
7 import sys
8 
9 ## waf imports
10 import waflib.Errors
11 import waflib.Logs as msg
12 import waflib.Utils
13 import waflib.Configure
14 import waflib.Build
15 import waflib.Task
16 import waflib.Tools.ccroot
17 from waflib.Configure import conf
18 from waflib.TaskGen import feature, before_method, after_method, extension, after
19 
20 
21 ### ---------------------------------------------------------------------------
22 @feature('cxx', 'c')
23 @after_method('apply_incpaths')
25  self.env.prepend_value('INCPATHS', self.env.BUILD_INSTALL_AREA_INCDIR)
26  self.env.prepend_value('INCPATHS', '.')
27 
28  self.env.prepend_value('LIBPATH', self.env.BUILD_INSTALL_AREA_LIBDIR)
29  return
30 
31 ### ---------------------------------------------------------------------------
32 @feature('hwaf_runtime_tsk', '*')
33 @before_method('process_rule')
35  '''
36  insert_project_level_pythonpath adds ${INSTALL_AREA}/python into the
37  ${PYTHONPATH} environment variable.
38  '''
39  _get = getattr(self, 'hwaf_get_install_path', None)
40  if not _get: _get = getattr(self.bld, 'hwaf_get_install_path')
41  pydir = _get('${INSTALL_AREA}/python')
42  self.env.prepend_value('PYTHONPATH', pydir)
43  return
44 
45 ### ---------------------------------------------------------------------------
46 @feature('hwaf_runtime_tsk', '*')
47 @before_method('process_rule')
49  '''
50  insert_project_level_joboptpath adds ${INSTALL_AREA}/jobOptions into the
51  ${JOBOPTSEARCHPATH} environment variable.
52  '''
53  _get = getattr(self, 'hwaf_get_install_path', None)
54  if not _get: _get = getattr(self.bld, 'hwaf_get_install_path')
55  d = _get('${INSTALL_AREA}/jobOptions')
56  self.env.prepend_value('JOBOPTSEARCHPATH', d)
57  return
58 
59 ### ---------------------------------------------------------------------------
60 @feature('hwaf_runtime_tsk', '*')
61 @before_method('process_rule')
63  '''
64  insert_project_level_datapath adds ${INSTALL_AREA}/share into the
65  ${DATAPATH} environment variable.
66  '''
67  _get = getattr(self, 'hwaf_get_install_path', None)
68  if not _get: _get = getattr(self.bld, 'hwaf_get_install_path')
69  d = _get('${INSTALL_AREA}/share')
70  self.env.prepend_value('DATAPATH', d)
71  return
72 
73 ### ---------------------------------------------------------------------------
74 @feature('hwaf_runtime_tsk', '*')
75 @before_method('process_rule')
77  '''
78  insert_project_level_xmlpath adds ${INSTALL_AREA}/XML into the
79  ${XMLPATH} environment variable.
80  '''
81  _get = getattr(self, 'hwaf_get_install_path', None)
82  if not _get: _get = getattr(self.bld, 'hwaf_get_install_path')
83  d = _get('${INSTALL_AREA}/XML')
84  self.env.prepend_value('XMLPATH', d)
85  return
86 
87 ### ---------------------------------------------------------------------------
88 @conf
90  # extract package name
91  PACKAGE_NAME = osp.basename(ctx.hwaf_pkg_name())
92 
93  # add ${INSTALL_AREA}/python to PYTHONPATH if not there already
94  #pypath = ctx.hwaf_get_install_path('${INSTALL_AREA}/python')
95  pypath = waflib.Utils.subst_vars('${INSTALL_AREA}/python', ctx.env)
96  if not (pypath in ctx.env.get_flat('PYTHONPATH')):
97  ctx.env.prepend_value('PYTHONPATH', pypath)
98  pass
99 
100  #source = waflib.Utils.to_list(source)
101  pydir = ctx.path.find_dir('python')
102  if not pydir:
103  msg.error(
104  '[%s] no such directory: [%s]' % (
105  PACKAGE_NAME,
106  os.path.join(ctx.path.abspath(), 'python'),
107  )
108  )
109  msg.error('cannot execute [gaudi_install_python_modules]')
110  return
111  pyfiles = pydir.ant_glob(
112  '**/*',
113  dir=False,
114  relative_trick=True,
115  )
116  ctx(
117  features = 'py',
118  name = 'py-%s' % PACKAGE_NAME,
119  source = pyfiles,
120  install_path = '${INSTALL_AREA}/python/%s' % PACKAGE_NAME,
121  )
122  return
123 
124 ### ---------------------------------------------------------------------------
125 @conf
126 def gaudi_install_scripts(ctx, **kw):
127  # extract package name
128  PACKAGE_NAME = osp.basename(ctx.hwaf_pkg_name())
129 
130  source = kw.get('source', 'scripts/*')
131 
132  source = waflib.Utils.to_list(source)
133  _srcs = []
134  for f in source:
135  _srcs.extend(ctx.path.ant_glob(f, dir=False))
136  source = _srcs[:]
137  del _srcs
138 
139  ctx.install_files(
140  '${INSTALL_AREA}/bin',
141  source,
142  #relative_trick=True,
143  chmod=waflib.Utils.O755,
144  )
145  return
146 
147 ### ---------------------------------------------------------------------------
148 @conf
149 def gaudi_dictionary(ctx, **kw):
150 
151  kw = dict(kw)
152 
153  name = kw["name"]
154  source = kw["source"]
155  selection_file = kw["selection_file"]
156 
157  del kw["name"]
158  del kw["source"]
159  del kw["selection_file"]
160 
161  o = ctx.build_reflex_dict(
162  name = name,
163  source = source,
164  selection_file = selection_file,
165  **kw
166  )
167  return o
168 
169 ### ---------------------------------------------------------------------------
170 @conf
172  # extract package name
173  PACKAGE_NAME = osp.basename(ctx.hwaf_pkg_name())
174 
175  jobo_dir = ctx.path.find_dir('options')
176  jobos = jobo_dir.ant_glob('**/*', dir=False)
177 
178  ctx.install_files(
179  '${INSTALL_AREA}/jobOptions/%s' % PACKAGE_NAME,
180  jobos,
181  cwd=jobo_dir,
182  relative_trick=True
183  )
184  return
185 
186 ### ---------------------------------------------------------------------------
187 @conf
188 def gaudi_install_data(ctx, **kw):
189  # extract package name
190  PACKAGE_NAME = osp.basename(ctx.hwaf_pkg_name())
191 
192  source = kw['source']
193  relative_trick = kw.get('relative_trick', False)
194  cwd = kw.get('cwd', None)
195  if cwd:
196  cwd = waflib.Utils.to_list(cwd)[0]
197  cwd = ctx.path.find_dir(cwd)
198 
199  source = waflib.Utils.to_list(source)
200  _srcs = []
201  for f in source:
202  _srcs.extend(ctx.path.ant_glob(f, dir=False))
203  source = _srcs[:]
204  del _srcs
205 
206  ctx.install_files(
207  '${INSTALL_AREA}/share',
208  source,
209  relative_trick=relative_trick,
210  cwd=cwd,
211  postpone=False,
212  )
213  return
214 
215 ### -----------------------------------------------------------------------------
216 @conf
217 def gaudi_install_headers(ctx, incdir=None, relative_trick=True, cwd=None):
218 
219  # extract package name
220  PACKAGE_NAME = osp.basename(ctx.hwaf_pkg_name())
221  inc_node = None
222  if not incdir:
223  inc_node = ctx.path.find_dir(PACKAGE_NAME)
224  if not inc_node:
225  return
226  else:
227  if isinstance(incdir, str):
228  inc_node = ctx.path.find_dir(incdir)
229  else:
230  inc_node = incdir
231  pass
232  pass
233 
234  if isinstance(cwd, str):
235  cwd = ctx.path.find_dir(cwd)
236 
237  if not inc_node:
238  ctx.fatal('no such directory [%s] (pkg=%s)' % (incdir, ctx.hwaf_pkg_name()))
239  pass
240 
241  includes = inc_node.ant_glob('**/*', dir=False)
242  ctx.install_files(
243  '${INSTALL_AREA}/include', includes,
244  relative_trick=relative_trick,
245  cwd=cwd,
246  postpone=False,
247  )
248 
249  incpath = waflib.Utils.subst_vars('${INSTALL_AREA}/include',ctx.env)
250  ctx.env.append_unique('INCLUDES_%s' % PACKAGE_NAME,
251  [incpath,inc_node.parent.abspath()])
252  # msg.info("--> [%s] %s: %r" %(PACKAGE_NAME,incpath,
253  # ctx.env.get_flat('INCLUDES_%s'%PACKAGE_NAME)))
254  return
255 
256 ### ---------------------------------------------------------------------------
257 @conf
258 def gaudi_qmtest(ctx, **kw):
259  return
260 
261 ### ---------------------------------------------------------------------------
262 @conf
263 def gaudi_library(ctx, **kw):
264  # extract package name
265  PACKAGE_NAME = osp.basename(ctx.hwaf_pkg_name())
266 
267  ctx.gaudi_gen_package_version_header()
268 
269  kw = dict(kw)
270  name = kw['name']
271  source = kw["source"]
272  del kw['name']
273  del kw['source']
274 
275  linkflags = kw.get('linkflags', [])
276  linkflags = ctx.env.SHLINKFLAGS + linkflags
277  kw['linkflags'] = linkflags
278 
279  src_node = ctx.path.find_dir('src')
280 
281  srcs = ctx._cmt_get_srcs_lst(source)
282  includes = waflib.Utils.to_list(kw.get('includes', []))
283  includes.insert(0, ctx.path.abspath())
284  kw['includes'] = includes + [src_node]
285 
286  export_incs = None
287  kw['export_includes'] = waflib.Utils.to_list(
288  kw.get('export_includes', [])
289  )[:]
290  if not kw['export_includes']:
291  inc_node = ctx.path.find_dir(PACKAGE_NAME)
292  if inc_node:
293  export_incs = '.'
294  kw['export_includes'].append(export_incs)
295  else:
296  export_incs = kw['export_includes']
297  #msg.info('%s: exports: %r' % (name, kw['export_includes']))
298  pass
299 
300  kw['includes'].extend(kw['export_includes'])
301 
302  kw['use'] = waflib.Utils.to_list(kw.get('use', [])) + ['dl']
303 
304  defines = waflib.Utils.to_list(kw.get('defines', []))
305  kw['defines'] = defines + ctx._get_pkg_version_defines()
306 
307  kw['features'] = waflib.Utils.to_list(kw.get('features', [])) + [
308  'cxx', 'cxxshlib', 'symlink_tsk',
309  ]
310  kw['target'] = kw.get('target', name)
311 
312  #msg.info ("==> gaudi_library(%s, '%s', %r)..." % (name, srcs, kw.keys()))
313  o = ctx(
314  name = name,
315  source = srcs,
316  install_path = '${INSTALL_AREA}/lib',
317  libpath = ctx.env.LD_LIBRARY_PATH + [ctx.path.get_bld().abspath()],
318  **kw
319  )
320  o.reentrant = True
321  # for use-exports
322  ctx.env['LIB_%s' % name] = [name]
323  ctx.env.append_unique('LIBPATH_%s'%name, ctx.path.get_bld().abspath())
324 
325  uses = waflib.Utils.to_list(kw.get('use', []))
326  ctx.hwaf_propagate_uselib(name, uses)
327 
328  #msg.info('--> libpath[%s]: %s' % (name, ctx.env['LIBPATH_%s'%name]))
329  #msg.info('--> incpath[%s]: %s' % (name, export_incs))
330  if export_incs:
331  export_incs = waflib.Utils.to_list(export_incs)[0]
332  if export_incs == '.':
333  ctx.gaudi_install_headers()
334  pass
335  pass
336 
337  return o
338 
339 ### ---------------------------------------------------------------------------
340 @conf
341 def gaudi_module(ctx, **kw):
342  kw = dict(kw)
343  do_genmap = kw.get('do_genmap', True)
344  do_genconf= kw.get('do_genconf', True)
345 
346  name = kw['name']
347  source = kw["source"]
348  del kw['name']
349  del kw['source']
350 
351  ctx.gaudi_gen_package_version_header()
352 
353  #msg.info('=========== %s ============' % name)
354  #msg.info("::: %s" % ctx.path.abspath())
355  src_node = ctx.path.find_dir('src')
356  bld_node = src_node.get_bld()
357 
358  srcs = ctx._cmt_get_srcs_lst(source)
359  includes = waflib.Utils.to_list(kw.get('includes', []))
360  includes.insert(0, ctx.path.abspath())
361  includes.insert(1, ctx.path.get_bld().abspath())
362  #includes.insert(1, ctx.path.abspath()+'/'+PACKAGE_NAME)
363  kw['includes'] = includes + [src_node]
364 
365  linkflags = waflib.Utils.to_list(kw.get('linkflags', []))
366  linkflags = ctx.env.SHLINKFLAGS + linkflags
367  kw['linkflags'] = linkflags
368 
369  defines = waflib.Utils.to_list(kw.get('defines', []))
370  kw['defines'] = defines + ctx._get_pkg_version_defines()
371 
372  kw['depends_on'] = waflib.Utils.to_list(kw.get('use', [])) + \
373  waflib.Utils.to_list(kw.get('depends_on', []))
374  #print("---> depends: %s" % kw['depends_on'])
375 
376  # extract package name
377  PACKAGE_NAME = ctx._get_pkg_name()
378 
379  # schedule the requested features
380  features = ['cxx', 'cxxshlib',]
381  features.append('symlink_tsk')
382  if do_genmap:
383  features.append('gen_map')
384  if do_genconf:
385  features.append('gen_conf')
386  #features.append('py')
387 
388  kw['features'] = waflib.Utils.to_list(kw.get('features',[])) + features
389  kw['target'] = kw.get('target', name)
390 
391  lib = ctx(
392  name=name,
393  source=srcs,
394  **kw)
395  lib.name = 'complib-%s' % name
396  lib.reentrant = True
397  lib.install_path = '${INSTALL_AREA}/lib'
398  lib.libpath = ctx.env.LD_LIBRARY_PATH + [ctx.path.get_bld().abspath()]
399  lib_name = "lib%s.so" % (lib.target,) # FIXME !!
400  lib.env['GENCONF_LIBNAME'] = lib.target
401  lib.env['PACKAGE_NAME'] = PACKAGE_NAME
402 
403  return lib
404 
405 ### ---------------------------------------------------------------------------
406 @conf
407 def gaudi_pyext(ctx, **kw):
408  return
409 
410 ### ---------------------------------------------------------------------------
411 @conf
412 def gaudi_application(ctx, **kw):
413  kw = dict(kw)
414 
415  name = kw['name']
416  source = kw["source"]
417  del kw['name']
418  del kw['source']
419 
420  ctx.gaudi_gen_package_version_header()
421 
422  # FIXME: hack !!! cppunit doesn't propagate correctly...
423  do_test = kw.get('do_test', False)
424  if do_test:
425  return
426 
427  kw['features'] = waflib.Utils.to_list(
428  kw.get('features', '')) + [
429  'cxx', 'cxxprogram', 'symlink_tsk',
430  ]
431 
432  kw['use'] = waflib.Utils.to_list(kw.get('use', []))
433 
434  pkg_node = ctx.path.get_src()
435  src_node = ctx.path.find_dir('src')
436 
437  srcs = ctx._cmt_get_srcs_lst(source)
438  linkflags = waflib.Utils.to_list(kw.get('linkflags', []))
439  linkflags = ctx.env.SHLINKFLAGS + linkflags
440  kw['linkflags'] = linkflags
441 
442  defines = waflib.Utils.to_list(kw.get('defines', []))
443  kw['defines'] = defines + ctx._get_pkg_version_defines()
444 
445  includes = waflib.Utils.to_list(kw.get('includes', []))
446  includes.insert(0, ctx.path.abspath())
447  #includes.insert(1, ctx.path.abspath()+'/'+PACKAGE_NAME)
448  kw['includes'] = includes + [src_node]
449 
450  # extract package name
451  PACKAGE_NAME = ctx._get_pkg_name()
452 
453  exe = ctx(
454  name=name,
455  source=srcs,
456  **kw)
457  exe.install_path = '${INSTALL_AREA}/bin'
458  exe.libpath = ctx.env.LD_LIBRARY_PATH + [ctx.path.get_bld().abspath()]
459  exe.target = name+'.exe'
460 
461  return exe
462 
463 ### ----------------------------------------------------------------------------
464 @feature('gen_conf')
465 @after('symlink_tsk')
467  lnk_task = getattr(self, 'link_task', None)
468  if not lnk_task:
469  return
470  for n in lnk_task.outputs:
471  gen_conf_hook(self, n)
472  pass
473 
474 @after('symlink_tsk')
475 def gen_conf_hook(self, node):
476  "Bind the .dsomap file extension to the creation of a genconf task"
477  dso = self.env['GENCONF_LIBNAME']
478  bld_node = node.get_bld().parent
479  pkg_name = bld_node.name # FIXME!!
480  genconf_dir_node = bld_node.make_node('genConf').make_node(pkg_name)
481  self.env['GENCONF_OUTPUTDIR'] = genconf_dir_node.abspath()
482  genconf_node = genconf_dir_node.make_node('%sConf.py' % dso)
483  initpy_node = genconf_dir_node.make_node('__init__.py')
484  confdb_node = genconf_dir_node.make_node('%s_confDb.py' % dso)
485  tsk = self.create_task('gen_conf',
486  node,
487  [genconf_node,genconf_dir_node,initpy_node,confdb_node])
488  # schedule the merge of confdb.py files
489  merge_confdb_hook(self, confdb_node).set_run_after(tsk)
490 
491  # schedule the installation of py-files
492  src_node = self.path.get_src()
493  py_dir = src_node.find_dir('python')
494  py_files = [genconf_node, confdb_node]
495  if not py_dir:
496  py_files.append(initpy_node)
497  PACKAGE_NAME = self.env['PACKAGE_NAME']
498  self.bld(
499  features='py',
500  name ='py-genconf-%s' % PACKAGE_NAME,
501  source = py_files,
502  install_path = '${INSTALL_AREA}/python/%s' % PACKAGE_NAME,
503  )
504 
505  # add ${INSTALL_AREA}/python to PYTHONPATH if not there already
506  pypath = waflib.Utils.subst_vars('${INSTALL_AREA}/python', self.env)
507  if not pypath in self.env.get_flat('PYTHONPATH'):
508  self.env.prepend_value('PYTHONPATH', pypath)
509  pass
510 
511  return
512 
513 class gen_conf(waflib.Task.Task):
514  vars = ['GENCONF', 'DEFINES', 'INCLUDES', 'GENCONF_CONFIGURABLE_MODULE']
515  color= 'BLUE'
516  ext_in = ['.bin', '.so']
517  ext_out = ['.py']
518  shell = False
519  reentrant = True
520  after = ['cxxshlib', 'cxxprogram', 'symlink_tsk', 'gen_map']
521  depends_on = ['genconf', 'complib-GaudiCoreSvc']
522 
523  def run(self):
524  import os
525  cmd = '${GENCONF} -p ${PACKAGE_NAME} -i %s -o ${GENCONF_OUTPUTDIR} --configurable-module ${GENCONF_CONFIGURABLE_MODULE}' % (
526  self.inputs[0].name,
527  )
528  cmd = waflib.Utils.subst_vars(cmd, self.env)
529 
530  bld_node = self.inputs[0].parent.get_bld()
531 
532  o = self.outputs[0].change_ext('.genconf.log')
533  fout_node = bld_node.find_or_declare(o.name)
534  fout = open(fout_node.abspath(), 'w')
535  env = self.generator.bld._get_env_for_subproc()
536  rc = self.generator.bld.exec_command(
537  cmd,
538  stdout=fout,
539  stderr=fout,
540  env=env
541  )
542  if rc != 0:
543  msg.error("** error running [%s]" % cmd)
544  msg.error(fout_node.read())
545  return rc
546 
547 ### ---------------------------------------------------------------------------
548 g_confdb_merger = None
549 @feature('merge_confdb')
551  pass
552 
553 @extension('_confDb.py')
554 def merge_confdb_hook(self, node):
555  global g_confdb_merger
556  if g_confdb_merger is None:
557  import os
558  bld_area = os.path.basename(self.env['BUILD_INSTALL_AREA'])
559  bld_node = self.bld.bldnode.find_dir(bld_area)
560  py_node = bld_node.make_node('python')
561  py_node.mkdir()
562  out_node = py_node.make_node(
563  'project_%s_merged_confDb.py' %
564  self.bld.hwaf_project_name().replace('-', '_')
565  )
566  g_confdb_merger = self.create_task('merge_confdb', node, out_node)
567  self.bld.install_files(
568  '${INSTALL_AREA}/python',
569  out_node,
570  relative_trick=False
571  )
572  else:
573  g_confdb_merger.inputs.append(node)
574  return g_confdb_merger
575 
576 class merge_confdb(waflib.Task.Task):
577  color='PINK'
578  ext_in = ['_confDb.py']
579  #ext_out= ['.py']
580  after = ['merge_dsomap',]
581  run_str = 'cat ${SRC} > ${TGT}'
582  reentrant = False
583 
584  def runnable_status(self):
585  status = waflib.Task.Task.runnable_status(self)
586  if status == waflib.Task.ASK_LATER:
587  return status
588 
589  import os
590  for in_node in self.inputs:
591  try:
592  os.stat(in_node.abspath())
593  except:
594  msg.debug("::missing input [%s]" % in_node.abspath())
595  return waflib.Task.ASK_LATER
596  return waflib.Task.RUN_ME
597 
598 
599 ### utils
600 
601 ### ---------------------------------------------------------------------------
603  # extract package name
604  pkgname = osp.basename(ctx.hwaf_pkg_name())
605  hdr = ctx.path.get_bld().make_node('%sVersion.h' % pkgname)
606  def rule(task):
607  tgt = task.outputs[0]
608  data = '''
609 #ifndef %(proj)s_VERSION
610 /* Automatically generated file: do not modify! */
611 #ifndef CALC_GAUDI_VERSION
612 #define CALC_GAUDI_VERSION(maj,min) (((maj) << 16) + (min))
613 #endif
614 #define %(proj)s_MAJOR_VERSION %(maj)d
615 #define %(proj)s_MINOR_VERSION %(min)d
616 #define %(proj)s_PATCH_VERSION %(pat)d
617 #define %(proj)s_VERSION CALC_GAUDI_VERSION(%(proj)s_MAJOR_VERSION,%(proj)s_MINOR_VERSION)
618 #endif
619 ''' % getattr(task.generator, 'pkg_version_data')
620  tgt.write(data)
621  return
622 
623  pkg_infos = ctx.hwaf_pkg_infos()
624  version = pkg_infos.get('version', None)
625  if not version:
626  version_hwaf = ctx.path.get_src().find_resource('version.hwaf')
627  if version_hwaf: version = version_hwaf.read().strip()
628  else: version = 'HEAD'
629  pass
630 
631  # put at least some default value
632  majver, minver, patver = 999, 999, 0
633 
634  if version.startswith('HEAD'):
635  majver, minver, patver = 999, 999, 0 # special handling
636  else:
637  m = re.match("(v|([A-Za-z]+\-))(?P<maj_ver>[0-9]+)(r|\-)(?P<min_ver>[0-9]+)(?:(p|\-)(?P<pat_ver>[0-9]+))?", version)
638  if m:
639  majver = int(m.groupdict()['maj_ver'])
640  minver = int(m.groupdict()['min_ver'])
641  patver = int(m.groupdict()['pat_ver'] or 0)
642  pkg_version = (majver,minver,patver)
643 
644  if not ctx.env['GEN_PKG_VERSION_HDR_%s' % pkgname]:
645  ctx(
646  name = 'gen-pkg-version-hdr-'+pkgname,
647  rule = rule,
648  source = 'wscript',
649  target = hdr.name,
650  pkg_version_data = {
651  'proj':pkgname.upper(),
652  'maj': majver,
653  'min': minver,
654  'pat': patver,
655  },
656  before = 'cxx',
657  )
658  ctx.env['GEN_PKG_VERSION_HDR_%s' % pkgname] = '1'
659  return
660 
661 ### ---------------------------------------------------------------------------
662 import waflib.Build
663 waflib.Build.BuildContext.gaudi_module = gaudi_module
664 waflib.Build.BuildContext.gaudi_library = gaudi_library
665 waflib.Build.BuildContext.gaudi_application = gaudi_application
666 
667 waflib.Build.BuildContext.gaudi_install_headers = gaudi_install_headers
668 waflib.Build.BuildContext.gaudi_gen_package_version_header = gaudi_gen_package_version_header

Generated at Mon Feb 17 2014 14:37:47 for Gaudi Framework, version v25r0 by Doxygen version 1.8.2 written by Dimitri van Heesch, © 1997-2004