| # Gaudi Framework, version v25r0 |

Home |  | Generated: Mon Feb 17 2014

- Main Page
- Related Pages
- Modules
- Namespaces
- Classes
- Files

- Class List
- Class Index
- Class Hierarchy
- Class Members

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:
[legend]
Collaboration diagram for cmt2cmake.Package:
[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.

183
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)
188
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"])
210 self.install_more_includes = {}
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'])
222 self.reflex_dictionary = []
223 self.component_library = []
224 self.linker_library = []
225 self.copy_relax_rootmap = []
226
227 self.reflex_dictionaries = {}
228 self.component_libraries = set()
229 self.linker_libraries = set()
230
231 self.log = logging.getLogger('Package(%s)' % self.name)
232 self.CMTParser = makeParser(self.singleton_patterns | self.multi_patterns)
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.

583
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.

564
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.

244
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.

571
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:

- /afs/cern.ch/sw/Gaudi/releases/GAUDI/GAUDI_v25r0/cmake/cmt2cmake/cmt2cmake.py