00001 from tempfile import mkdtemp
00002 import shutil
00003 import os
00004 import re
00005
00006
00007 os.environ['CMT2CMAKECACHE'] = 'test.cache'
00008
00009 import cmt2cmake
00010
00011
00012 cmt2cmake.known_subdirs['GaudiKernel'] = {'libraries': ['GaudiKernel'],
00013 'includes': False}
00014 cmt2cmake.known_subdirs['GaudiUtils'] = {'libraries': ['GaudiUtilsLib'],
00015 'includes': False}
00016 cmt2cmake.known_subdirs['LHCbKernel'] = {'libraries': ['LHCbKernel'],
00017 'includes': False}
00018 cmt2cmake.known_subdirs['SomeSubdir'] = {'libraries': ['SubdirLib'],
00019 'includes': False}
00020 cmt2cmake.known_subdirs['JustHeaders'] = {'libraries': [],
00021 'includes': True}
00022
00023
00024
00025
00026
00027
00028 def buildDir(files, rootdir=os.curdir):
00029 '''
00030 Create a directory structure from the content of files.
00031
00032 @param files: a dictionary or list of pairs mapping a filename to the content
00033 if the content is a dictionary, recurse
00034 @param rootdir: base directory
00035 '''
00036 if type(files) is dict:
00037 files = files.items()
00038
00039
00040 if not os.path.exists(rootdir):
00041 os.makedirs(rootdir)
00042
00043
00044 for filename, data in files:
00045 filename = os.path.join(rootdir, filename)
00046 if type(data) is dict:
00047 buildDir(data, filename)
00048 else:
00049 d = os.path.dirname(filename)
00050 if not os.path.exists(d):
00051 os.makedirs(d)
00052 f = open(filename, "w")
00053 if data:
00054 f.write(data)
00055 f.close()
00056
00057 class PackWrap(cmt2cmake.Package):
00058 """
00059 Helper class to test the Package.
00060 """
00061 def __init__(self, name, requirements, files=None):
00062 if not files:
00063 files = {}
00064 files["cmt/requirements"] = requirements
00065
00066 self.tmpdir = mkdtemp()
00067 rootdir = os.path.join(self.tmpdir, name)
00068 buildDir(files, rootdir)
00069
00070 super(PackWrap, self).__init__(rootdir)
00071
00072 def __del__(self):
00073 shutil.rmtree(self.tmpdir, ignore_errors=False)
00074
00075 def getCalls(function, cmakelists):
00076 '''
00077 extracts the arguments to all the calls to a cmake function
00078 '''
00079 exp = re.compile(r'\b{}\s*\(([^)]*)\)'.format(function), flags=re.MULTILINE)
00080 return [m.group(1) for m in exp.finditer(cmakelists)]
00081
00082
00083
00084
00085
00086 def test_not_a_package():
00087 d = mkdtemp()
00088 buildDir({'NoPackage': {'a_file.txt': None}}, d)
00089 try:
00090 cmt2cmake.Package(os.path.join(d, 'NoPackage'))
00091 assert False, 'bad package not recognized'
00092 except ValueError:
00093 pass
00094 finally:
00095 shutil.rmtree(d)
00096
00097
00098 def test_pack_header():
00099 requirements = """
00100 package ThisIsAPackage
00101 version v123r456
00102
00103 branches cmt branches are ignored
00104 macro test parsing of \\
00105 multi line
00106 """
00107 pkg = PackWrap("ThisIsAPackage", requirements)
00108
00109 cmakelists = pkg.generate()
00110 print cmakelists
00111
00112 calls = getCalls("gaudi_subdir", cmakelists)
00113 assert calls, "gaudi_subdir not called"
00114 assert len(calls) == 1, "gaudi_subdir called more than once"
00115
00116 args = calls[0].strip().split()
00117 assert args == ["ThisIsAPackage", "v123r456"]
00118
00119 def test_pack_deps():
00120 requirements = """
00121 package Test
00122 version v1r0
00123
00124 # series of uses
00125 use GaudiKernel v*
00126 use GaudiAlg *
00127 use GaudiPolicy *
00128 use GaudiCoreSvc v* # comment
00129 use GaudiUtils * -no_auto_imports
00130
00131 use LHCbKernel v* Kernel
00132 """
00133 pkg = PackWrap("Test", requirements)
00134
00135 cmakelists = pkg.generate()
00136 print cmakelists
00137
00138 calls = getCalls("gaudi_depends_on_subdirs", cmakelists)
00139 assert calls, "gaudi_depends_on_subdirs not called"
00140
00141 args = set()
00142 for call in calls:
00143 args.update(call.strip().split())
00144 expected = set(['GaudiKernel', 'GaudiAlg', 'GaudiCoreSvc',
00145 'GaudiUtils', 'Kernel/LHCbKernel'])
00146 assert args == expected
00147
00148 def test_pack_no_deps():
00149 requirements = """
00150 package Test
00151 version v1r0
00152
00153 # no uses
00154 """
00155 pkg = PackWrap("Test", requirements)
00156
00157 cmakelists = pkg.generate()
00158 print cmakelists
00159
00160 calls = getCalls("gaudi_depends_on_subdirs", cmakelists)
00161 assert not calls, "gaudi_depends_on_subdirs called"
00162
00163 def test_pack_ext_deps():
00164 requirements = """
00165 package Test
00166 version v1r0
00167
00168 # series of uses
00169 use Boost v* LCG_Interfaces
00170 use Python v* LCG_Interfaces
00171 use XercesC v* LCG_Interfaces -no_auto_imports
00172 """
00173 pkg = PackWrap("Test", requirements)
00174
00175 cmakelists = pkg.generate()
00176 print cmakelists
00177
00178 expected = set(['Boost', 'XercesC'])
00179
00180 calls = getCalls("find_package", cmakelists)
00181 assert calls, "find_pacakge not called"
00182 assert len(calls) == len(expected)
00183
00184 args = set()
00185 for call in calls:
00186 args.add(call.strip().split()[0])
00187 print args
00188 assert args == expected
00189
00190 def test_install_headers():
00191 requirements = '''
00192 #============================================================================
00193 package Tell1Kernel
00194 version v1r12p1
00195
00196 # Structure, i.e. directories to process.
00197 #============================================================================
00198 branches cmt doc Tell1Kernel
00199
00200 # Used packages
00201 #============================================================================
00202 use GaudiPolicy v*
00203
00204 apply_pattern install_more_includes more=Tell1Kernel
00205 '''
00206 pkg = PackWrap("Tell1Kernel", requirements, files={"Tell1Kernel/hdr.h": None})
00207
00208 cmakelists = pkg.generate()
00209 print cmakelists
00210
00211 calls = getCalls("gaudi_install_headers", cmakelists)
00212 assert calls
00213
00214 args = set()
00215 for call in calls:
00216 args.update(call.strip().split())
00217 expected = set(['Tell1Kernel'])
00218 assert args == expected
00219
00220 def test_install_python():
00221 requirements = '''
00222 package Test
00223 version v1r0
00224
00225 apply_pattern install_python_modules
00226 '''
00227 pkg = PackWrap("Test", requirements, files={"python/Test/__init__.py": None})
00228
00229 cmakelists = pkg.generate()
00230 print cmakelists
00231
00232 calls = getCalls("gaudi_install_python_modules", cmakelists)
00233 assert calls
00234
00235 def test_install_python2():
00236 requirements = '''
00237 package Test
00238 version v1r0
00239
00240 macro TestConfUserModules "Test.CustomModule1 Test.CustomModule2"
00241
00242 apply_pattern install_python_modules
00243 '''
00244 pkg = PackWrap("Test", requirements, files={"python/Test/__init__.py": None})
00245
00246 cmakelists = pkg.generate()
00247 print cmakelists
00248
00249 calls = getCalls("gaudi_install_python_modules", cmakelists)
00250 assert calls
00251
00252 calls = getCalls("set_property", cmakelists)
00253 assert calls
00254 args = calls[0].strip().split()
00255 assert args == ['DIRECTORY', 'PROPERTY', 'CONFIGURABLE_USER_MODULES', 'Test.CustomModule1', 'Test.CustomModule2'], args
00256
00257 def test_install_scripts():
00258 requirements = '''
00259 package Test
00260 version v1r0
00261
00262 apply_pattern install_scripts
00263 '''
00264 pkg = PackWrap("Test", requirements, files={"scripts/someScript": None})
00265
00266 cmakelists = pkg.generate()
00267 print cmakelists
00268
00269 calls = getCalls("gaudi_install_scripts", cmakelists)
00270 assert calls
00271
00272 def test_qmtest():
00273 requirements = '''
00274 package Test
00275 version v1r0
00276
00277 apply_pattern QMTest
00278 '''
00279 pkg = PackWrap("Test", requirements, files={"tests/qmtest/test.qms/a_test.qmt": None})
00280
00281 cmakelists = pkg.generate()
00282 print cmakelists
00283
00284 calls = getCalls("gaudi_add_test", cmakelists)
00285 assert calls, "no test added"
00286 assert len(calls) == 1, "gaudi_add_test called more than once"
00287
00288 args = calls[0].strip().split()
00289 assert args == ["QMTest", "QMTEST"]
00290
00291 def test_libraries():
00292 requirements = '''
00293 package Test
00294 version v1r0
00295
00296 library TestLib lib/*.cpp
00297 apply_pattern linker_library library=TestLib
00298
00299 library TestComp component/*.cpp
00300 apply_pattern component_library library=TestComp
00301
00302 library TestTestLib test/lib/*.cpp -group=tests
00303 apply_pattern linker_library library=TestTestLib
00304
00305 library TestTestComp test/component/*.cpp -group=tests
00306 apply_pattern component_library library=TestTestComp
00307
00308 apply_pattern install_more_includes more=TestIncludes
00309 '''
00310 pkg = PackWrap("Test", requirements, files={'TestIncludes': {}})
00311
00312 print 'components', pkg.component_libraries
00313 print 'linker', pkg.linker_libraries
00314 print 'libraries', pkg.libraries
00315
00316 assert pkg.component_libraries == set(['TestComp', 'TestTestComp'])
00317 assert pkg.linker_libraries == set(['TestLib', 'TestTestLib'])
00318 assert pkg.libraries
00319
00320 cmakelists = pkg.generate()
00321 print cmakelists
00322
00323 calls = getCalls("gaudi_add_library", cmakelists)
00324 assert len(calls) == 2, "gaudi_add_library wrong count %d" % len(calls)
00325 l = calls[0]
00326 assert re.match(r' *TestLib\b', l)
00327 assert re.search(r'\bPUBLIC_HEADERS +TestIncludes', l)
00328 l = calls[1]
00329 assert re.match(r' *TestTestLib\b', l)
00330 assert re.search(r'\bPUBLIC_HEADERS +TestIncludes', l)
00331 assert re.search(r'\bLINK_LIBRARIES +TestLib', l)
00332
00333 calls = getCalls("gaudi_add_module", cmakelists)
00334 assert len(calls) == 2, "gaudi_add_module wrong count %d" % len(calls)
00335
00336 l = calls[0]
00337 assert re.match(r' *TestComp\b', l)
00338 assert not re.search(r'\bPUBLIC_HEADERS\b', l)
00339 assert re.search(r'\bLINK_LIBRARIES +TestLib', l)
00340 l = calls[1]
00341 assert re.match(r' *TestTestComp\b', l)
00342 assert not re.search(r'\bPUBLIC_HEADERS', l)
00343 assert re.search(r'\bLINK_LIBRARIES +TestLib +TestTestLib', l)
00344
00345 def test_libraries_2():
00346 requirements = '''
00347 package Test
00348 version v1r0
00349
00350 use Boost v* LCG_Interfaces
00351 use XercesC v* LCG_Interfaces -no_auto_imports
00352
00353 library Lib1 lib1/*.cpp
00354 apply_pattern component_library library=Lib1
00355
00356 library Lib2 lib2/*.cpp -import=XercesC
00357 apply_pattern component_library library=Lib2
00358
00359 # We do not use variables
00360 library Lib3 lib3/*.cpp a_variable=some_value
00361 apply_pattern component_library library=Lib3
00362 '''
00363 pkg = PackWrap("Test", requirements, files={})
00364
00365 print 'components', pkg.component_libraries
00366 print 'libraries', pkg.libraries
00367
00368 assert pkg.component_libraries == set(['Lib1', 'Lib2', 'Lib3'])
00369 assert pkg.libraries
00370
00371 cmakelists = pkg.generate()
00372 print cmakelists
00373
00374 calls = getCalls("gaudi_add_module", cmakelists)
00375 assert len(calls) == 3, "gaudi_add_module wrong count %d" % len(calls)
00376
00377 l = calls[0]
00378 assert re.match(r' *Lib1\b', l)
00379 assert not re.search(r'\bPUBLIC_HEADERS\b', l)
00380 assert re.search(r'\bLINK_LIBRARIES +Boost', l)
00381 assert re.search(r'\bINCLUDE_DIRS +Boost', l)
00382 l = calls[1]
00383 assert re.match(r' *Lib2\b', l)
00384 assert not re.search(r'\bPUBLIC_HEADERS', l)
00385 assert re.search(r'\bLINK_LIBRARIES +Boost +XercesC', l)
00386 assert re.search(r'\bINCLUDE_DIRS +Boost +XercesC', l)
00387 l = calls[2]
00388 assert re.match(r' *Lib3\b', l)
00389 assert not re.search(r'\bPUBLIC_HEADERS', l)
00390 assert re.search(r'\bLINK_LIBRARIES +Boost', l)
00391 assert re.search(r'\bINCLUDE_DIRS +Boost', l)
00392
00393 def test_libraries_3():
00394
00395
00396 requirements = '''
00397 package Test
00398 version v1r0
00399
00400 library Lib1
00401 apply_pattern component_library library=Lib1
00402
00403 library Lib2 lib2/*.cpp
00404 apply_pattern linker_library library=Lib2
00405
00406 library Lib3 lib3/*.cpp
00407
00408 library Lib4 lib4/*.cpp
00409 apply_pattern linker_library library="Lib4"
00410
00411 '''
00412 pkg = PackWrap("Test", requirements, files={})
00413
00414 print 'components', pkg.component_libraries
00415 print 'linker', pkg.linker_libraries
00416 print 'libraries', pkg.libraries
00417
00418 assert pkg.component_libraries == set(['Lib1'])
00419 assert pkg.linker_libraries == set(['Lib2', 'Lib4'])
00420 assert len(pkg.libraries) == 4
00421
00422 cmakelists = pkg.generate()
00423 print cmakelists
00424
00425 calls = getCalls("gaudi_add_module", cmakelists)
00426 assert len(calls) == 1, "gaudi_add_module wrong count %d" % len(calls)
00427
00428 l = calls[0]
00429 assert re.match(r' *Lib1\b', l)
00430 assert not re.search(r'\bPUBLIC_HEADERS\b', l)
00431
00432 calls = getCalls("gaudi_add_library", cmakelists)
00433 assert len(calls) == 3, "gaudi_add_module wrong count %d" % len(calls)
00434
00435 l = calls[0]
00436 assert re.match(r' *Lib2\b', l)
00437 assert re.search(r'\bNO_PUBLIC_HEADERS', l)
00438
00439 l = calls[1]
00440 assert re.match(r' *Lib3\b', l)
00441 assert re.search(r'\bNO_PUBLIC_HEADERS', l)
00442
00443 l = calls[2]
00444 assert re.match(r' *Lib4\b', l)
00445 assert re.search(r'\bNO_PUBLIC_HEADERS', l)
00446
00447 def test_libraries_strip_src():
00448 requirements = '''
00449 package Test
00450 version v1r0
00451
00452 library TestLib ../src/subdir/*.cpp
00453 apply_pattern linker_library library=TestLib
00454 '''
00455 pkg = PackWrap("Test", requirements, files={'TestIncludes': {}})
00456
00457 assert pkg.linker_libraries == set(['TestLib'])
00458
00459 cmakelists = pkg.generate()
00460 print cmakelists
00461
00462 calls = getCalls("gaudi_add_library", cmakelists)
00463 assert len(calls) == 1, "gaudi_add_library wrong count %d" % len(calls)
00464 l = calls[0].strip().split()
00465 assert l[0] == 'TestLib'
00466 assert l[1] == 'subdir/*.cpp'
00467
00468 def test_subdir_links():
00469 requirements = '''
00470 package Test
00471 version v1r0
00472
00473 use Boost v* LCG_Interfaces
00474 use XercesC v* LCG_Interfaces -no_auto_imports
00475
00476 use GaudiKernel *
00477 use GaudiUtils * -no_auto_imports
00478
00479
00480 library Lib1 *.cpp
00481 apply_pattern component_library library=Lib1
00482
00483 library Lib2 *.cpp -import=XercesC
00484 apply_pattern component_library library=Lib2
00485
00486 library Lib3 *.cpp -import=GaudiUtils
00487 apply_pattern component_library library=Lib3
00488 '''
00489 pkg = PackWrap("Test", requirements, files={})
00490
00491 print 'components', pkg.component_libraries
00492 print 'linker', pkg.linker_libraries
00493 print 'libraries', pkg.libraries
00494
00495 assert pkg.component_libraries == set(['Lib1', 'Lib2', 'Lib3'])
00496 assert len(pkg.libraries) == 3
00497
00498 cmakelists = pkg.generate()
00499 print cmakelists
00500
00501 calls = getCalls("gaudi_add_module", cmakelists)
00502 assert len(calls) == 3, "gaudi_add_module wrong count %d" % len(calls)
00503
00504 l = calls[0].strip().split()
00505 assert l[0] == 'Lib1'
00506 links = set(l[l.index('LINK_LIBRARIES')+1:])
00507 assert links == set(['Boost', 'GaudiKernel'])
00508
00509 l = calls[1].strip().split()
00510 assert l[0] == 'Lib2'
00511 assert 'LINK_LIBRARIES' in l
00512 links = set(l[l.index('LINK_LIBRARIES')+1:])
00513 assert links == set(['Boost', 'GaudiKernel', 'XercesC'])
00514
00515 l = calls[2].strip().split()
00516 assert l[0] == 'Lib3'
00517 assert 'LINK_LIBRARIES' in l
00518 links = set(l[l.index('LINK_LIBRARIES')+1:])
00519 assert links == set(['Boost', 'GaudiKernel', 'GaudiUtilsLib'])
00520
00521 def test_subdir_links_hat():
00522 requirements = '''
00523 package Test
00524 version v1r0
00525
00526 use LHCbKernel * Kernel
00527 use SomeSubdir * Hat -no_auto_imports
00528
00529 library Lib1 *.cpp
00530 apply_pattern component_library library=Lib1
00531
00532 library Lib2 *.cpp -import=SomeSubdir
00533 apply_pattern component_library library=Lib2
00534 '''
00535 pkg = PackWrap("Test", requirements, files={})
00536
00537 print 'components', pkg.component_libraries
00538 print 'linker', pkg.linker_libraries
00539 print 'libraries', pkg.libraries
00540
00541 assert pkg.component_libraries == set(['Lib1', 'Lib2'])
00542 assert len(pkg.libraries) == 2
00543
00544 cmakelists = pkg.generate()
00545 print cmakelists
00546
00547 calls = getCalls("gaudi_add_module", cmakelists)
00548 assert len(calls) == 2, "gaudi_add_module wrong count %d" % len(calls)
00549
00550 l = calls[0].strip().split()
00551 assert l[0] == 'Lib1'
00552 links = set(l[l.index('LINK_LIBRARIES')+1:])
00553 assert links == set(['LHCbKernel'])
00554
00555 l = calls[1].strip().split()
00556 assert l[0] == 'Lib2'
00557 links = set(l[l.index('LINK_LIBRARIES')+1:])
00558 assert links == set(['LHCbKernel', 'SubdirLib'])
00559
00560 def test_subdir_links_missing():
00561 requirements = '''
00562 package Test
00563 version v1r0
00564
00565 use UnknownSubdir *
00566
00567 library Lib1 *.cpp
00568 apply_pattern component_library library=Lib1
00569 '''
00570 pkg = PackWrap("Test", requirements, files={})
00571
00572 assert pkg.component_libraries == set(['Lib1'])
00573 assert len(pkg.libraries) == 1
00574
00575 cmakelists = pkg.generate()
00576 print cmakelists
00577
00578 calls = getCalls("gaudi_add_module", cmakelists)
00579 assert len(calls) == 1, "gaudi_add_module wrong count %d" % len(calls)
00580
00581 l = calls[0].strip().split()
00582 assert l[0] == 'Lib1'
00583 assert 'LINK_LIBRARIES' not in l
00584
00585
00586 def test_subdir_links_update():
00587 if 'GaudiDummy' in cmt2cmake.known_subdirs:
00588 del cmt2cmake.known_subdirs['GaudiDummy']
00589
00590 requirements = '''
00591 package GaudiDummy
00592 version v1r0
00593
00594 apply_pattern install_more_includes more=Dummy
00595
00596 library Dummy *.cpp
00597 apply_pattern linker_library library=Dummy
00598 '''
00599 PackWrap("GaudiDummy", requirements, files={'Dummy':{}})
00600
00601 assert cmt2cmake.known_subdirs['GaudiDummy']['libraries'] == ['Dummy']
00602 assert cmt2cmake.known_subdirs['GaudiDummy']['includes'] == False
00603
00604 def test_subdir_headers():
00605 if 'GaudiDummy' in cmt2cmake.known_subdirs:
00606 del cmt2cmake.known_subdirs['GaudiDummy']
00607
00608 requirements = '''
00609 package GaudiDummy
00610 version v1r0
00611
00612 use JustHeaders v*
00613 use JustHeaders v* Hat
00614
00615 library Dummy *.cpp
00616 apply_pattern linker_library library=Dummy
00617 '''
00618 pkg = PackWrap("GaudiDummy", requirements, files={'Dummy':{}})
00619
00620 cmakelists = pkg.generate()
00621 print cmakelists
00622
00623 calls = getCalls("gaudi_add_library", cmakelists)
00624 assert len(calls) == 1, "gaudi_add_library wrong count %d" % len(calls)
00625
00626 l = calls[0].strip().split()
00627 assert l[0] == 'Dummy'
00628 assert 'INCLUDE_DIRS' in l
00629 links = set(l[l.index('INCLUDE_DIRS')+1:])
00630 assert links == set(['JustHeaders', 'Hat/JustHeaders'])
00631
00632 def test_subdir_headers_update():
00633 if 'GaudiDummy' in cmt2cmake.known_subdirs:
00634 del cmt2cmake.known_subdirs['GaudiDummy']
00635
00636 requirements = '''
00637 package GaudiDummy
00638 version v1r0
00639
00640 apply_pattern install_more_includes more=Dummy
00641 '''
00642 PackWrap("GaudiDummy", requirements, files={'Dummy':{}})
00643
00644 assert cmt2cmake.known_subdirs['GaudiDummy']['includes'] == True
00645 assert not cmt2cmake.known_subdirs['GaudiDummy']['libraries']
00646
00647 def test_write_file():
00648 requirements = '''
00649 package Test
00650 version v1r0
00651
00652 library Lib1 *.cpp
00653 apply_pattern component_library library=Lib1
00654 '''
00655 pkg = PackWrap("Test", requirements, files={})
00656
00657 cmakelists = pkg.generate()
00658 print cmakelists
00659
00660 cmakefile = os.path.join(pkg.path, 'CMakeLists.txt')
00661 pkg.process()
00662 assert os.path.exists(cmakefile)
00663 assert open(cmakefile).read() == cmakelists
00664
00665 def test_write_file_exists():
00666 requirements = '''
00667 package Test
00668 version v1r0
00669
00670 library Lib1 *.cpp
00671 apply_pattern component_library library=Lib1
00672 '''
00673 pkg = PackWrap("Test", requirements, files={'CMakeLists.txt': 'dummy data'})
00674
00675 cmakefile = os.path.join(pkg.path, 'CMakeLists.txt')
00676 pkg.process()
00677
00678 assert open(cmakefile).read() == 'dummy data'
00679
00680
00681 def test_god_1():
00682
00683
00684 requirements = '''
00685 package Test
00686 version v1r0
00687
00688 apply_pattern god_headers files=../xml/*.xml
00689 '''
00690 pkg = PackWrap("Test", requirements, files={})
00691
00692 cmakelists = pkg.generate()
00693 print cmakelists
00694
00695 calls = getCalls("include", cmakelists)
00696 assert calls
00697 l = calls[0].strip()
00698 assert l == 'GaudiObjDesc'
00699
00700 calls = getCalls("god_build_headers", cmakelists)
00701 assert len(calls) == 1, "god_build_headers wrong count %d" % len(calls)
00702
00703 l = calls[0].strip()
00704 assert l == 'xml/*.xml'
00705
00706 def test_god_2():
00707 requirements = '''
00708 package Test
00709 version v1r0
00710
00711 apply_pattern god_dictionary files=../xml/*.xml
00712 '''
00713 pkg = PackWrap("Test", requirements, files={})
00714
00715 cmakelists = pkg.generate()
00716 print cmakelists
00717
00718 calls = getCalls("include", cmakelists)
00719 assert calls
00720 l = calls[0].strip()
00721 assert l == 'GaudiObjDesc'
00722
00723 calls = getCalls("god_build_dictionary", cmakelists)
00724 assert len(calls) == 1, "god_build_dictionary wrong count %d" % len(calls)
00725
00726 l = calls[0].strip()
00727 assert l == 'xml/*.xml'
00728
00729 def test_god_3():
00730 requirements = '''
00731 package Test
00732 version v1r0
00733
00734 use Boost v* LCG_Interfaces
00735
00736 apply_pattern god_headers files=../xml/*.xml
00737 apply_pattern god_dictionary files=../xml/*.xml
00738 '''
00739 pkg = PackWrap("Test", requirements, files={})
00740
00741 cmakelists = pkg.generate()
00742 print cmakelists
00743
00744 calls = getCalls("include", cmakelists)
00745 assert calls
00746 l = calls[0].strip()
00747 assert l == 'GaudiObjDesc'
00748
00749 calls = getCalls("god_build_headers", cmakelists)
00750 assert len(calls) == 1, "god_build_headers wrong count %d" % len(calls)
00751
00752 calls = getCalls("god_build_dictionary", cmakelists)
00753 assert len(calls) == 1, "god_build_dictionary wrong count %d" % len(calls)
00754
00755 l = calls[0].strip().split()
00756 assert l[0] == 'xml/*.xml'
00757 assert 'LINK_LIBRARIES' in l
00758 assert l[l.index('LINK_LIBRARIES')+1] == 'Boost'
00759 assert 'INCLUDE_DIRS' in l
00760 assert l[l.index('INCLUDE_DIRS')+1] == 'Boost'
00761
00762 def test_god_4():
00763 requirements = '''
00764 package Test
00765 version v1r0
00766
00767 use Boost v* LCG_Interfaces
00768
00769 library Lib *.cpp
00770 apply_pattern linker_library library=Lib
00771
00772 apply_pattern god_headers files=../xml/*.xml
00773 apply_pattern god_dictionary files=../xml/*.xml
00774 '''
00775 pkg = PackWrap("Test", requirements, files={})
00776
00777 cmakelists = pkg.generate()
00778 print cmakelists
00779
00780 calls = getCalls("include", cmakelists)
00781 assert calls
00782 l = calls[0].strip()
00783 assert l == 'GaudiObjDesc'
00784
00785 calls = getCalls("god_build_headers", cmakelists)
00786 assert len(calls) == 1, "god_build_headers wrong count %d" % len(calls)
00787
00788 calls = getCalls("gaudi_add_library", cmakelists)
00789 assert len(calls) == 1, "gaudi_add_library wrong count %d" % len(calls)
00790
00791 calls = getCalls("god_build_dictionary", cmakelists)
00792 assert len(calls) == 1, "god_build_dictionary wrong count %d" % len(calls)
00793
00794 l = calls[0].strip().split()
00795 assert l[0] == 'xml/*.xml'
00796 assert 'LINK_LIBRARIES' in l
00797 i = l.index('LINK_LIBRARIES')+1
00798 assert l[i:i+2] == ['Boost', 'Lib']
00799 assert 'INCLUDE_DIRS' in l
00800 assert l[l.index('INCLUDE_DIRS')+1] == 'Boost'
00801
00802 hdr = cmakelists.find('god_build_headers')
00803 lib = cmakelists.find('gaudi_add_library')
00804 dct = cmakelists.find('god_build_dictionary')
00805 assert hdr < lib and lib < dct, "wrong order of calls"
00806
00807 def test_god_5():
00808 requirements = '''
00809 package Test
00810 version v1r0
00811
00812 apply_pattern god_headers files=../xml/*.xml
00813 macro TestObj2Doth_GODflags " -s ../Test/ "
00814 '''
00815 pkg = PackWrap("Test", requirements, files={})
00816
00817 cmakelists = pkg.generate()
00818 print cmakelists
00819
00820 calls = getCalls("include", cmakelists)
00821 assert calls
00822 l = calls[0].strip()
00823 assert l == 'GaudiObjDesc'
00824
00825 calls = getCalls("god_build_headers", cmakelists)
00826 assert len(calls) == 1, "god_build_headers wrong count %d" % len(calls)
00827
00828 l = calls[0].strip().split()
00829 assert l[0] == 'xml/*.xml'
00830 assert 'DESTINATION' in l
00831 assert l[l.index('DESTINATION')+1] == 'Test'
00832
00833 def test_god_6():
00834 requirements = '''
00835 package Test
00836 version v1r0
00837
00838 document customdict TestCustomDict ../dict/TestCustomDict.h
00839
00840 apply_pattern god_dictionary files=../xml/*.xml
00841 '''
00842 pkg = PackWrap("Test", requirements, files={})
00843
00844 cmakelists = pkg.generate()
00845 print cmakelists
00846
00847 calls = getCalls("include", cmakelists)
00848 assert calls
00849 l = calls[0].strip()
00850 assert l == 'GaudiObjDesc'
00851
00852 calls = getCalls("god_build_dictionary", cmakelists)
00853 assert len(calls) == 1, "god_build_dictionary wrong count %d" % len(calls)
00854
00855 l = calls[0].strip().split()
00856 assert l == ['xml/*.xml', 'EXTEND', 'dict/TestCustomDict.h']
00857
00858 def test_reflex():
00859 requirements = '''
00860 package Test
00861 version v1r0
00862
00863 use ROOT v* LCG_Interfaces
00864
00865 apply_pattern reflex_dictionary \\
00866 dictionary=Test \\
00867 headerfiles=$(TESTROOT)/dict/TestDict.h \\
00868 selectionfile=$(TESTROOT)/dict/TestDict.xml
00869
00870 apply_pattern reflex_dictionary \\
00871 dictionary=Test2 \\
00872 headerfiles=$(TESTROOT)/dict/Test2Dict.h \\
00873 selectionfile=$(TESTROOT)/dict/Test2Dict.xml \\
00874 options="-DOPTION"
00875 '''
00876 pkg = PackWrap("Test", requirements, files={})
00877
00878 cmakelists = pkg.generate()
00879 print cmakelists
00880
00881 calls = getCalls("gaudi_add_dictionary", cmakelists)
00882 assert len(calls) == 2, "gaudi_add_dictionary wrong count %d" % len(calls)
00883
00884 l = calls[0].strip().split()
00885 assert l[0:3] == ['Test', 'dict/TestDict.h', 'dict/TestDict.xml']
00886 assert 'LINK_LIBRARIES' in l
00887 assert l[l.index('LINK_LIBRARIES')+1] == 'ROOT'
00888 assert 'INCLUDE_DIRS' in l
00889 assert l[l.index('INCLUDE_DIRS')+1] == 'ROOT'
00890
00891 l = calls[1].strip().split()
00892 assert l[0:3] == ['Test2', 'dict/Test2Dict.h', 'dict/Test2Dict.xml']
00893 assert 'LINK_LIBRARIES' in l
00894 assert l[l.index('LINK_LIBRARIES')+1] == 'ROOT'
00895 assert 'INCLUDE_DIRS' in l
00896 assert l[l.index('INCLUDE_DIRS')+1] == 'ROOT'
00897 assert 'OPTIONS' in l
00898 assert l[l.index('OPTIONS')+1:] == ['"-DOPTION"']
00899
00900
00901 def test_reflex_2():
00902 requirements = '''
00903 package Test
00904 version v1r0
00905
00906 use ROOT v* LCG_Interfaces
00907
00908 library Test *.ccp
00909 apply_pattern component_library library=Test
00910
00911 apply_pattern reflex_dictionary \\
00912 dictionary=Test \\
00913 headerfiles=$(TESTROOT)/dict/TestDict.h \\
00914 selectionfile=$(TESTROOT)/dict/TestDict.xml
00915 '''
00916 pkg = PackWrap("Test", requirements, files={})
00917
00918 cmakelists = pkg.generate()
00919 print cmakelists
00920
00921 calls = getCalls("gaudi_add_module", cmakelists)
00922 assert len(calls) == 1, "gaudi_add_module wrong count %d" % len(calls)
00923
00924 l = calls[0].strip().split()
00925 assert l[0] == 'Test'
00926
00927 calls = getCalls("gaudi_add_dictionary", cmakelists)
00928 assert len(calls) == 1, "gaudi_add_dictionary wrong count %d" % len(calls)
00929
00930 l = calls[0].strip().split()
00931 assert l[0:3] == ['Test', 'dict/TestDict.h', 'dict/TestDict.xml']
00932
00933 def test_reflex_3():
00934 requirements = '''
00935 package Test
00936 version v1r0
00937
00938 use ROOT v* LCG_Interfaces
00939 use COOL v* LCG_Interfaces -no_auto_imports
00940 use CORAL v* LCG_Interfaces -no_auto_imports
00941 use Boost v* LCG_Interfaces -no_auto_imports
00942
00943 library Test *.ccp
00944 apply_pattern component_library library=Test
00945
00946 apply_pattern reflex_dictionary \\
00947 dictionary=Test \\
00948 headerfiles=$(TESTROOT)/dict/TestDict.h \\
00949 selectionfile=$(TESTROOT)/dict/TestDict.xml \\
00950 imports="COOL -import=CORAL -import=Boost"
00951 '''
00952 pkg = PackWrap("Test", requirements, files={})
00953
00954 cmakelists = pkg.generate()
00955 print cmakelists
00956
00957 calls = getCalls("gaudi_add_module", cmakelists)
00958 assert len(calls) == 1, "gaudi_add_module wrong count %d" % len(calls)
00959
00960 l = calls[0].strip().split()
00961 assert l[0] == 'Test'
00962
00963 calls = getCalls("gaudi_add_dictionary", cmakelists)
00964 assert len(calls) == 1, "gaudi_add_dictionary wrong count %d" % len(calls)
00965
00966 l = calls[0].strip().split()
00967 assert l[0:3] == ['Test', 'dict/TestDict.h', 'dict/TestDict.xml']
00968 assert 'INCLUDE_DIRS' in l
00969 i = l.index('INCLUDE_DIRS')
00970 assert 'LINK_LIBRARIES' in l
00971 j = l.index('LINK_LIBRARIES')
00972 assert set(l[i+1:j]) == set(['ROOT', 'COOL', 'CORAL', 'Boost'])
00973 assert set(l[j+1:]) == set(['ROOT', 'COOL', 'CORAL', 'Boost'])
00974
00975 def test_linkopts():
00976 requirements = '''
00977 package Test
00978 version v1r0
00979
00980 use ROOT v* LCG_Interfaces
00981 use Boost v* LCG_Interfaces
00982
00983 macro_append ROOT_linkopts " -lMathCore"
00984 macro_append Boost_linkopts " $(Boost_linkopts_filesystem)"
00985
00986 '''
00987 pkg = PackWrap("Test", requirements, files={})
00988
00989 cmakelists = pkg.generate()
00990 print cmakelists
00991
00992 calls = getCalls("find_package", cmakelists)
00993 assert len(calls) == 2, "find_package wrong count %d" % len(calls)
00994
00995 l = calls[0].strip().split()
00996 assert l == ['Boost', 'COMPONENTS', 'filesystem']
00997
00998 l = calls[1].strip().split()
00999 assert l == ['ROOT', 'COMPONENTS', 'MathCore']
01000
01001 def test_application():
01002 requirements = '''
01003 package Test
01004 version v1r0
01005
01006 application MyApp1 ../src/app1/*.cpp
01007
01008 application MyApp2 -group=tests ../src/app2/*.cpp
01009
01010 application MyApp3 -check ../src/app3/*.cpp
01011
01012 application MyApp4 ../tests/src/app4.cpp
01013
01014 application MyTestApp app5a.cpp app5b.cpp
01015 '''
01016 pkg = PackWrap("Test", requirements, files={})
01017
01018 cmakelists = pkg.generate()
01019 print cmakelists
01020
01021 calls = getCalls("gaudi_add_executable", cmakelists)
01022 assert len(calls) == 5, "gaudi_add_executable wrong count %d" % len(calls)
01023
01024 l = calls[0].strip().split()
01025 assert l[0] == 'MyApp1'
01026 assert l[1:] == ['app1/*.cpp']
01027
01028 l = calls[1].strip().split()
01029 assert l[0] == 'MyApp2'
01030 assert l[1:] == ['app2/*.cpp']
01031
01032 l = calls[2].strip().split()
01033 assert l[0] == 'MyApp3'
01034 assert l[1:] == ['app3/*.cpp']
01035
01036 l = calls[3].strip().split()
01037 assert l[0] == 'MyApp4'
01038 assert l[1:] == ['../tests/src/app4.cpp']
01039
01040 l = calls[4].strip().split()
01041 assert l[0] == 'MyTestApp'
01042 assert l[1:] == ['app5a.cpp', 'app5b.cpp']
01043
01044 calls = getCalls("if", cmakelists)
01045 assert calls == ['BUILD_TESTS'] * 4
01046
01047 def test_pyqt_patterns():
01048 requirements = '''
01049 package Test
01050 version v1r0
01051
01052 use pygraphics v* LCG_Interfaces -no_auto_imports
01053 use Qt v* LCG_Interfaces -no_auto_imports
01054
01055 apply_pattern install_python_modules
01056
01057 apply_pattern PyQtResource qrc_files=../qt_resources/*.qrc outputdir=../python/Test/QtApp
01058 apply_pattern PyQtUIC ui_files=../qt_resources/*.ui outputdir=../python/Test/QtApp
01059 macro_append Test_python_dependencies " PyQtResource PyQtUIC "
01060 '''
01061 pkg = PackWrap("Test", requirements, files={})
01062
01063 cmakelists = pkg.generate()
01064 print cmakelists
01065
01066 calls = getCalls("gen_pyqt_resource", cmakelists)
01067 assert len(calls) == 1, "gen_pyqt_resource wrong count %d" % len(calls)
01068 l = calls[0].strip().split()
01069 assert l == ['Test.QtApp.Resources', 'Test/QtApp', 'qt_resources/*.qrc']
01070
01071 calls = getCalls("gen_pyqt_uic", cmakelists)
01072 assert len(calls) == 1, "gen_pyqt_uic wrong count %d" % len(calls)
01073 l = calls[0].strip().split()
01074 assert l == ['Test.QtApp.UI', 'Test/QtApp', 'qt_resources/*.ui']
01075
01076 from nose.core import main
01077 main()