Gaudi Framework, version v23r5

Home   Generated: Wed Nov 28 2012
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
test_cmt2cmake.py
Go to the documentation of this file.
1 from tempfile import mkdtemp
2 import shutil
3 import os
4 import re
5 
6 # use a private cache for the tests
7 os.environ['CMT2CMAKECACHE'] = 'test.cache'
8 if os.path.exists('test.cache'):
9  os.remove('test.cache')
10 
11 import cmt2cmake
13 
14 # prepare the cache for the tests
15 cmt2cmake.cache['GaudiKernel'] = {'libraries': ['GaudiKernel'],
16  'includes': False}
17 cmt2cmake.cache['GaudiUtils'] = {'libraries': ['GaudiUtilsLib'],
18  'includes': False}
19 cmt2cmake.cache['LHCbKernel'] = {'libraries': ['LHCbKernel'],
20  'includes': False}
21 cmt2cmake.cache['SomeSubdir'] = {'libraries': ['SubdirLib'],
22  'includes': False}
23 cmt2cmake.cache['JustHeaders'] = {'libraries': [],
24  'includes': True}
25 cmt2cmake.cache[repr(('Baseproject', 'v1r0'))] = {'heptools': '65'}
26 cmt2cmake.cache[repr(('TestProjectHT', 'v3r0'))] = {'heptools': '23'}
27 
28 
29 cmt2cmake.data_packages = set(['DataPack', 'Another/DtPkg', 'SpecialThing'])
30 
31 #
32 # Helpers
33 #
34 
35 def buildDir(files, rootdir=os.curdir):
36  '''
37  Create a directory structure from the content of files.
38 
39  @param files: a dictionary or list of pairs mapping a filename to the content
40  if the content is a dictionary, recurse
41  @param rootdir: base directory
42  '''
43  if type(files) is dict:
44  files = files.items()
45 
46  # ensure that the root exists (to allow empty directories)
47  if not os.path.exists(rootdir):
48  os.makedirs(rootdir)
49 
50  # create all the entries
51  for filename, data in files:
52  filename = os.path.join(rootdir, filename)
53  if type(data) is dict:
54  buildDir(data, filename)
55  else:
56  d = os.path.dirname(filename)
57  if not os.path.exists(d):
58  os.makedirs(d)
59  f = open(filename, "w")
60  if data:
61  f.write(data)
62  f.close()
63 
65  """
66  Helper class to test the Package.
67  """
68  def __init__(self, name, requirements, files=None):
69  if not files:
70  files = {}
71  files["cmt/requirements"] = requirements
72 
73  self.tmpdir = mkdtemp()
74  rootdir = os.path.join(self.tmpdir, name)
75  buildDir(files, rootdir)
76 
77  super(PackWrap, self).__init__(rootdir)
78 
79  def __del__(self):
80  shutil.rmtree(self.tmpdir, ignore_errors=False)
81 
83  """
84  Helper class to test the Project.
85  """
86  def __init__(self, name, proj_cmt, files=None):
87  if not files:
88  files = {}
89  files["cmt/project.cmt"] = proj_cmt
90 
91  self.tmpdir = mkdtemp()
92  rootdir = os.path.join(self.tmpdir, name)
93  buildDir(files, rootdir)
94 
95  super(ProjWrap, self).__init__(rootdir)
96 
97  def __del__(self):
98  shutil.rmtree(self.tmpdir, ignore_errors=False)
99 
100 
101 def getCalls(function, cmakelists):
102  '''
103  extracts the arguments to all the calls to a cmake function
104  '''
105  exp = re.compile(r'\b{0}\s*\(([^)]*)\)'.format(function), flags=re.MULTILINE)
106  return [m.group(1) for m in exp.finditer(cmakelists)]
107 
108 #
109 # Tests
110 #
111 
113  d = mkdtemp()
114  buildDir({'NoPackage': {'a_file.txt': None}}, d)
115  try:
116  cmt2cmake.Package(os.path.join(d, 'NoPackage'))
117  assert False, 'bad package not recognized'
118  except ValueError:
119  pass
120  finally:
121  shutil.rmtree(d)
122 
123 
125  requirements = """
126  package ThisIsAPackage
127  version v123r456
128 
129  branches cmt branches are ignored
130  macro test parsing of \\
131  multi line
132  """
133  pkg = PackWrap("ThisIsAPackage", requirements)
134 
135  cmakelists = pkg.generate()
136  print cmakelists
137 
138  calls = getCalls("gaudi_subdir", cmakelists)
139  assert calls, "gaudi_subdir not called"
140  assert len(calls) == 1, "gaudi_subdir called more than once"
141 
142  args = calls[0].strip().split()
143  assert args == ["ThisIsAPackage", "v123r456"], args
144 
146  requirements = """
147  package Test
148  version v1r0
149 
150  # series of uses
151  use GaudiKernel v*
152  use GaudiAlg *
153  use GaudiPolicy *
154  use GaudiCoreSvc v* # comment
155  use GaudiUtils * -no_auto_imports
156 
157  use LHCbKernel v* Kernel
158  """
159  pkg = PackWrap("Test", requirements)
160 
161  cmakelists = pkg.generate()
162  print cmakelists
163 
164  calls = getCalls("gaudi_depends_on_subdirs", cmakelists)
165  assert calls, "gaudi_depends_on_subdirs not called"
166 
167  args = set()
168  for call in calls:
169  args.update(call.strip().split())
170  expected = set(['GaudiKernel', 'GaudiAlg', 'GaudiCoreSvc',
171  'GaudiUtils', 'Kernel/LHCbKernel'])
172  assert args == expected
173 
175  requirements = """
176  package Test
177  version v1r0
178 
179  # no uses
180  """
181  pkg = PackWrap("Test", requirements)
182 
183  cmakelists = pkg.generate()
184  print cmakelists
185 
186  calls = getCalls("gaudi_depends_on_subdirs", cmakelists)
187  assert not calls, "gaudi_depends_on_subdirs called"
188 
190  requirements = """
191  package Test
192  version v1r0
193 
194  # series of uses
195  use Boost v* LCG_Interfaces
196  use Python v* LCG_Interfaces
197  use XercesC v* LCG_Interfaces -no_auto_imports
198  """
199  pkg = PackWrap("Test", requirements)
200 
201  cmakelists = pkg.generate()
202  print cmakelists
203 
204  expected = set(['Boost', 'XercesC'])
205 
206  calls = getCalls("find_package", cmakelists)
207  assert calls, "find_pacakge not called"
208  assert len(calls) == len(expected)
209 
210  args = set()
211  for call in calls:
212  args.add(call.strip().split()[0])
213  print args
214  assert args == expected
215 
217  requirements = '''
218 #============================================================================
219 package Tell1Kernel
220 version v1r12p1
221 
222 # Structure, i.e. directories to process.
223 #============================================================================
224 branches cmt doc Tell1Kernel
225 
226 # Used packages
227 #============================================================================
228 use GaudiPolicy v*
229 
230 apply_pattern install_more_includes more=Tell1Kernel
231  '''
232  pkg = PackWrap("Tell1Kernel", requirements, files={"Tell1Kernel/hdr.h": None})
233 
234  cmakelists = pkg.generate()
235  print cmakelists
236 
237  calls = getCalls("gaudi_install_headers", cmakelists)
238  assert calls
239 
240  args = set()
241  for call in calls:
242  args.update(call.strip().split())
243  expected = set(['Tell1Kernel'])
244  assert args == expected
245 
247  requirements = '''
248 package Test
249 version v1r0
250 
251 apply_pattern install_python_modules
252  '''
253  pkg = PackWrap("Test", requirements, files={"python/Test/__init__.py": None})
254 
255  cmakelists = pkg.generate()
256  print cmakelists
257 
258  calls = getCalls("gaudi_install_python_modules", cmakelists)
259  assert calls
260 
262  requirements = '''
263 package Test
264 version v1r0
265 
266 macro TestConfUserModules "Test.CustomModule1 Test.CustomModule2"
267 
268 apply_pattern install_python_modules
269  '''
270  pkg = PackWrap("Test", requirements, files={"python/Test/__init__.py": None})
271 
272  cmakelists = pkg.generate()
273  print cmakelists
274 
275  calls = getCalls("gaudi_install_python_modules", cmakelists)
276  assert calls
277 
278  calls = getCalls("set_property", cmakelists)
279  assert calls
280  args = calls[0].strip().split()
281  assert args == ['DIRECTORY', 'PROPERTY', 'CONFIGURABLE_USER_MODULES', 'Test.CustomModule1', 'Test.CustomModule2'], args
282 
284  requirements = '''
285 package Test
286 version v1r0
287 
288 apply_pattern install_scripts
289  '''
290  pkg = PackWrap("Test", requirements, files={"scripts/someScript": None})
291 
292  cmakelists = pkg.generate()
293  print cmakelists
294 
295  calls = getCalls("gaudi_install_scripts", cmakelists)
296  assert calls
297 
299  requirements = '''
300 package Test
301 version v1r0
302 
303 apply_pattern QMTest
304  '''
305  pkg = PackWrap("Test", requirements, files={"tests/qmtest/test.qms/a_test.qmt": None})
306 
307  cmakelists = pkg.generate()
308  print cmakelists
309 
310  calls = getCalls("gaudi_add_test", cmakelists)
311  assert calls, "no test added"
312  assert len(calls) == 1, "gaudi_add_test called more than once"
313 
314  args = calls[0].strip().split()
315  assert args == ["QMTest", "QMTEST"]
316 
318  requirements = '''
319 package Test
320 version v1r0
321 
322 library TestLib lib/*.cpp
323 apply_pattern linker_library library=TestLib
324 
325 library TestComp component/*.cpp
326 apply_pattern component_library library=TestComp
327 
328 library TestTestLib test/lib/*.cpp -group=tests
329 apply_pattern linker_library library=TestTestLib
330 
331 library TestTestComp test/component/*.cpp -group=tests
332 apply_pattern component_library library=TestTestComp
333 
334 apply_pattern install_more_includes more=TestIncludes
335  '''
336  pkg = PackWrap("Test", requirements, files={'TestIncludes': {}})
337 
338  print 'components', pkg.component_libraries
339  print 'linker', pkg.linker_libraries
340  print 'libraries', pkg.libraries
341 
342  assert pkg.component_libraries == set(['TestComp', 'TestTestComp'])
343  assert pkg.linker_libraries == set(['TestLib', 'TestTestLib'])
344  assert pkg.libraries
345 
346  cmakelists = pkg.generate()
347  print cmakelists
348 
349  calls = getCalls("gaudi_add_library", cmakelists)
350  assert len(calls) == 2, "gaudi_add_library wrong count %d" % len(calls)
351  l = calls[0]
352  assert re.match(r' *TestLib\b', l)
353  assert re.search(r'\bPUBLIC_HEADERS +TestIncludes', l)
354  l = calls[1]
355  assert re.match(r' *TestTestLib\b', l)
356  assert re.search(r'\bPUBLIC_HEADERS +TestIncludes', l)
357  assert re.search(r'\bLINK_LIBRARIES +TestLib', l)
358 
359  calls = getCalls("gaudi_add_module", cmakelists)
360  assert len(calls) == 2, "gaudi_add_module wrong count %d" % len(calls)
361 
362  l = calls[0]
363  assert re.match(r' *TestComp\b', l)
364  assert not re.search(r'\bPUBLIC_HEADERS\b', l)
365  assert re.search(r'\bLINK_LIBRARIES +TestLib', l)
366  l = calls[1]
367  assert re.match(r' *TestTestComp\b', l)
368  assert not re.search(r'\bPUBLIC_HEADERS', l)
369  assert re.search(r'\bLINK_LIBRARIES +TestLib +TestTestLib', l)
370 
372  requirements = '''
373 package Test
374 version v1r0
375 
376 use Boost v* LCG_Interfaces
377 use XercesC v* LCG_Interfaces -no_auto_imports
378 
379 library Lib1 lib1/*.cpp
380 apply_pattern component_library library=Lib1
381 
382 library Lib2 lib2/*.cpp -import=XercesC
383 apply_pattern component_library library=Lib2
384 
385 # We do not use variables
386 library Lib3 lib3/*.cpp a_variable=some_value
387 apply_pattern component_library library=Lib3
388  '''
389  pkg = PackWrap("Test", requirements, files={})
390 
391  print 'components', pkg.component_libraries
392  print 'libraries', pkg.libraries
393 
394  assert pkg.component_libraries == set(['Lib1', 'Lib2', 'Lib3'])
395  assert pkg.libraries
396 
397  cmakelists = pkg.generate()
398  print cmakelists
399 
400  calls = getCalls("gaudi_add_module", cmakelists)
401  assert len(calls) == 3, "gaudi_add_module wrong count %d" % len(calls)
402 
403  l = calls[0]
404  assert re.match(r' *Lib1\b', l)
405  assert not re.search(r'\bPUBLIC_HEADERS\b', l)
406  assert re.search(r'\bLINK_LIBRARIES +Boost', l)
407  assert re.search(r'\bINCLUDE_DIRS +Boost', l)
408  l = calls[1]
409  assert re.match(r' *Lib2\b', l)
410  assert not re.search(r'\bPUBLIC_HEADERS', l)
411  assert re.search(r'\bLINK_LIBRARIES +Boost +XercesC', l)
412  assert re.search(r'\bINCLUDE_DIRS +Boost +XercesC', l)
413  l = calls[2]
414  assert re.match(r' *Lib3\b', l)
415  assert not re.search(r'\bPUBLIC_HEADERS', l)
416  assert re.search(r'\bLINK_LIBRARIES +Boost', l)
417  assert re.search(r'\bINCLUDE_DIRS +Boost', l)
418 
420  # some corner cases
421  # FIXME: we should actually test the warning messages
422  requirements = '''
423 package Test
424 version v1r0
425 
426 library Lib1
427 apply_pattern component_library library=Lib1
428 
429 library Lib2 lib2/*.cpp
430 apply_pattern linker_library library=Lib2
431 
432 library Lib3 lib3/*.cpp
433 
434 library Lib4 lib4/*.cpp
435 apply_pattern linker_library library="Lib4"
436 
437  '''
438  pkg = PackWrap("Test", requirements, files={})
439 
440  print 'components', pkg.component_libraries
441  print 'linker', pkg.linker_libraries
442  print 'libraries', pkg.libraries
443 
444  assert pkg.component_libraries == set(['Lib1'])
445  assert pkg.linker_libraries == set(['Lib2', 'Lib4'])
446  assert len(pkg.libraries) == 4
447 
448  cmakelists = pkg.generate()
449  print cmakelists
450 
451  calls = getCalls("gaudi_add_module", cmakelists)
452  assert len(calls) == 1, "gaudi_add_module wrong count %d" % len(calls)
453 
454  l = calls[0]
455  assert re.match(r' *Lib1\b', l)
456  assert not re.search(r'\bPUBLIC_HEADERS\b', l)
457 
458  calls = getCalls("gaudi_add_library", cmakelists)
459  assert len(calls) == 3, "gaudi_add_module wrong count %d" % len(calls)
460 
461  l = calls[0]
462  assert re.match(r' *Lib2\b', l)
463  assert re.search(r'\bNO_PUBLIC_HEADERS', l)
464 
465  l = calls[1]
466  assert re.match(r' *Lib3\b', l)
467  assert re.search(r'\bNO_PUBLIC_HEADERS', l)
468 
469  l = calls[2]
470  assert re.match(r' *Lib4\b', l)
471  assert re.search(r'\bNO_PUBLIC_HEADERS', l)
472 
474  requirements = '''
475 package Test
476 version v1r0
477 
478 library TestLib1 ../src/subdir/*.cpp
479 apply_pattern linker_library library=TestLib1
480 
481 library TestLib2 ../tests/src/subdir/*.cpp
482 apply_pattern linker_library library=TestLib2
483 
484 library TestLib3 subdir/*.cpp
485 apply_pattern linker_library library=TestLib3
486  '''
487  pkg = PackWrap("Test", requirements, files={'TestIncludes': {}})
488 
489  assert pkg.linker_libraries == set(['TestLib1', 'TestLib2', 'TestLib3'])
490 
491  cmakelists = pkg.generate()
492  print cmakelists
493 
494  calls = getCalls("gaudi_add_library", cmakelists)
495  assert len(calls) == 3, "gaudi_add_library wrong count %d" % len(calls)
496 
497  l = calls[0].strip().split()
498  assert l[0] == 'TestLib1'
499  assert l[1] == 'src/subdir/*.cpp'
500 
501  l = calls[1].strip().split()
502  assert l[0] == 'TestLib2'
503  assert l[1] == 'tests/src/subdir/*.cpp'
504 
505  l = calls[2].strip().split()
506  assert l[0] == 'TestLib3'
507  assert l[1] == 'src/subdir/*.cpp'
508 
510  requirements = '''
511 package Test
512 version v1r0
513 
514 use Boost v* LCG_Interfaces
515 use XercesC v* LCG_Interfaces -no_auto_imports
516 
517 use GaudiKernel *
518 use GaudiUtils * -no_auto_imports
519 
520 
521 library Lib1 *.cpp
522 apply_pattern component_library library=Lib1
523 
524 library Lib2 *.cpp -import=XercesC
525 apply_pattern component_library library=Lib2
526 
527 library Lib3 *.cpp -import=GaudiUtils
528 apply_pattern component_library library=Lib3
529  '''
530  pkg = PackWrap("Test", requirements, files={})
531 
532  print 'components', pkg.component_libraries
533  print 'linker', pkg.linker_libraries
534  print 'libraries', pkg.libraries
535 
536  assert pkg.component_libraries == set(['Lib1', 'Lib2', 'Lib3'])
537  assert len(pkg.libraries) == 3
538 
539  cmakelists = pkg.generate()
540  print cmakelists
541 
542  calls = getCalls("gaudi_add_module", cmakelists)
543  assert len(calls) == 3, "gaudi_add_module wrong count %d" % len(calls)
544 
545  l = calls[0].strip().split()
546  assert l[0] == 'Lib1'
547  links = set(l[l.index('LINK_LIBRARIES')+1:])
548  assert links == set(['Boost', 'GaudiKernel'])
549 
550  l = calls[1].strip().split()
551  assert l[0] == 'Lib2'
552  assert 'LINK_LIBRARIES' in l
553  links = set(l[l.index('LINK_LIBRARIES')+1:])
554  assert links == set(['Boost', 'GaudiKernel', 'XercesC'])
555 
556  l = calls[2].strip().split()
557  assert l[0] == 'Lib3'
558  assert 'LINK_LIBRARIES' in l
559  links = set(l[l.index('LINK_LIBRARIES')+1:])
560  assert links == set(['Boost', 'GaudiKernel', 'GaudiUtilsLib'])
561 
563  requirements = '''
564 package Test
565 version v1r0
566 
567 use LHCbKernel * Kernel
568 use SomeSubdir * Hat -no_auto_imports
569 
570 library Lib1 *.cpp
571 apply_pattern component_library library=Lib1
572 
573 library Lib2 *.cpp -import=SomeSubdir
574 apply_pattern component_library library=Lib2
575  '''
576  pkg = PackWrap("Test", requirements, files={})
577 
578  print 'components', pkg.component_libraries
579  print 'linker', pkg.linker_libraries
580  print 'libraries', pkg.libraries
581 
582  assert pkg.component_libraries == set(['Lib1', 'Lib2'])
583  assert len(pkg.libraries) == 2
584 
585  cmakelists = pkg.generate()
586  print cmakelists
587 
588  calls = getCalls("gaudi_add_module", cmakelists)
589  assert len(calls) == 2, "gaudi_add_module wrong count %d" % len(calls)
590 
591  l = calls[0].strip().split()
592  assert l[0] == 'Lib1'
593  links = set(l[l.index('LINK_LIBRARIES')+1:])
594  assert links == set(['LHCbKernel'])
595 
596  l = calls[1].strip().split()
597  assert l[0] == 'Lib2'
598  links = set(l[l.index('LINK_LIBRARIES')+1:])
599  assert links == set(['LHCbKernel', 'SubdirLib'])
600 
602  requirements = '''
603 package Test
604 version v1r0
605 
606 use UnknownSubdir *
607 
608 library Lib1 *.cpp
609 apply_pattern component_library library=Lib1
610  '''
611  pkg = PackWrap("Test", requirements, files={})
612 
613  assert pkg.component_libraries == set(['Lib1'])
614  assert len(pkg.libraries) == 1
615 
616  cmakelists = pkg.generate()
617  print cmakelists
618 
619  calls = getCalls("gaudi_add_module", cmakelists)
620  assert len(calls) == 1, "gaudi_add_module wrong count %d" % len(calls)
621 
622  l = calls[0].strip().split()
623  assert l[0] == 'Lib1'
624  assert 'LINK_LIBRARIES' not in l
625  # FIXME: we should test the warning
626 
628  if 'GaudiDummy' in cmt2cmake.cache:
629  del cmt2cmake.cache['GaudiDummy']
630 
631  requirements = '''
632 package GaudiDummy
633 version v1r0
634 
635 apply_pattern install_more_includes more=Dummy
636 
637 library Dummy *.cpp
638 apply_pattern linker_library library=Dummy
639  '''
640  PackWrap("GaudiDummy", requirements, files={'Dummy':{}})
641 
642  assert cmt2cmake.cache['GaudiDummy']['libraries'] == ['Dummy']
643  assert cmt2cmake.cache['GaudiDummy']['includes'] == False
644 
646  if 'GaudiDummy' in cmt2cmake.cache:
647  del cmt2cmake.cache['GaudiDummy']
648 
649  requirements = '''
650 package GaudiDummy
651 version v1r0
652 
653 use JustHeaders v*
654 use JustHeaders v* Hat
655 
656 library Dummy *.cpp
657 apply_pattern linker_library library=Dummy
658  '''
659  pkg = PackWrap("GaudiDummy", requirements, files={'Dummy':{}})
660 
661  cmakelists = pkg.generate()
662  print cmakelists
663 
664  calls = getCalls("gaudi_add_library", cmakelists)
665  assert len(calls) == 1, "gaudi_add_library wrong count %d" % len(calls)
666 
667  l = calls[0].strip().split()
668  assert l[0] == 'Dummy'
669  assert 'INCLUDE_DIRS' in l
670  links = set(l[l.index('INCLUDE_DIRS')+1:])
671  assert links == set(['JustHeaders', 'Hat/JustHeaders'])
672 
674  if 'GaudiDummy' in cmt2cmake.cache:
675  del cmt2cmake.cache['GaudiDummy']
676 
677  requirements = '''
678 package GaudiDummy
679 version v1r0
680 
681 apply_pattern install_more_includes more=Dummy
682  '''
683  PackWrap("GaudiDummy", requirements, files={'Dummy':{}})
684 
685  assert cmt2cmake.cache['GaudiDummy']['includes'] == True
686  assert not cmt2cmake.cache['GaudiDummy']['libraries']
687 
689  requirements = '''
690 package Test
691 version v1r0
692 
693 library Lib1 *.cpp
694 apply_pattern component_library library=Lib1
695  '''
696  pkg = PackWrap("Test", requirements, files={})
697 
698  cmakelists = pkg.generate()
699  print cmakelists
700 
701  cmakefile = os.path.join(pkg.path, 'CMakeLists.txt')
702  pkg.process()
703  assert os.path.exists(cmakefile)
704  assert open(cmakefile).read() == cmakelists
705 
707  requirements = '''
708 package Test
709 version v1r0
710 
711 library Lib1 *.cpp
712 apply_pattern component_library library=Lib1
713  '''
714  pkg = PackWrap("Test", requirements, files={'CMakeLists.txt': 'dummy data'})
715 
716  cmakefile = os.path.join(pkg.path, 'CMakeLists.txt')
717  pkg.process()
718  # FIXME: we should test the warning
719  assert open(cmakefile).read() == 'dummy data'
720 
721 
723  # some corner cases
724  # FIXME: we should actually test the warning messages
725  requirements = '''
726 package Test
727 version v1r0
728 
729 apply_pattern god_headers files=../xml/*.xml
730  '''
731  pkg = PackWrap("Test", requirements, files={})
732 
733  cmakelists = pkg.generate()
734  print cmakelists
735 
736  calls = getCalls("include", cmakelists)
737  assert calls
738  l = calls[0].strip()
739  assert l == 'GaudiObjDesc'
740 
741  calls = getCalls("god_build_headers", cmakelists)
742  assert len(calls) == 1, "god_build_headers wrong count %d" % len(calls)
743 
744  l = calls[0].strip()
745  assert l == 'xml/*.xml'
746 
748  requirements = '''
749 package Test
750 version v1r0
751 
752 apply_pattern god_dictionary files=../xml/*.xml
753  '''
754  pkg = PackWrap("Test", requirements, files={})
755 
756  cmakelists = pkg.generate()
757  print cmakelists
758 
759  calls = getCalls("include", cmakelists)
760  assert calls
761  l = calls[0].strip()
762  assert l == 'GaudiObjDesc'
763 
764  calls = getCalls("god_build_dictionary", cmakelists)
765  assert len(calls) == 1, "god_build_dictionary wrong count %d" % len(calls)
766 
767  l = calls[0].strip()
768  assert l == 'xml/*.xml'
769 
771  requirements = '''
772 package Test
773 version v1r0
774 
775 use Boost v* LCG_Interfaces
776 
777 apply_pattern god_headers files=../xml/*.xml
778 apply_pattern god_dictionary files=../xml/*.xml
779  '''
780  pkg = PackWrap("Test", requirements, files={})
781 
782  cmakelists = pkg.generate()
783  print cmakelists
784 
785  calls = getCalls("include", cmakelists)
786  assert calls
787  l = calls[0].strip()
788  assert l == 'GaudiObjDesc'
789 
790  calls = getCalls("god_build_headers", cmakelists)
791  assert len(calls) == 1, "god_build_headers wrong count %d" % len(calls)
792 
793  calls = getCalls("god_build_dictionary", cmakelists)
794  assert len(calls) == 1, "god_build_dictionary wrong count %d" % len(calls)
795 
796  l = calls[0].strip().split()
797  assert l[0] == 'xml/*.xml'
798  assert 'LINK_LIBRARIES' in l
799  assert l[l.index('LINK_LIBRARIES')+1] == 'Boost'
800  assert 'INCLUDE_DIRS' in l
801  assert l[l.index('INCLUDE_DIRS')+1] == 'Boost'
802 
804  requirements = '''
805 package Test
806 version v1r0
807 
808 use Boost v* LCG_Interfaces
809 
810 library Lib *.cpp
811 apply_pattern linker_library library=Lib
812 
813 apply_pattern god_headers files=../xml/*.xml
814 apply_pattern god_dictionary files=../xml/*.xml
815  '''
816  pkg = PackWrap("Test", requirements, files={})
817 
818  cmakelists = pkg.generate()
819  print cmakelists
820 
821  calls = getCalls("include", cmakelists)
822  assert calls
823  l = calls[0].strip()
824  assert l == 'GaudiObjDesc'
825 
826  calls = getCalls("god_build_headers", cmakelists)
827  assert len(calls) == 1, "god_build_headers wrong count %d" % len(calls)
828 
829  calls = getCalls("gaudi_add_library", cmakelists)
830  assert len(calls) == 1, "gaudi_add_library wrong count %d" % len(calls)
831 
832  calls = getCalls("god_build_dictionary", cmakelists)
833  assert len(calls) == 1, "god_build_dictionary wrong count %d" % len(calls)
834 
835  l = calls[0].strip().split()
836  assert l[0] == 'xml/*.xml'
837  assert 'LINK_LIBRARIES' in l
838  i = l.index('LINK_LIBRARIES')+1
839  assert l[i:i+2] == ['Boost', 'Lib']
840  assert 'INCLUDE_DIRS' in l
841  assert l[l.index('INCLUDE_DIRS')+1] == 'Boost'
842 
843  hdr = cmakelists.find('god_build_headers')
844  lib = cmakelists.find('gaudi_add_library')
845  dct = cmakelists.find('god_build_dictionary')
846  assert hdr < lib and lib < dct, "wrong order of calls"
847 
849  requirements = '''
850 package Test
851 version v1r0
852 
853 apply_pattern god_headers files=../xml/*.xml
854 macro TestObj2Doth_GODflags " -s ../Test/ "
855  '''
856  pkg = PackWrap("Test", requirements, files={})
857 
858  cmakelists = pkg.generate()
859  print cmakelists
860 
861  calls = getCalls("include", cmakelists)
862  assert calls
863  l = calls[0].strip()
864  assert l == 'GaudiObjDesc'
865 
866  calls = getCalls("god_build_headers", cmakelists)
867  assert len(calls) == 1, "god_build_headers wrong count %d" % len(calls)
868 
869  l = calls[0].strip().split()
870  assert l[0] == 'xml/*.xml'
871  assert 'DESTINATION' in l
872  assert l[l.index('DESTINATION')+1] == 'Test'
873 
875  requirements = '''
876 package Test
877 version v1r0
878 
879 apply_pattern god_headers files=../xml/*.xml
880 macro TestObj2Doth_GODflags " -s ../src/ "
881  '''
882  pkg = PackWrap("Test", requirements, files={})
883 
884  cmakelists = pkg.generate()
885  print cmakelists
886 
887  calls = getCalls("include", cmakelists)
888  assert calls
889  l = calls[0].strip()
890  assert l == 'GaudiObjDesc'
891 
892  calls = getCalls("god_build_headers", cmakelists)
893  assert len(calls) == 1, "god_build_headers wrong count %d" % len(calls)
894 
895  l = calls[0].strip().split()
896  assert l[0] == 'xml/*.xml'
897  assert 'PRIVATE' in l
898  assert 'DESTINTAION' not in l
899 
901  requirements = '''
902 package Test
903 version v1r0
904 
905 document customdict TestCustomDict ../dict/TestCustomDict.h
906 
907 apply_pattern god_dictionary files=../xml/*.xml
908  '''
909  pkg = PackWrap("Test", requirements, files={})
910 
911  cmakelists = pkg.generate()
912  print cmakelists
913 
914  calls = getCalls("include", cmakelists)
915  assert calls
916  l = calls[0].strip()
917  assert l == 'GaudiObjDesc'
918 
919  calls = getCalls("god_build_dictionary", cmakelists)
920  assert len(calls) == 1, "god_build_dictionary wrong count %d" % len(calls)
921 
922  l = calls[0].strip().split()
923  assert l == ['xml/*.xml', 'EXTEND', 'dict/TestCustomDict.h']
924 
926  requirements = '''
927 package Test
928 version v1r0
929 
930 use ROOT v* LCG_Interfaces
931 
932 apply_pattern reflex_dictionary \\
933  dictionary=Test \\
934  headerfiles=$(TESTROOT)/dict/TestDict.h \\
935  selectionfile=$(TESTROOT)/dict/TestDict.xml
936 
937 apply_pattern reflex_dictionary \\
938  dictionary=Test2 \\
939  headerfiles=$(TESTROOT)/dict/Test2Dict.h \\
940  selectionfile=$(TESTROOT)/dict/Test2Dict.xml \\
941  options="-DOPTION"
942  '''
943  pkg = PackWrap("Test", requirements, files={})
944 
945  cmakelists = pkg.generate()
946  print cmakelists
947 
948  calls = getCalls("gaudi_add_dictionary", cmakelists)
949  assert len(calls) == 2, "gaudi_add_dictionary wrong count %d" % len(calls)
950 
951  l = calls[0].strip().split()
952  assert l[0:3] == ['Test', 'dict/TestDict.h', 'dict/TestDict.xml']
953  assert 'LINK_LIBRARIES' in l
954  assert l[l.index('LINK_LIBRARIES')+1] == 'ROOT'
955  assert 'INCLUDE_DIRS' in l
956  assert l[l.index('INCLUDE_DIRS')+1] == 'ROOT'
957 
958  l = calls[1].strip().split()
959  assert l[0:3] == ['Test2', 'dict/Test2Dict.h', 'dict/Test2Dict.xml']
960  assert 'LINK_LIBRARIES' in l
961  assert l[l.index('LINK_LIBRARIES')+1] == 'ROOT'
962  assert 'INCLUDE_DIRS' in l
963  assert l[l.index('INCLUDE_DIRS')+1] == 'ROOT'
964  assert 'OPTIONS' in l
965  assert l[l.index('OPTIONS')+1:] == ['"-DOPTION"']
966 
967 
969  requirements = '''
970 package Test
971 version v1r0
972 
973 use ROOT v* LCG_Interfaces
974 
975 library Test *.ccp
976 apply_pattern component_library library=Test
977 
978 apply_pattern reflex_dictionary \\
979  dictionary=Test \\
980  headerfiles=$(TESTROOT)/dict/TestDict.h \\
981  selectionfile=$(TESTROOT)/dict/TestDict.xml
982  '''
983  pkg = PackWrap("Test", requirements, files={})
984 
985  cmakelists = pkg.generate()
986  print cmakelists
987 
988  calls = getCalls("gaudi_add_module", cmakelists)
989  assert len(calls) == 1, "gaudi_add_module wrong count %d" % len(calls)
990 
991  l = calls[0].strip().split()
992  assert l[0] == 'Test'
993 
994  calls = getCalls("gaudi_add_dictionary", cmakelists)
995  assert len(calls) == 1, "gaudi_add_dictionary wrong count %d" % len(calls)
996 
997  l = calls[0].strip().split()
998  assert l[0:3] == ['Test', 'dict/TestDict.h', 'dict/TestDict.xml']
999 
1001  requirements = '''
1002 package Test
1003 version v1r0
1004 
1005 use ROOT v* LCG_Interfaces
1006 use COOL v* LCG_Interfaces -no_auto_imports
1007 use CORAL v* LCG_Interfaces -no_auto_imports
1008 use Boost v* LCG_Interfaces -no_auto_imports
1009 
1010 library Test *.ccp
1011 apply_pattern component_library library=Test
1012 
1013 apply_pattern reflex_dictionary \\
1014  dictionary=Test \\
1015  headerfiles=$(TESTROOT)/dict/TestDict.h \\
1016  selectionfile=$(TESTROOT)/dict/TestDict.xml \\
1017  imports="COOL -import=CORAL -import=Boost"
1018  '''
1019  pkg = PackWrap("Test", requirements, files={})
1020 
1021  cmakelists = pkg.generate()
1022  print cmakelists
1023 
1024  calls = getCalls("gaudi_add_module", cmakelists)
1025  assert len(calls) == 1, "gaudi_add_module wrong count %d" % len(calls)
1026 
1027  l = calls[0].strip().split()
1028  assert l[0] == 'Test'
1029 
1030  calls = getCalls("gaudi_add_dictionary", cmakelists)
1031  assert len(calls) == 1, "gaudi_add_dictionary wrong count %d" % len(calls)
1032 
1033  l = calls[0].strip().split()
1034  assert l[0:3] == ['Test', 'dict/TestDict.h', 'dict/TestDict.xml']
1035  assert 'INCLUDE_DIRS' in l
1036  i = l.index('INCLUDE_DIRS')
1037  assert 'LINK_LIBRARIES' in l
1038  j = l.index('LINK_LIBRARIES')
1039  assert set(l[i+1:j]) == set(['ROOT', 'COOL', 'CORAL', 'Boost'])
1040  assert set(l[j+1:]) == set(['ROOT', 'COOL', 'CORAL', 'Boost'])
1041 
1043  requirements = '''
1044 package Test
1045 version v1r0
1046 
1047 use ROOT v* LCG_Interfaces
1048 use Boost v* LCG_Interfaces
1049 
1050 macro_append ROOT_linkopts " -lMathCore"
1051 macro_append Boost_linkopts " $(Boost_linkopts_filesystem)"
1052 
1053  '''
1054  pkg = PackWrap("Test", requirements, files={})
1055 
1056  cmakelists = pkg.generate()
1057  print cmakelists
1058 
1059  calls = getCalls("find_package", cmakelists)
1060  assert len(calls) == 2, "find_package wrong count %d" % len(calls)
1061 
1062  l = calls[0].strip().split()
1063  assert l == ['Boost', 'COMPONENTS', 'filesystem'] # find_package are sorted
1064 
1065  l = calls[1].strip().split()
1066  assert l == ['ROOT', 'COMPONENTS', 'MathCore'] # find_package are sorted
1067 
1069  requirements = '''
1070 package Test
1071 version v1r0
1072 
1073 application MyApp1 ../src/app1/*.cpp
1074 
1075 application MyApp2 -group=tests ../src/app2/*.cpp
1076 
1077 application MyApp3 -check ../src/app3/*.cpp
1078 
1079 application MyApp4 ../tests/src/app4.cpp
1080 
1081 application MyTestApp app5a.cpp app5b.cpp
1082  '''
1083  pkg = PackWrap("Test", requirements, files={})
1084 
1085  cmakelists = pkg.generate()
1086  print cmakelists
1087 
1088  calls = getCalls("gaudi_add_executable", cmakelists)
1089  assert len(calls) == 5, "gaudi_add_executable wrong count %d" % len(calls)
1090 
1091  l = calls[0].strip().split()
1092  assert l[0] == 'MyApp1'
1093  assert l[1:] == ['src/app1/*.cpp']
1094 
1095  l = calls[1].strip().split()
1096  assert l[0] == 'MyApp2'
1097  assert l[1:] == ['src/app2/*.cpp']
1098 
1099  l = calls[2].strip().split()
1100  assert l[0] == 'MyApp3'
1101  assert l[1:] == ['src/app3/*.cpp']
1102 
1103  l = calls[3].strip().split()
1104  assert l[0] == 'MyApp4'
1105  assert l[1:] == ['tests/src/app4.cpp']
1106 
1107  l = calls[4].strip().split()
1108  assert l[0] == 'MyTestApp'
1109  assert l[1:] == ['src/app5a.cpp', 'src/app5b.cpp']
1110 
1111  calls = getCalls("if", cmakelists)
1112  assert calls == ['GAUDI_BUILD_TESTS'] * 4
1113 
1115  requirements = '''
1116 package Test
1117 version v1r0
1118 
1119 use pygraphics v* LCG_Interfaces -no_auto_imports
1120 use Qt v* LCG_Interfaces -no_auto_imports
1121 
1122 apply_pattern install_python_modules
1123 
1124 apply_pattern PyQtResource qrc_files=../qt_resources/*.qrc outputdir=../python/Test/QtApp
1125 apply_pattern PyQtUIC ui_files=../qt_resources/*.ui outputdir=../python/Test/QtApp
1126 macro_append Test_python_dependencies " PyQtResource PyQtUIC "
1127  '''
1128  pkg = PackWrap("Test", requirements, files={})
1129 
1130  cmakelists = pkg.generate()
1131  print cmakelists
1132 
1133  calls = getCalls("gen_pyqt_resource", cmakelists)
1134  assert len(calls) == 1, "gen_pyqt_resource wrong count %d" % len(calls)
1135  l = calls[0].strip().split()
1136  assert l == ['Test.QtApp.Resources', 'Test/QtApp', 'qt_resources/*.qrc']
1137 
1138  calls = getCalls("gen_pyqt_uic", cmakelists)
1139  assert len(calls) == 1, "gen_pyqt_uic wrong count %d" % len(calls)
1140  l = calls[0].strip().split()
1141  assert l == ['Test.QtApp.UI', 'Test/QtApp', 'qt_resources/*.ui']
1142 
1143 
1145  requirements = '''
1146 package Test
1147 version v1r0
1148 
1149 library Test *.ccp
1150 
1151 macro TEST "value" \\
1152 
1153 apply_pattern component_library library=Test
1154  '''
1155  pkg = PackWrap("Test", requirements, files={})
1156 
1157  cmakelists = pkg.generate()
1158  print cmakelists
1159 
1160  calls = getCalls("gaudi_add_module", cmakelists)
1161  assert len(calls) == 1, "gaudi_add_module wrong count %d" % len(calls)
1162 
1163 
1165  requirements = '''
1166 package Test
1167 version v1r0
1168 
1169 use RELAX v* LCG_Interfaces
1170 
1171 copy_relax_rootmap dict=CLHEP
1172 copy_relax_rootmap dict=HepMC
1173 copy_relax_rootmap dict=STL
1174 copy_relax_rootmap dict=Math
1175  '''
1176  pkg = PackWrap("Test", requirements, files={})
1177 
1178  cmakelists = pkg.generate()
1179  print cmakelists
1180 
1181  calls = getCalls("find_package", cmakelists)
1182  assert len(calls) == 1, "find_package wrong count %d" % len(calls)
1183 
1184  l = calls[0].strip().split()
1185  assert l == ['RELAX', 'REQUIRED', 'COMPONENTS', 'CLHEP', 'HepMC', 'STL', 'Math']
1186 
1187  calls = getCalls("add_custom_target", cmakelists)
1188  assert len(calls) == 1, "add_custom_target wrong count %d" % len(calls)
1189 
1190  l = calls[0].strip().split()
1191  assert l == ['RelaxRootmap', 'ALL', 'DEPENDS', '${rootmapfile}']
1192 
1193  # No need to check every call, just that the sequence is there
1194 
1195 
1197  proj_cmt = '''
1198 project LHCB
1199 
1200 use GAUDI GAUDI_v23r4
1201 use DBASE
1202 use PARAM
1203 
1204 build_strategy with_installarea
1205 setup_strategy root
1206  '''
1207  files = {"LHCbSys": {"cmt": {"requirements": "version v35r2"}}}
1208  proj = ProjWrap("LHCb", proj_cmt, files=files)
1209 
1210  cmakelists = proj.generate()
1211  print cmakelists
1212 
1213  calls = getCalls("find_package", cmakelists)
1214  assert len(calls) == 1, "find_package wrong count %d" % len(calls)
1215 
1216  l = calls[0].strip().split()
1217  assert l == ['GaudiProject']
1218 
1219  calls = getCalls("gaudi_project", cmakelists)
1220  assert len(calls) == 1, "gaudi_project wrong count %d" % len(calls)
1221 
1222  l = calls[0].strip().split()
1223  assert l == ['LHCb', 'v35r2', 'USE', 'Gaudi', 'v23r4']
1224 
1226  proj_cmt = '''
1227 project TestProject
1228  '''
1229  files = {"TestProjectSys": {"cmt": {"requirements": "version v1r0"}},
1230  "Package1": {"cmt": {"requirements":
1231 '''
1232 version v1r0
1233 
1234 use DtPkg v7r* Another
1235 use DataPack v*
1236 use SpecialThing *
1237 '''}},
1238  }
1239  proj = ProjWrap("TestProject", proj_cmt, files=files)
1240 
1241  cmakelists = proj.generate()
1242  print cmakelists
1243 
1244  calls = getCalls("find_package", cmakelists)
1245  assert len(calls) == 1, "find_package wrong count %d" % len(calls)
1246 
1247  l = calls[0].strip().split()
1248  assert l == ['GaudiProject']
1249 
1250  calls = getCalls("gaudi_project", cmakelists)
1251  assert len(calls) == 1, "gaudi_project wrong count %d" % len(calls)
1252 
1253  l = calls[0].strip().split()
1254  assert l == ['TestProject', 'v1r0', 'DATA',
1255  'Another/DtPkg', 'VERSION', 'v7r*',
1256  'DataPack',
1257  'SpecialThing']
1258 
1260  proj_cmt = '''
1261 project TestProject
1262  '''
1263  files = {"TestProjectSys": {"cmt": {"requirements": "version v1r0"}},
1264  "Package1": {"cmt": {"requirements":
1265 '''
1266 version v1r0
1267 
1268 use DataPack v*
1269 '''}},
1270  "Package2": {"cmt": {"requirements":
1271 '''
1272 version v1r0
1273 
1274 use SpecialThing *
1275 '''}},
1276  }
1277  proj = ProjWrap("TestProject", proj_cmt, files=files)
1278 
1279  cmakelists = proj.generate()
1280  print cmakelists
1281 
1282  calls = getCalls("find_package", cmakelists)
1283  assert len(calls) == 1, "find_package wrong count %d" % len(calls)
1284 
1285  l = calls[0].strip().split()
1286  assert l == ['GaudiProject']
1287 
1288  calls = getCalls("gaudi_project", cmakelists)
1289  assert len(calls) == 1, "gaudi_project wrong count %d" % len(calls)
1290 
1291  l = calls[0].strip().split()
1292  assert l == ['TestProject', 'v1r0', 'DATA',
1293  'DataPack',
1294  'SpecialThing']
1295 
1297  proj_cmt = '''
1298 project TestProject
1299  '''
1300  files = {"TestProjectSys": {"cmt": {"requirements": "version v1r0"}},
1301  "Package1": {"cmt": {"requirements":
1302 '''
1303 version v1r0
1304 
1305 use DataPack v7r*
1306 '''}},
1307  "Package2": {"cmt": {"requirements":
1308 '''
1309 version v1r0
1310 
1311 use DataPack v*
1312 use DtPkg v1r0 Another
1313 '''}},
1314  }
1315  proj = ProjWrap("TestProject", proj_cmt, files=files)
1316 
1317  cmakelists = proj.generate()
1318  print cmakelists
1319 
1320  calls = getCalls("find_package", cmakelists)
1321  assert len(calls) == 1, "find_package wrong count %d" % len(calls)
1322 
1323  l = calls[0].strip().split()
1324  assert l == ['GaudiProject']
1325 
1326  calls = getCalls("gaudi_project", cmakelists)
1327  assert len(calls) == 1, "gaudi_project wrong count %d" % len(calls)
1328 
1329  l = calls[0].strip().split()
1330  assert l == ['TestProject', 'v1r0', 'DATA',
1331  'Another/DtPkg', 'VERSION', 'v1r0',
1332  'DataPack', 'VERSION', 'v7r*']
1333 
1335  # check the case of LCGCMT in the project.cmt
1336  proj_cmt = '''
1337 project TestProjectHT
1338 
1339 use LCGCMT LCGCMT_64a
1340  '''
1341  files = {"TestProjectHTSys": {"cmt": {"requirements": "version v1r0"}}}
1342  proj = ProjWrap("TestProjectHT", proj_cmt, files=files)
1343 
1344  k = repr(('TestProjectHT', 'v1r0'))
1345  assert k not in cmt2cmake.cache
1346 
1347  toolchain = proj.generateToolchain()
1348  print toolchain
1349 
1350  calls = getCalls("set", toolchain)
1351  assert len(calls) == 2, "set wrong count %d" % len(calls)
1352 
1353  l = calls[0].strip().split()
1354  assert l == ['heptools_version', '64a']
1355 
1356  assert k in cmt2cmake.cache
1357  assert cmt2cmake.cache[k] == {'heptools': '64a'}
1358 
1360  # check the case of LCGCMT in a used project (already in the cache)
1361  proj_cmt = '''
1362 project TestProjectHT
1363 
1364 use BASEPROJECT BASEPROJECT_v1r0
1365  '''
1366  files = {"TestProjectHTSys": {"cmt": {"requirements": "version v2r0"}}}
1367  proj = ProjWrap("TestProjectHT", proj_cmt, files=files)
1368 
1369  k = repr(('TestProjectHT', 'v2r0'))
1370  assert k not in cmt2cmake.cache
1371 
1372  toolchain = proj.generateToolchain()
1373  print toolchain
1374 
1375  calls = getCalls("set", toolchain)
1376  assert len(calls) == 2, "set wrong count %d" % len(calls)
1377 
1378  l = calls[0].strip().split()
1379  assert l == ['heptools_version', '65']
1380 
1381  assert k in cmt2cmake.cache
1382  assert cmt2cmake.cache[k] == {'heptools': '65'}
1383 
1385  # check the case of LCGCMT not declared, but in the cache for us
1386  proj_cmt = '''
1387 project TestProjectHT
1388  '''
1389  files = {"TestProjectHTSys": {"cmt": {"requirements": "version v3r0"}}}
1390  proj = ProjWrap("TestProjectHT", proj_cmt, files=files)
1391 
1392  k = repr(('TestProjectHT', 'v3r0'))
1393  assert k in cmt2cmake.cache
1394 
1395  toolchain = proj.generateToolchain()
1396  print toolchain
1397 
1398  calls = getCalls("set", toolchain)
1399  assert len(calls) == 2, "set wrong count %d" % len(calls)
1400 
1401  l = calls[0].strip().split()
1402  assert l == ['heptools_version', '23']
1403 
1404  assert k in cmt2cmake.cache
1405  assert cmt2cmake.cache[k] == {'heptools': '23'}
1406 
1408  # check the case of LCGCMT not found
1409  proj_cmt = '''
1410 project TestProjectHT
1411  '''
1412  files = {"TestProjectHTSys": {"cmt": {"requirements": "version v4r0"}}}
1413  proj = ProjWrap("TestProjectHT", proj_cmt, files=files)
1414 
1415  k = repr(('TestProjectHT', 'v4r0'))
1416  assert k not in cmt2cmake.cache
1417 
1418  toolchain = proj.generateToolchain()
1419  assert toolchain is None
1420 
1421  assert k not in cmt2cmake.cache
1422 
1423 
1424 
1425 from nose.core import main
1426 main()

Generated at Wed Nov 28 2012 12:17:09 for Gaudi Framework, version v23r5 by Doxygen version 1.8.2 written by Dimitri van Heesch, © 1997-2004